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

