MFC:使用ContextMenuManager跟踪PopupMenu会导致CTreeView项不时保留TVGN_DROPHILITE状态

MFC:使用ContextMenuManager跟踪PopupMenu会导致CTreeView项不时保留TVGN_DROPHILITE状态,mfc,treeview,contextmenu,Mfc,Treeview,Contextmenu,我对CTreeView上下文菜单有一个奇怪的问题。我刚才正在调用pPopup->TrackPopupMenu(),因为它在下面的代码中处于活动状态。没有问题,但不会自动更新状态文本和图标。因此,在互联网上搜索时,我发现MFC功能包中有一个ContextMenuManager(我现在使用的是功能包所基于的BCGControlBar Pro) 我尝试在下面的代码中使用ContextMenuManager(将#if 1更改为0),但在它工作时,我发现有时(很多次)之后所选的树项目不会显示突出显示,它只

我对CTreeView上下文菜单有一个奇怪的问题。我刚才正在调用
pPopup->TrackPopupMenu()
,因为它在下面的代码中处于活动状态。没有问题,但不会自动更新状态文本和图标。因此,在互联网上搜索时,我发现MFC功能包中有一个
ContextMenuManager
(我现在使用的是功能包所基于的BCGControlBar Pro)

我尝试在下面的代码中使用
ContextMenuManager
(将#if 1更改为0),但在它工作时,我发现有时(很多次)之后所选的树项目不会显示突出显示,它只是闪烁并返回到右键单击的项目,就像
TVGN\u DROPHIILITE
仍然打开一样。(我确认,
TVGN\u DROPHILITE
是右键单击通过
OnNMRClick()
函数上的调试打印项选择树项目的功能)。另外,如果我启用了
treeCtrl.SelectDropTarget(NULL)
,它会修复问题,但我不应该这样做

我真的很想使用
ContextMenuManager
,但是这个问题阻碍了展示。有人知道发生了什么事吗

void CMyTreeView::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
    CDebugPrint::DebugPrint(_T("NMRClick: In DropHighlightItem %p\n"), GetTreeCtrl().GetDropHilightItem());

    // Send WM_CONTEXTMENU to self
    SendMessage(WM_CONTEXTMENU, (WPARAM)m_hWnd, GetMessagePos());

    CDebugPrint::DebugPrint(_T("NMRClick: Out DropHighlightItem %p\n"), GetTreeCtrl().GetDropHilightItem());

    *pResult = 0;
}


void CMyTreeView::OnContextMenu(CWnd* pWnd, CPoint ptMousePos)
{
    HTREEITEM htItem;
    CTreeCtrl &treeCtrl=GetTreeCtrl();

    //
    // ...
    //
  
    // the popup is stored in a resource
    CMenu menu;
    menu.LoadMenu(IDR_TREE_CONTEXT_MENU);
    CMenu* pPopup = menu.GetSubMenu(0);

   #if 1
    UINT id=pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RETURNCMD, ptMousePos.x, ptMousePos.y, this);
   #else
    CBCGPContextMenuManager *manager = theApp.GetContextMenuManager();
    UINT id;
    if (manager) {
      id=manager->TrackPopupMenu(pPopup->GetSafeHmenu(), ptMousePos.x, ptMousePos.y, this);
      // treeCtrl.SelectDropTarget(NULL);  // fixes issue
    }
    else id=0;
   #endif
   
   //
   // ...
   //
}

TVGN_DROPHILITE
是一个临时选择,仅在拖放操作期间有效。你怎么搞砸了

如果需要,您应该使用
TVGN\u插入符号

但是,问题是右键单击不会选择单击的项目。如果你喜欢这种行为(我喜欢),你可以自己选择


同样奇怪的是,您
//将WM_CONTEXTMENU发送给self
WM_CONTEXTMENU
应该由系统发送给您,以响应右键单击。

它是由框架或公共控件中的某个对象设置的,因为NMR单击显示某个对象设置了它。即使它工作时也会设置它,是contextmenumanager中的某些东西导致它不能被取消设置,如果我强制它取消设置,它总是工作的(我也可以在代码中拖放一些东西来重置它)。在不捕获NMR单击的情况下,您必须双击要发送的上下文消息的树项。