繁体   English   中英

Win32 API 窗口的 HMENU

[英]HMENU for a window in Win32 API

编译以下代码时:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

HINSTANCE mainHinst;
HWND mainWindow;

int CALLBACK WinMain(
        HINSTANCE hInst,
        HINSTANCE hPrevInst,
        LPSTR     pCmdLine,
        int       nCmdShow)
{
    mainHinst = hInst;
    LPCSTR className = "Best Window in the entire UNIVERSE.";

    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(wc);
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = mainHinst;
    wc.hIcon = nullptr;
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hbrBackground = nullptr;
    wc.lpszMenuName = nullptr;
    wc.lpszClassName = className;
    wc.hIconSm = nullptr;

    RegisterClassEx( &wc );

    mainWindow = CreateWindowEx(
            0, className,
            "変態",
            WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
            nullptr, (HMENU)-1, mainHinst, nullptr // here
            );

    ShowWindow(mainWindow, SW_SHOW);
    UpdateWindow(mainWindow);

    MSG msg;

    while (GetMessage(&msg, nullptr, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(69);
        break;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

这为MSVCg++编译,但不显示窗口,但在任务管理器中显示为一个进程。 但是如果HMENU设置为nullptrNULL它会编译并在执行时显示一个窗口。

mainWindow = CreateWindowEx(
            0, className,
            "変態",
            WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
            nullptr, nullptr, mainHinst, nullptr // here
            );

👆这在任务栏上的任务管理器 && 图标中显示了一个窗口 && 进程。

那么,有没有办法让窗口将HMENU设置为某个值?

对于WS_CHILD窗口, HMENU参数实际上是控件 ID,可以是任何整数,但对于WS_POPUP / WS_OVERLAPPED则表示实际的菜单句柄。

您没有为这三种样式显式传递一个,因此它是隐式WS_OVERLAPPED ,因为WS_OVERLAPPED == 0 所以你应该传递一个菜单句柄。 就像你从LoadMenuCreateMenu得到的一样。

由于您没有,很可能CreateWindowEx失败,并且您没有窗口。 然而,您的程序位于任务管理器中,因为它会旋转消息循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM