[英]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);
}
這為MSVC
和g++
編譯,但不顯示窗口,但在任務管理器中顯示為一個進程。 但是如果HMENU
設置為nullptr
或NULL
它會編譯並在執行時顯示一個窗口。
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
。 所以你應該傳遞一個菜單句柄。 就像你從LoadMenu
或CreateMenu
得到的一樣。
由於您沒有,很可能CreateWindowEx
失敗,並且您沒有窗口。 然而,您的程序位於任務管理器中,因為它會旋轉消息循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.