You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用EnableMenuItem禁用菜单Close项未按预期生效是什么原因?

问题原因

  • 核心问题1:你加载菜单资源后未将其与创建的窗口绑定,当前修改的是未关联到窗口的独立菜单对象,修改不会生效
  • 核心问题2:如果你在注册窗口类时已经通过WNDCLASSEX::lpszMenuName指定了IDR_MENU1作为窗口默认菜单,那你额外调用LoadMenu得到的是菜单资源的新副本,修改副本不会影响窗口实际使用的菜单

修正方案

根据你的窗口注册逻辑二选一即可:

方案1:窗口类未指定默认菜单

直接在LoadMenu后新增SetMenu调用,将加载的菜单绑定到窗口,修正后的菜单操作代码如下:

hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_MENU1));
// 新增:将菜单绑定到目标窗口
SetMenu(hWnd, hMenu);
// 获取File子菜单句柄
HMENU hFileMenu = GetSubMenu(hMenu, 0);
if (NULL == hFileMenu)
{
    return -1;
}
// 禁用Close项(索引从0计数,Open为0,Close为1)
if (-1 == EnableMenuItem(hFileMenu, 1, MF_DISABLED | MF_GRAYED | MF_BYPOSITION))
{
    return -1;
}
DrawMenuBar(hWnd);

方案2:窗口类已指定默认菜单

不需要重新加载菜单,直接获取窗口已绑定的菜单进行操作即可:

// 直接获取窗口当前使用的菜单句柄
HMENU hMenu = GetMenu(hWnd);
HMENU hFileMenu = GetSubMenu(hMenu, 0);
if (NULL == hFileMenu)
{
    return -1;
}
// 禁用Close项逻辑同上
if (-1 == EnableMenuItem(hFileMenu, 1, MF_DISABLED | MF_GRAYED | MF_BYPOSITION))
{
    return -1;
}
DrawMenuBar(hWnd);

补充说明

后续用户点击Open菜单成功打开文件后,要启用Close项时,操作同一个关联到窗口的菜单句柄,调用EnableMenuItem(hFileMenu, 1, MF_ENABLED | MF_BYPOSITION)后调用DrawMenuBar(hWnd)刷新即可。

内容的提问来源于stack exchange,提问作者Govind Parmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 23:15:03