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);