gpt4 book ai didi

winapi - 在 Windows 中创建现代风格的动态菜单

转载 作者:行者123 更新时间:2023-12-01 05:29:04 25 4
gpt4 key购买 nike

在我的基于 MFC 对话框的应用程序中,我使用 Visual Studio 资源编辑器创建了主菜单,并且在一个地方有在运行时创建的动态菜单。使用 Visual Studio 创建的菜单的所有部分都具有现代外观,而我动态创建的子菜单具有旧外观,如下图所示。
enter image description here
我创建动态子菜单的代码是这样的(不是真正的代码,但真正的代码并不是那么重要):

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 中(而且可能不能)。

最佳答案

我发现了解决方案,但并不真正了解发生了什么。解决方法是阻止调用 DestroyMenusubMenu的析构函数在函数的末尾。这可以通过调用 subMenu.Detach() 来完成。 , 或制作 subMenu指向 CMenu 的指针.

我不明白为什么是DestroyMenu将新样式菜单转换为旧样式。我希望菜单要么被破坏而不显示,要么被复制到 SetMenuItemInfo 中。所以它的风格得以保留。谁提供了这个答案,谁得到我的投票:)

另外,我想知道我是否通过调用 Detach 来产生资源泄漏。在这里,还是我的动态子菜单与主菜单一起被破坏。积分等待提供答案的人。

关于winapi - 在 Windows 中创建现代风格的动态菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12392677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com