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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:49:55