簡體   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