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