如何在MFC中获取子菜单?

时间:2012-04-28 16:35:52

标签: windows winapi mfc

我正在尝试获取子菜单,以便在显示之前对其进行更改。

所以我为我的窗口创建了一个OnInitMenu()处理程序。我曾计划使用pMenu->GetMenuItemInfo()来获取子菜单。

但是,它似乎不起作用。为了找到我想要的菜单,我必须提供菜单命令ID(我不认为它对硬代码项位置是满意的)。但是打开子菜单的菜单项没有命令ID。我可以获得该子菜单中存在的菜单命令,但是我仍然没有菜单本身。

如何在不依赖MF_BYPOSITION的情况下找到嵌套在主菜单中的子菜单?

4 个答案:

答案 0 :(得分:4)

我对同一问题的解决方案是创建一个辅助函数来搜索菜单并根据菜单名称返回位置。

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;
}

答案 1 :(得分:2)

看来答案是,你不能。使用命令ID来定位菜单命令非常有意义,因为在重新排列菜单项时这些代码将继续有效。但是,作为子菜单的菜单项根本没有命令ID。

一种方法是使用已知的菜单命令,您可以按ID搜索,然后在该命令旁边插入新项目。但是,您仍然需要包含菜单。

我最终使用的方法来自于研究MFC用于填充“文件”菜单中最近使用的文件列表的代码。一般技术在有点过时Paul DiLascia's Q & A column from Microsoft Systems Journal中描述。

答案 2 :(得分:1)

您可以使用类CMenu中的GetSubMenu方法。

http://msdn.microsoft.com/en-us/library/dtfc356x(v=vs.80).aspx

答案 3 :(得分:1)

使用允许您更新菜单项的MFC命令路由会更简单吗? 如果这是MDI / SDI应用程序,您可以免费使用它,否则您将不得不实施更新机制。

不要处理WM_INITMENU。你应该处理WM_INITMENUPOPUP。 WM_INITMENUPOPUP传递指向即将弹出的菜单的指针。

在处理程序中,您可以编写一个代码,允许对话框使用所有菜单的UI更新机制更新特定菜单项,或者您只能更改您必须在处理程序中更改的特定菜单项。