客户区混乱
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 已经存在,您可以使用 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);
我需要在 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 已经存在,您可以使用 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);