[英]WINAPI CreateWindow Displaying Strange Results
我在WINAPI項目上遇到麻煩。 有兩個問題,當我使用以下代碼啟動窗口時,height參數的行為異常。 它似乎達到了1092,比我在計算機上需要的位置低18像素。 第二個問題是窗口沒有邊緣,也沒有頂部菜單欄,直到我使用Windows + Up / Down組合鍵最小化和最大化它,然后它才能正常工作。 我正在使用以下代碼初始化窗口(這是初始化options.pxXRes和下面使用的其他變量之前運行的唯一代碼):
//Set up the window class
WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = &WndHandleInput;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = GetModuleHandle(nullptr);
wndClass.hIcon = nullptr;
wndClass.hCursor = LoadCursor(nullptr, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
wndClass.lpszMenuName = nullptr;
wndClass.lpszClassName = "ToastCatClass";
wndClass.hIconSm = nullptr;
RegisterClassEx(&wndClass);
RECT wndRect;
if (options.fullscreen) {
wndRect.left = 0;
wndRect.right = options.pxXRes;
wndRect.top = 0;
wndRect.bottom = options.pxYRes;
AdjustWindowRect(&wndRect, WS_OVERLAPPEDWINDOW, false);
} else {
wndRect.left = (GetPXXRes() - options.pxXRes) / 2;
wndRect.right = options.pxXRes;
wndRect.top = (GetPXYRes() - options.pxYRes) / 2;
wndRect.bottom = options.pxYRes;
AdjustWindowRect(&wndRect, WS_OVERLAPPEDWINDOW, false);
}
hWnd = CreateWindowEx(
0,
wndClass.lpszClassName,
"ToastCat",
WS_OVERLAPPEDWINDOW,
wndRect.left,
wndRect.top,
wndRect.right - wndRect.left,
wndRect.bottom - wndRect.top,
nullptr,
nullptr,
wndClass.hInstance,
nullptr
);
assert(hWnd != nullptr, "Failure to launch window.");
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
窗口過程如下:
LRESULT __stdcall WndHandleInput(HWND hWndParam, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_NCCREATE:
return true;
case WM_KEYDOWN:
switch (wParam) {
//TODO: Update controls
}
break;
case WM_KEYUP:
switch (wParam) {
//TODO: Update controls
}
break;
case WM_CLOSE:
case WM_QUIT:
Cleanup();
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
Windows有兩個不同的矩形:
通過調用AdjustWindowRect
您正在將客戶端矩形轉換為窗口矩形。 因此,如果要設置與整個屏幕一樣大的客戶矩形,將其轉換為窗口矩形並創建具有此大小的窗口,則邊框和菜單將不可見。 如果在使用調試器調用AdjustWindowRect(..)
之后查看wndRect
,您將看到top
和left
均為負數。
默認的窗口行為是窗口高度偏離某些像素。 默認情況下,Windows不允許窗口的高度大於屏幕高度,因為這會將標題移出鼠標可以到達的區域。 要更改此設置,您必須處理消息WM_GETMINMAXINFO
:
case WM_GETMINMAXINFO:
DefWindowProc(hWnd, msg, wParam, lParam);
MINMAXINFO *pmmi = (MINMAXINFO*)lParam;
pmmi->ptMaxTrackSize.x *= 2; // just make it bigger...
pmmi->ptMaxTrackSize.y *= 2; //
return 0;
如果您只是想以最大化的狀態(在所有控件和邊框都可見的情況下)或在某些其他定義的位置啟動窗口,請執行以下操作:通常在if (options.fullscreen)
和else部分中初始化wndRect
創建窗口if (options.fullscreen)
更改對ShowWindow(..)
的調用,如下所示:
if (options.fullscreen)
{
ShowWindow(hWnd, SW_MAXIMIZE);
}
else
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
}
UpdateWindow(hWnd);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.