在我的基于MFC对话框的应用程序中,我使用Visual Studio资源编辑器创建了主菜单,并且在一个位置有动态菜单,在运行时创建。使用Visual Studio创建的菜单的所有部分都具有现代外观,我动态创建的子菜单具有旧外观,如下图所示。
我创建动态子菜单的代码是这样的(不是真正的代码,但真正的代码并不是那么重要):
CMenu subMenu;
subMenu.CreateMenu();
for (...)
{
subMenu.AppendMenu(
MF_STRING | (isChecked ? MF_CHECKED : MF_UNCHECKED),
<some menu ID>,
<some menu text>);
}
将此子菜单插入到它所属的位置就像这样(几乎是实际的代码):
TCHAR szMenuString[256];
MENUITEMINFO mii;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS |
MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
mii.dwTypeData = szMenuString;
mii.cch = sizeof(szMenuString) / sizeof(szMenuString[0]);
GetMenu()->GetMenuItemInfo(ID_SUBMENU, &mii);
mii.fMask |= MIIM_SUBMENU;
mii.hSubMenu = subMenu.GetSafeHmenu();
GetMenu()->SetMenuItemInfo(ID_SUBMENU, &mii);
如何创建子菜单,使其在样式上与主菜单的其他部分相同?
我的代码是用MFC编写的,但你的答案不一定是在MFC中(也可能不是)。
答案 0 :(得分:1)
我发现了解决方案,但并不真正理解发生了什么。解决方案是防止在函数结束时在DestroyMenu
的析构函数上调用subMenu
。这可以通过调用subMenu.Detach()
或将subMenu
指向CMenu
来完成。
我不明白为什么DestroyMenu
将新风格菜单改为旧风格。我希望菜单要么被销毁,要么不显示,要么被复制到SetMenuItemInfo
中,因此保留了它的样式。无论谁提供这个答案都得到我的投票:)
此外,我想知道我是否通过在此处调用Detach
来产生资源泄漏,或者我的动态子菜单是否与主菜单一起销毁。积分等待提供答案的人。