如何在C++中将对话框上方的菜单置于对话框下方
实现窗口底部菜单的解决方案
Windows系统默认会将菜单附加到窗口标题栏下方,要实现菜单位于窗口底部,需要放弃系统默认的窗口菜单绑定方式,改为创建独立的菜单栏控件作为子窗口放置在窗口底部,具体实现如下:
修改步骤
- 移除原代码中
SetMenu(hwnd, hMenu);的调用,系统默认菜单无法自定义位置 - 创建菜单栏控件作为主窗口的子窗口,初始放置在窗口底部区域
- 处理
WM_SIZE消息,在窗口大小改变时自动调整菜单栏宽度,使其始终铺满窗口底部 - 保留原有菜单命令处理逻辑
修改后的完整代码
#include <windows.h> #include "resource.h" HWND hMenuBar; // 菜单栏控件句柄 LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_COMMAND: { // 菜单命令处理逻辑,按需添加具体命令 switch (LOWORD(wParam)) { // 示例:处理退出命令 // case ID_FILE_EXIT: // PostQuitMessage(0); // break; } break; } case WM_SIZE: { // 窗口大小变化时,调整菜单栏位置与尺寸 RECT clientRect; GetClientRect(hwnd, &clientRect); int menuHeight = GetSystemMetrics(SM_CYMENU); // 固定在窗口底部,宽度与客户端区域一致 SetWindowPos(hMenuBar, NULL, 0, clientRect.bottom - menuHeight, clientRect.right, menuHeight, SWP_NOZORDER); break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG Msg; memset(&wc,0,sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "窗口注册失败!","错误!",MB_ICONEXCLAMATION|MB_OK); return 0; } hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","标题",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,640,480,NULL,NULL,hInstance,NULL); if(hwnd == NULL) { MessageBox(NULL, "窗口创建失败!","错误!",MB_ICONEXCLAMATION|MB_OK); return 0; } // 加载菜单资源并创建菜单栏控件 HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MAINMENU)); hMenuBar = CreateWindow( "MENUCLASS", // 系统预定义菜单栏控件类名 NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, // 初始位置尺寸由WM_SIZE调整 hwnd, (HMENU)1001, // 自定义控件ID hInstance, NULL ); // 将菜单绑定到菜单栏控件 SetMenu(hMenuBar, hMenu); while (GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }
关键说明
- 使用系统预定义的
MENUCLASS类创建菜单栏控件,这是Windows专门用于放置菜单的子窗口类 - 通过
SetMenu将加载的菜单资源绑定到子窗口,而非主窗口,以此脱离系统默认的菜单布局 - 在
WM_SIZE消息中动态调整菜单栏位置,确保其始终固定在窗口底部 - 编译时保持你原有的
-traditional-cpp -m32 -mwindows参数即可正常编译
内容的提问来源于stack exchange,提问作者Sufferer93
相关产品推荐
相关产品推荐

