簡體   English   中英

WINAPI CreateWindow顯示奇怪的結果

[英]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 ,您將看到topleft均為負數。

默認的窗口行為是窗口高度偏離某些像素。 默認情況下,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM