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

Win32 GUI添加文本输入窗口后菜单栏无法渲染问题

问题成因

  • 核心原因:窗口过程默认消息处理函数调用错误。你创建的是普通重叠窗口,却在WindowProcedure的default分支使用了仅适用于MDI多文档子窗口的DefMDIChildProcW函数,错误的消息处理会导致窗口非客户区(包含菜单栏)的绘制、客户区尺寸计算逻辑异常,创建子控件后就会出现菜单栏被覆盖消失的问题。
  • 次要逻辑bug:WM_COMMAND消息分支下多个case语句缺少break,会出现逻辑穿透,例如点击Help菜单项会直接触发窗口销毁逻辑,甚至错误触发后续WM_CREATE分支的逻辑。

解决方案

  1. 替换默认窗口过程调用,将WindowProcedure中default分支的代码修改为:
default:
    return DefWindowProcW(hWnd, msg, wp, lp);
  1. 补全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:00:01