Сообщение Win32 WM_SIZE дает неправильные размеры

Я работаю над некоторыми элементами интерфейса OpenGL и заметил, что при запуске моего приложения сообщение WM_SIZE отправляется с шириной = 1260 и высотой = 677, хотя я создал окно с шириной = 1280 и высотой = 720.

Вот как я создаю окно:

MainWindow.handle = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, windowClass.lpszClassName,
        "Some window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 1280, 720, 
        NULL, NULL, instance, NULL);

Вот как я обрабатываю WM_SIZE:

case WM_SIZE: {
    Camera.width = LOWORD(lParam);
    Camera.height = HIWORD(lParam);
    MainWindow.width = LOWORD(lParam);
    MainWindow.height = HIWORD(lParam);
    glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
} break;

Я подозреваю, что эти значения (1260, 677) неверны, а не фактические размеры окна, так как мои интерфейсные «хитбоксы» немного смещены. Если я изменяю размер окна вручную, независимо от того, насколько сильно, отправляется правильный WM_SIZE, и хитбоксы в порядке.

Мой вопрос: почему этот первый WM_SIZE вообще отправляется и почему эти значения немного отличаются? Могу ли я прислать дополнительное руководство WM_SIZE для борьбы с первоначальным WM_SIZE?

Они не выключены. WM_SIZE дает вам размер клиентской области, а не окна.

tkausl 19.03.2022 16:08

Так что это исключает полосу в верхней части окна?

TopTofu 19.03.2022 16:10

Да. (плюс 10 символов)

tkausl 19.03.2022 16:14

Этот вопрос задавали (и отвечали) много раз. Пожалуйста, проведите небольшое исследование.

IInspectable 19.03.2022 17:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации WM_SIZE:

lParam

The low-order word of lParam specifies the new width of the client area.

The high-order word of lParam specifies the new height of the client area.

Вы ожидаете, что значения дадут вам измерения все окно, но это даст вам измерения только клиентская зона.

Image

Используйте GetWindowRect(), чтобы получить положение и размеры всего окна.

В противном случае, если вы хотите, чтобы клиентская зона имел определенный размер, используйте AdjustWindowRect() или AdjustWindowRectEx() для вычисления необходимого размера окно перед вызовом CreateWindowEx(), например:

RECT r;
r.left = 0;
r.top = 0;
r.right = 1280;
r.bottom = 720;
AdjustWindowRectEx(&r, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_OVERLAPPEDWINDOW);

MainWindow.handle = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, windowClass.lpszClassName,
        "Some window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, r.right-r.left, r.bottom-r.top, 
        NULL, NULL, instance, NULL);

Другие вопросы по теме