调用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
相关产品推荐
相关产品推荐

