客户区域混乱

时间:2015-03-12 09:54:41

标签: winapi

我需要在适当大小的窗口内提供一个客户区,以便从摄像机渲染。我的问题是当使用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示例几乎没有变化,幸运的是在客户区域内调整大小和字母框以保持宽高比,所以我留下的只是一点点一个不需要的边界,但让客户区域正确... ...

我尝试了几种不同的窗口样式,但它似乎没有改变任何东西。

欢呼任何帮助。

1 个答案:

答案 0 :(得分:1)

如果窗口已经存在,您可以使用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);