Win32客户端大小和不正确的大小

Cap*_*ard 0 c++ windows winapi

因此,对于一个游戏项目,我正在创建一个游戏窗口(当然),但是我只知道窗口的客户端大小,而不是实际大小。我知道如何计算大小,但是在测试查看客户区域的大小(应该与输入相同)时,得到的结果不正确。

void NewWindow(width, height)
{
    // Code setting things up here.
        if (!fullscreen) // Convert client size to window size.
        {
            style = WS_OVERLAPPEDWINDOW;

            RECT r = RECT();
            r.top = 0;
            r.bottom = height;
            r.left = 0;
            r.right = width;

            AdjustWindowRect(&r, WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX |     WS_MAXIMIZEBOX, FALSE);

            w = r.right;
            h = r.bottom;
        }

        hWnd = CreateWindow(CLASS_NAME, title, style, CW_USEDEFAULT, CW_USEDEFAULT, w, h, NULL, NULL, GetModuleHandle(NULL), (LPVOID)NULL);
}
Run Code Online (Sandbox Code Playgroud)

获取客户端大小的代码是:

Size Game::GetClientSize()
{
    RECT r = RECT();
    GetClientRect(hWnd, &r);

    return Size(r.right - r.left, r.bottom - r.top);
}
Run Code Online (Sandbox Code Playgroud)

我不确定问题出在哪里,因为AdjustWindowRect似乎输出的值大于我输入的值...

谢谢菲利普

Her*_*bob 6

就是这样; AdjustWindowRect()膨胀矩形以为您指定的边框和标题栏添加空间;在您的情况下,左侧和顶部的值(可能)变为负值,因此右侧和底部不代表宽度和高度。使用 r.right - r.left 和 r.bottom - r.top 计算宽度和高度,就像在第二个示例函数中所做的那样。


Moo*_*oys 5

您传递给的样式AdjustWindowRect应与传递给的样式相同CreateWindow。否则它们将不匹配。您还需要计算宽度为右-左,高度为下-顶,因为调整后的矩形通常相对于客户区域的原点为负。