Почему Windows не дает мне окна того размера, который я просил? - PullRequest
0 голосов
/ 16 июня 2020

enter image description here Я пытаюсь создать окно с размером клиента, равным разрешению дисплея (1366 x 768).

Для этого я использую AdjustWindowRectEx чтобы получить расчетную ширину и высоту создаваемого окна.

Первый красный кружок в правом верхнем углу - это фактическое разрешение экрана, которое я хочу, чтобы клиентский размер окна имел.

Второй красный кружок - это ширина и высота, которые AdjustWindowRectEx рассчитал для создаваемого окна (размер клиента + границы и строка заголовка).

Последний красный кружок внизу - это фактический размер клиента, который я получил после того, как окно было создано.

Высота - это не то, что я прошу Windows дать мне. Я спросил 768 и получил 749.

Есть ли ограничение по высоте, с которым можно создать окно? Сколько бы я ни просил рост, он никогда не дает мне больше 749.

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

В CreateWindow (), WM_GETMINMAXINFO информация будет отправлена ​​для подтверждения того, что размер текущей формы может быть сгенерирован, вы можете обратиться к MINMAXINFO, чтобы просмотреть его особенности c структура. Если размер созданной формы больше, чем значение по умолчанию, он будет заменен размером по умолчанию. Таким образом, он будет меньше размера, который вы установили при его создании.

Согласно WM_GETMINMAXINFO: приложение может переопределить значения по умолчанию, установив члены MINMAXINFO и возвращает ноль, если приложение обрабатывает это сообщение.

Вот пример:

 #include <Windows.h>
    LRESULT CALLBACK WndProc(HWND, UINT,WPARAM,LPARAM);
    
    static int max_right, max_bottom;
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
        static TCHAR szAppName[] = TEXT("hello windows");
        HWND hwnd = 0;
        MSG msg;
        WNDCLASS wndclass;
        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc; 
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = szAppName;
        if (!RegisterClass(&wndclass))
        { 
            MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
        }
        DEVMODEW display_mode;
        if (EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &display_mode))
        {
            DWORD window_style = WS_CAPTION | WS_MINIMIZE | WS_SYSMENU | WS_VISIBLE;
            RECT window_rect;
            window_rect.right = display_mode.dmPelsWidth;
            window_rect.bottom = display_mode.dmPelsHeight;
            window_rect.left = window_rect.top = 0;
    
            AdjustWindowRectEx(&window_rect, window_style, FALSE, 0);
            max_right = window_rect.right - window_rect.left;
            max_bottom = window_rect.bottom - window_rect.top;
            HWND window_handle = CreateWindowEx(0, wndclass.lpszClassName,
                TEXT("the hello program"),
                window_style,
                CW_USEDEFAULT, CW_USEDEFAULT,
                max_right,
                max_bottom,
                NULL, NULL, hInstance, NULL);
                
            ShowWindow(window_handle, iCmdShow);
            UpdateWindow(window_handle);
    
            if (window_handle)
            {
                RECT client_rect;
                GetClientRect(window_handle, &client_rect);
            }
        }
    
        while (GetMessageW(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        switch (message)
        {
        case WM_CREATE:
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &rect);
            EndPaint(hwnd, &ps);
            return 0;
        case WM_GETMINMAXINFO:
            ((MINMAXINFO*)lParam)->ptMaxSize = { max_right,max_bottom };
            ((MINMAXINFO*)lParam)->ptMaxTrackSize = { max_right,max_bottom };
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
0 голосов
/ 18 июня 2020

Используйте функцию GetSystemMetrics(...). Эта функция вычисляет размер (разрешение) экрана.

Для координат X и Y см. Мой пример для установки переменных (используйте в CreateWindowEx, где установите ширину и высоту окна.) Пример:

int x = GetSystemMetrics(SM_CXSCREEN);
int y = GetSystemMetrics(SM_CYSCREEN);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...