我有一个
CTreeView
,菜单上的某些命令作用于所选项目。
当右键单击并获取上下文菜单时,您可以获取
HITEM
并将其保存到成员变量中,以便知道当用户从菜单中选择选项时要对哪一项进行操作。
注意:我正在使用
BCGControlBar Pro
内置上下文菜单支持:
GetContextMenuManager()->AddMenu(_T("My menu"), IDR_CONTEXT_MENU);
// ...
theApp.ShowPopupMenu(menuid, point, this);
但是,当您还希望主菜单对所选项目进行操作时,您需要知道如何获取所选项目
HITEM
。
菜单关闭后,我无法将上下文菜单成员变量设置为 NULL,因为运行命令的处理程序时它可能为 null。
当您想为上下文菜单和主菜单保留相同的命令 ID 时,在 MFC/Win32 中通常如何处理?
蒂亚!!
根据评论和我所看到的,答案是你不能。 相反,您必须执行以下操作之一:
选项 1)当右键单击时,更改 TreeView 选择,以便
OnCommandXXX()
函数使用选定的树项目。
选项2)在显示上下文菜单之前跟踪成员变量中的
HTREEITEM
,使用CContextMenuManager::TrackPopupMenu()
代替CContextMenuManager::ShowPopupMenu()
,使用返回值查找菜单项,SendMessage()
命令,使用成员变量要确定 HTREEITEM
(如果不是 NULL
,否则是选定的树项),在退出处理上下文菜单并发送命令的函数之前,将成员变量重置为 NULL
。
我用过3种方法,效果很好;最好的选择取决于您的情况:
上下文菜单不必使用与主菜单相同的菜单 - 您可以为其使用不同的菜单,该菜单使用不同的命令代码(即使它基本上是一个副本,并且看起来与主菜单相同)用户)。这样,您就知道触发了两者中的哪一个。
CMyDoc和CMyView中的消息映射中使用相同的命令代码,并且所有主菜单触发器都将通过CMyDoc,所有上下文菜单触发器将通过CMyView(因为这是上下文的父窗口)菜单)。然后,两个不同的消息映射条目可以将参数传递给相同的实际命令处理程序,或者可以调用两个不同的命令处理程序。