Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32客户端大小和不正确的大小_C++_Windows_Winapi - Fatal编程技术网

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

C++ Win32客户端大小和不正确的大小,c++,windows,winapi,C++,Windows,Winapi,因此,对于一个游戏项目,我创建了一个游戏窗口(当然),但我只知道窗口的客户端大小,而不知道实际大小。我知道如何计算大小,但当我测试以查看客户端区域的大小(应与输入相同)时,得到的结果不正确 获取客户端大小的代码是: Size Game::GetClientSize() { RECT r = RECT(); GetClientRect(hWnd, &r); return Size(r.right - r.left, r.bottom - r.top); } 我不

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

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

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

    return Size(r.right - r.left, r.bottom - r.top);
}
我不确定问题出在哪里,因为AdjustWindowRect输出的值似乎大于我输入的值

谢谢,
菲利普

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

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

“窗口矩形是完全包围窗口的最小矩形,包括客户区和非客户区。”除了已经给出的答案外,请注意,以前的
AdjustWindowRect
有许多错误,例如,带有菜单行的窗口的结果不正确。而且Windows中的bug有持续存在的趋势。它们成为向后兼容性的一部分。
HWND windowHandle = NULL;
WNDCLASS wndClass;
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = L"Wnd";
RegisterClass(&wndClass);
RECT rt = {0, 0, 640, 480};
AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, FALSE);
windowHandle = CreateWindow(L"Wnd", L"Wnd", WS_OVERLAPPEDWINDOW, 10, 10, rt.right - rt.left, rt.bottom - rt.top, NULL, NULL, hInstance, NULL); 
ShowWindow(windowHandle, SW_SHOW);
HWND windowHandle = NULL;
WNDCLASS wndClass;
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = L"Wnd";
RegisterClass(&wndClass);
RECT rt = {0, 0, 640, 480};
AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, FALSE);
windowHandle = CreateWindow(L"Wnd", L"Wnd", WS_OVERLAPPEDWINDOW, 10, 10, rt.right - rt.left, rt.bottom - rt.top, NULL, NULL, hInstance, NULL); 
ShowWindow(windowHandle, SW_SHOW);