如何确定命令 ID 是来自 CTreeView 的上下文菜单还是主菜单?

问题描述 投票:0回答:2

我有一个

CTreeView
,菜单上的某些命令作用于所选项目。

当右键单击并获取上下文菜单时,您可以获取

HITEM
并将其保存到成员变量中,以便知道当用户从菜单中选择选项时要对哪一项进行操作。

注意:我正在使用

BCGControlBar Pro
内置上下文菜单支持:

GetContextMenuManager()->AddMenu(_T("My menu"), IDR_CONTEXT_MENU);
// ...
theApp.ShowPopupMenu(menuid, point, this);

但是,当您还希望主菜单对所选项目进行操作时,您需要知道如何获取所选项目

HITEM

菜单关闭后,我无法将上下文菜单成员变量设置为 NULL,因为运行命令的处理程序时它可能为 null。

当您想为上下文菜单和主菜单保留相同的命令 ID 时,在 MFC/Win32 中通常如何处理?

蒂亚!!

winapi mfc contextmenu
2个回答
1
投票

根据评论和我所看到的,答案是你不能。 相反,您必须执行以下操作之一:

选项 1)当右键单击时,更改 TreeView 选择,以便

OnCommandXXX()
函数使用选定的树项目。

选项2)在显示上下文菜单之前跟踪成员变量中的

HTREEITEM
,使用
CContextMenuManager::TrackPopupMenu()
代替
CContextMenuManager::ShowPopupMenu()
,使用返回值查找菜单项,
SendMessage()
命令,使用成员变量要确定
HTREEITEM
(如果不是
NULL
,否则是选定的树项),在退出处理上下文菜单并发送命令的函数之前,将成员变量重置为
NULL


0
投票

我用过3种方法,效果很好;最好的选择取决于您的情况:

  1. 上下文菜单不必使用与主菜单相同的菜单 - 您可以为其使用不同的菜单,该菜单使用不同的命令代码(即使它基本上是一个副本,并且看起来与主菜单相同)用户)。这样,您就知道触发了两者中的哪一个。

  2. 或者,当调用 ON_CONTEXT_MENU 处理程序时,它具有请求的坐标,您可以将这些坐标保存在 CMyView 类变量中,并使用它们来识别单击了哪个节点或对象,和/或使用它们来区分您的命令代码行为(在命令处理程序内,检查保存的坐标是否有效 - 您需要将它们重置为 -1、-1,例如在 ON_MOUSE_MOVE 中)

  3. 您可以在

    CMyDoc和CMyView中的消息映射中使用相同的命令代码,并且所有主菜单触发器都将通过CMyDoc,所有上下文菜单触发器将通过CMyView(因为这是上下文的父窗口)菜单)。然后,两个不同的消息映射条目可以将参数传递给相同的实际命令处理程序,或者可以调用两个不同的命令处理程序。

  4. 请注意,这三个解决方案都不需要您更改选择。

© www.soinside.com 2019 - 2024. All rights reserved.