婆娑梵净山 2024-05-30 14:33 采纳率: 89.5%
浏览 10
已结题

Windows API子窗口菜单栏创建并添加的疑问和BUG

假设我现在创建了两个子窗口和一个父窗口,我为父窗口添加了一个菜单栏,HMENU(IDR_MENU1),
但是我的子窗口现在也需要给自己定义一个属于自己的菜单栏(HMENU)(IDR_MENU2);
网上有叫我给子窗口也定义一个窗口处理函数,但是没有任何实际的用处,不知道各位网友有什么指导的。

#include<windows.h>
#include <tchar.h>
#include<stdio.h>
HINSTANCE hinst;
#include "IU.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK MainWinProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    HWND hwnd;
    MSG msg;
    BOOL fGotMessage;
    hinst = hInstance;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = MainWinProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_CROSS);
    wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wcex.lpszMenuName = (char*)IDC_IU;
    wcex.lpszClassName = "MainWClass";
    wcex.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), LR_DEFAULTCOLOR);

    WNDCLASSEX wce;
    wce.cbSize = sizeof(WNDCLASSEX);
    wce.style = CS_HREDRAW | CS_VREDRAW;
    wce.lpfnWndProc = DefWindowProc;
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hInstance = hInstance;
    wce.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wce.hCursor = LoadCursor(NULL, IDC_CROSS);
    wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wce.lpszMenuName = NULL;
    wce.lpszClassName = "Child";
    wce.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), LR_DEFAULTCOLOR);

    if (!RegisterClassEx(&wcex))
    {
        return 1;
    }
    if (!RegisterClassEx(&wce))
    {
        return 1;
    }

    hwnd = CreateWindow("MainWClass", "window", WS_OVERLAPPEDWINDOW, 0, 0, 1000, 1000, NULL, NULL, hInstance, NULL);
    HWND C1 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 100, 20, 30, 70, hwnd, NULL, hInstance, NULL);
    HWND C2 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 400, 20, 30, 70, hwnd, NULL, hInstance, NULL);
    HWND C13 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 600, 20, 30, 70, hwnd, NULL, hInstance, NULL);

    if (!hwnd)
    {
        return 1;
    }
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while ((fGotMessage = GetMessage(&msg, NULL, 0, 0)) != 0 && fGotMessage != -1)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}
MSG unse;

LRESULT CALLBACK MainWinProc(HWND  hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_SYSCOMMAND:
        if (wParam == SC_CLOSE)
        {
            int nRet = MessageBox(hwnd, "是否关闭", "infe", MB_YESNO);
            if (nRet == IDYES)
            {
                DestroyWindow(hwnd);
            }
            else
            {
                return 0;
            }

            break;


    
        }
    
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);

        return 0;
        }

}


  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-05-30 14:33
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Windows API中,子窗口通常不拥有自己的菜单栏,而是共享父窗口的菜单栏。不过,如果你确实需要为子窗口创建一个独立的菜单栏,你需要做一些额外的工作。以下是一些步骤和代码示例,帮助你实现这一功能:

    1. 为父窗口添加菜单栏: 在父窗口的窗口过程函数中处理WM_CREATE消息,并使用LoadMenu函数加载菜单资源。

    2. 为子窗口创建菜单栏: 你需要为子窗口定义一个窗口过程函数,并在该函数中处理与菜单相关的Windows消息。

    3. 子窗口窗口过程函数: 子窗口的窗口过程函数需要处理WM_CREATE消息来加载菜单,以及WM_COMMAND消息来响应菜单项的点击事件。

    以下是修改后的代码示例,展示了如何为子窗口添加一个菜单栏:

    // 子窗口的窗口过程函数
    LRESULT CALLBACK ChildWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
        switch (message) {
        case WM_CREATE:
            {
                // 加载子窗口的菜单资源
                HMENU hMenu = LoadMenu(hinst, MAKEINTRESOURCE(IDR_MENU2));
                SetMenu(hwnd, hMenu);
            }
            break;
        case WM_COMMAND:
            // 处理菜单项的点击事件
            int wmId = LOWORD(wParam);
            // 根据wmId的值来执行相应的操作
            // ...
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // WinMain函数中的相关代码
    HWND C1 = CreateWindow("Child", "c1", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
                            100, 20, 30, 70, hwnd, (HMENU)IDR_MENU2, hInstance, NULL);
    HWND C2 = CreateWindow("Child", "c2", WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
                            400, 20, 30, 70, hwnd, (HMENU)IDR_MENU2, hInstance, NULL);
    // ...
    
    // 注册子窗口类
    wce.lpfnWndProc = ChildWinProc;
    

    请注意,CreateWindow函数的最后一个参数是HMENU类型,用于指定子窗口的菜单。在这个例子中,我们使用MAKEINTRESOURCE宏将菜单资源ID转换为HMENU类型。

    参考资料

    这些资源可以帮助你更深入地了解如何在Windows API中创建和使用菜单,以及如何在子窗口中实现菜单栏。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 已采纳回答 6月2日
  • 创建了问题 5月30日