我正在尝试获取一个子菜单,以便在显示之前对其进行更改。
所以我OnInitMenu()
为我的窗口创建了一个处理程序。而我本来打算用来pMenu->GetMenuItemInfo()
获取子菜单的。
但是,这似乎不会奏效。为了找到我想要的菜单,我必须提供菜单命令 ID(我不认为硬编码项目位置令人满意)。但是打开子菜单的菜单项没有命令 ID。我可以获得该子菜单中存在的菜单命令,但是我仍然没有菜单本身。
如何找到嵌套在主菜单中的子菜单,而不依赖MF_BYPOSITION
?
我对同样问题的解决方案是创建一个辅助函数来搜索菜单并根据菜单名称返回位置。
int CEnviroView::FindMenuItem(CMenu* Menu, LPCTSTR MenuName) {
int count = Menu->GetMenuItemCount();
for (int i = 0; i < count; i++) {
CString str;
if (Menu->GetMenuString(i, str, MF_BYPOSITION) &&
str.Compare(MenuName) == 0)
return i;
}
return -1;
}
答案似乎是你不能。使用命令 ID 定位菜单命令非常有意义,因为这样的代码将在您重新排列菜单项时继续工作。但是,作为子菜单的菜单项根本没有命令 ID。
一种方法是使用已知的菜单命令,您可以按 ID 搜索该命令,然后在该命令旁边插入新项目。但是,您仍然需要包含菜单。
我最终使用的方法是研究 MFC 用来填充“文件”菜单中最近使用的文件列表的代码。通用技术在Microsoft Systems Journal 的 Paul DiLascia 的 Q & A 专栏中有所描述。
使用允许您更新菜单项的 MFC 命令路由会更简单吗?如果这是 MDI/SDI 应用程序,您可以免费获得它,否则您将不得不实施更新机制。
不要处理WM_INITMENU
。你应该处理WM_INITMENUPOPUP
。WM_INITMENUPOPUP
提供指向即将弹出的菜单的指针。
在处理程序中,您可以编写一个代码,允许对话框使用所有菜单的 UI 更新机制更新特定菜单项,或者您可以只处理您必须在处理程序中更改的特定菜单项的更改。
您可以使用GetSubMenu
类中的方法CMenu
。
http://msdn.microsoft.com/en-us/library/dtfc356x(v=vs.80).aspx