Я работаю над некоторыми элементами интерфейса 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?
Так что это исключает полосу в верхней части окна?
Да. (плюс 10 символов)
Этот вопрос задавали (и отвечали) много раз. Пожалуйста, проведите небольшое исследование.
Согласно документации 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.
Вы ожидаете, что значения дадут вам измерения все окно, но это даст вам измерения только клиентская зона.
Используйте 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);
Они не выключены.
WM_SIZE
дает вам размер клиентской области, а не окна.