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

Win32开发添加菜单栏后窗口调整大小及崩溃问题排查

问题原因及修复方案

1 直接崩溃的核心原因

你在调用GetMenuBarInfo时使用了未初始化的指针:

PMENUBARINFO pmbi; // 这里是指针类型,未分配内存、未初始化
GetMenuBarInfo(hWnd, OBJID_MENU, 0, pmbi); // 传入非法指针触发内存访问违规,直接崩溃

Windows API中所有带cbSize成员的结构,都需要先声明结构实例、初始化cbSize再传地址调用,正确写法如下:

MENUBARINFO mbi = {0};
mbi.cbSize = sizeof(MENUBARINFO);
if (!GetMenuBarInfo(hWnd, OBJID_MENU, 0, &mbi)) {
    // 调用失败的容错处理
    break;
}

2 尺寸计算逻辑优化

你当前的高度计算逻辑存在逻辑错误:直接将菜单高度与原窗口总高度相加,会导致最终窗口高度超出预期,相当于重复叠加了原窗口的非客户区高度。
更简单可靠的方案是使用系统提供的AdjustWindowRectAPI,直接根据你需要的客户区尺寸,自动计算包含菜单栏、标题栏、边框的完整窗口尺寸,不需要手动计算菜单栏高度:

// 你预设的客户区尺寸为500x400
RECT clientRect = {0, 0, width, height};
// 第三个参数TRUE表示窗口包含菜单,系统会自动计入菜单栏高度
AdjustWindowRect(&clientRect, GetWindowLongPtr(hWnd, GWL_STYLE), TRUE);
// 调整窗口尺寸
SetWindowPos(hWnd,
             NULL,
             0,
             0,
             clientRect.right - clientRect.left,
             clientRect.bottom - clientRect.top,
             SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER);

3 其他可选优化点

你代码中AppendMenu传入的字符串没有套TEXT宏,如果项目开启Unicode编译会出现菜单文字乱码,建议修改为:

AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR) hFile, TEXT("File"));
AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR) hHelp, TEXT("Help"));

内容的提问来源于stack exchange,提问作者The Rizzler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 23:57:00