客户区混乱

Client Area Confusion

我需要在 window 范围内提供一个适合从摄像机渲染的客户区。我的问题是,当我将 AdjustWindowRect() 和 SetWindowPos() 与我认为正确的参数一起使用时,我仍然留下了一个 window ,它有点太小了。

取下面代码:

//nWidth = 640, nHeight = 480.

RECT rcClient = { 0, 0, nWidth, nHeight };

AdjustWindowRect(&rcClient, WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, FALSE);

//rcClient now equals 0, 0, 648, 488. Which doesn't sound much bigger to me given there's a caption and frame.

SetWindowPos(hCamWnd, 0, 0, 0, rcClient.right, rcClient.bottom, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);

GetClientRect(hCamWnd, &rcClient);

//rcClient now equals 0, 0, 632, 450. Not the 640 x 480 I'm after. Why???

window 创建代码(它是在我知道相机尺寸之前创建的,因此稍后会调整大小)。显然这里有一些来自其他地方的代码,但我猜这只是可能相关的样式。

hCamWnd = CreateWindow(
    wc.lpszClassName,
    _T("Inspection Camera"),
    WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    appGlobal::AppFrame().GetSafeHwnd(),
    NULL,
    GetModuleHandle(NULL),
    NULL
    );

将图像渲染到屏幕的代码与 https://msdn.microsoft.com/en-us/library/windows/desktop/dd743690%28v=vs.85%29.aspx 的 MSDN 示例几乎没有变化,幸运的是,它调整了客户区内的大小和信箱以保持纵横比,所以我只剩下一个有点不想要的边框,但最好让客户区正确...

我尝试了几种不同的 window 样式,但似乎没有任何改变。

欢迎任何帮助。

如果 window 已经存在,您可以使用 GetWindowRectGetClientRect 之间的差异来计算非客户区的大小,然后从中反向计算:

// get size of window and the client area
RECT rc, rcClient;
GetWindowRect(hCamWnd, &rc);
GetClientRect(hCamWnd, &rcClient);

// calculate size of non-client area
int xExtra = rc.right - rc.left - rcClient.right;
int yExtra = rc.bottom - rc.top - rcClient.bottom;

// now resize based on desired client size
SetWindowPos(hCamWnd, 0, 0, 0, nWidth + xExtra, nHeight + yExtra, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);