我需要在适当大小的窗口内提供一个客户区,以便从摄像机渲染。我的问题是当使用AdjustWindowRect()和SetWindowPos()时,我认为是正确的参数,我仍然留下一个稍微太小的窗口。
采取以下代码:
//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???
窗口创建代码(它在我知道相机尺寸之前创建,因此稍后会调整大小)。显然这里有一些来自其他地方的代码,但我猜它只是那种可能相关的风格。
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示例几乎没有变化,幸运的是在客户区域内调整大小和字母框以保持宽高比,所以我留下的只是一点点一个不需要的边界,但让客户区域正确... ...
我尝试了几种不同的窗口样式,但它似乎没有改变任何东西。
欢呼任何帮助。
答案 0 :(得分:1)
如果窗口已经存在,您可以使用GetWindowRect
和GetClientRect
之间的差异来计算非客户区域的大小,然后从该窗口向后工作:
// 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);