Win32 WM_SIZE 消息给出了错误的尺寸
Win32 WM_SIZE message gives wrong dimensions
我正在研究一些 OpenGL 界面的东西,并注意到当我启动我的应用程序时,WM_SIZE 消息以宽度 = 1260 和高度 = 677 发送,即使我创建了 window宽度=1280 和高度=720。
以下是我创建 window 的方法:
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) 是错误的,而不是实际的 window 尺寸,因为我的界面 'hitboxes' 略有偏差。如果我手动调整 window 的大小,无论调整多少,都会发送正确的 WM_SIZE 并且命中框很好。
我的问题是为什么第一个 WM_SIZE 甚至发送了,为什么这些值略有偏差?我可以发送额外的手册 WM_SIZE 来对抗最初的 WM_SIZE 吗?
根据 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.
您希望这些值能够为您提供 整个 window 的尺寸,但它只为您提供 客户区的尺寸.
使用GetWindowRect()
得到整个window的位置和尺寸。
否则,如果你想要客户区是一个特定的大小,使用AdjustWindowRect()
or AdjustWindowRectEx()
来计算必要的window调用前的大小CreateWindowEx()
,eg:
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);
我正在研究一些 OpenGL 界面的东西,并注意到当我启动我的应用程序时,WM_SIZE 消息以宽度 = 1260 和高度 = 677 发送,即使我创建了 window宽度=1280 和高度=720。
以下是我创建 window 的方法:
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) 是错误的,而不是实际的 window 尺寸,因为我的界面 'hitboxes' 略有偏差。如果我手动调整 window 的大小,无论调整多少,都会发送正确的 WM_SIZE 并且命中框很好。
我的问题是为什么第一个 WM_SIZE 甚至发送了,为什么这些值略有偏差?我可以发送额外的手册 WM_SIZE 来对抗最初的 WM_SIZE 吗?
根据 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.
您希望这些值能够为您提供 整个 window 的尺寸,但它只为您提供 客户区的尺寸.
使用GetWindowRect()
得到整个window的位置和尺寸。
否则,如果你想要客户区是一个特定的大小,使用AdjustWindowRect()
or AdjustWindowRectEx()
来计算必要的window调用前的大小CreateWindowEx()
,eg:
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);