加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:41:26 所属栏目:Windows 来源:网络整理
导读:在我的基于MFC对话框的应用程序中,我使用Visual Studio资源编辑器创建了主菜单,并且在一个位置有动态菜单,在运行时创建.使用Visual Studio创建的菜单的所有部分都具有现代外观,我动态创建的子菜单具有旧外观,如下图所示. 我创建动态子菜单的代码是这样的(不
在我的基于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中(也可能不是).

解决方法

我发现了解决方案,但并不真正理解发生了什么.解决方案是防止在函数末尾调用subMenu的析构函数上的DestroyMenu.这可以通过调用subMenu.Detach()或使subMenu成为指向CMenu的指针来完成.

我不明白的是为什么DestroyMenu将新风格的菜单变成旧式.我希望菜单被销毁并且不显示,或者在SetMenuItemInfo中复制,因此保留了它的样式.谁提供这个答案得到我的投票:)

此外,我想知道我是否通过在此处调用Detach来产生资源泄漏,或者我的动态子菜单是否随主菜单一起被破坏.积分等待提供答案的人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读