Win32 GUI添加文本输入窗口后菜单栏无法渲染问题
问题成因
- 核心原因:窗口过程默认消息处理函数调用错误。你创建的是普通重叠窗口,却在
WindowProcedure的default分支使用了仅适用于MDI多文档子窗口的DefMDIChildProcW函数,错误的消息处理会导致窗口非客户区(包含菜单栏)的绘制、客户区尺寸计算逻辑异常,创建子控件后就会出现菜单栏被覆盖消失的问题。 - 次要逻辑bug:
WM_COMMAND消息分支下多个case语句缺少break,会出现逻辑穿透,例如点击Help菜单项会直接触发窗口销毁逻辑,甚至错误触发后续WM_CREATE分支的逻辑。
解决方案
- 替换默认窗口过程调用,将
WindowProcedure中default分支的代码修改为:
default: return DefWindowProcW(hWnd, msg, wp, lp);
- 补全
WM_COMMAND分支的break语句,修复逻辑穿透:
case WM_COMMAND: // 所有按钮、菜单项点击触发该消息 switch (wp) // 定义主窗口按钮点击后的响应逻辑 { case HELP_POPUP_ID: MessageBeep(MB_DEFBUTTON2); break; // 新增break case FILE_MENU_EXIT: DestroyWindow(hWnd); break; // 新增break case LOAD_DROPDOWN_ID: MessageBeep(MB_ICONINFORMATION); break; case CHANGE_TITLE: break; } break; // 给WM_COMMAND的case也加break,避免穿透到WM_CREATE的逻辑
修改后重新编译运行,菜单栏即可正常显示,菜单项点击逻辑也会正常工作。
内容的提问来源于stack exchange,提问作者Mark Musil
相关产品推荐
相关产品推荐

