使用:: MoveWindow遇到麻烦 - 留空格

时间:2011-10-12 10:37:36

标签: c++ windows winapi user-interface mfc

我非常渴望解决这个非常烦人的问题:( 我试图在父窗口上显示一个子窗口。有时窗口需要调整大小。但由于某种原因,当我使用MoveWindow函数时,它会在父窗口的顶部留下空白区域。我想在这里展示一张图片,但我不能发布图片。

以下是代码示例:

HWND hwnd  // Comes from external function. Was defined as WS_CHILD previously
HWND hwndParent     = ::GetParent(hwnd);  
RECT parentRect     = {0,0,0,0};  
RECT childRect      = {0,0,0,0};  
::GetClientRect(hwndParent, &parentRect);  // Suppose it returns {0,0,600,300}  

BOOL ok = ::MoveWindow(hwnd, 0, 0, 600, 300, true);  
::GetClientRect(hwnd, &childRect);  // Will return {0,0,584,297}  

为什么?????

我做错了什么?我是否忘记了窗口初始化的一些标志?!

4 个答案:

答案 0 :(得分:1)

使用GetClientRectGetWindowRect将其调整为父窗口坐标,而不是使用MapWindowPoints(NULL,hwndParent,&parentRect,2)GetWindowRect将包含MoveWindow所需的非客户区域。

编辑:如果您想要一个没有非客户区域的窗口,那么窗口rect和客户端rect的大小相同,则需要修剪window styles你申请到窗口。避免使用WS_BORDER,WS_CAPTION,WS_DLGFRAME,WS_OVERLAPPED,WS_SIZEBOX和WS_THICKFRAME样式。

答案 1 :(得分:0)

MoveWindow更新窗口位置,而GetClientRect获取窗口的客户区域部分,不必相同。如果你的窗口有非客户区,那么一切都很好,并按预期工作。

如果你仍然认为子窗口没有完全覆盖父窗口的客户区,那么间距属于子控件/窗口,你需要寻找在那里删除它的方法(控制标志,参数等)。

答案 2 :(得分:0)

MoveWindow在窗口坐标上运行 - 包括非客户区域(边框,标题栏等)。

GetClientRect获取窗口客户端部分的区域,忽略边框,标题栏等。

这是不匹配的地方。如果您希望MoveWindow达到所需的客户端大小,则只需AdjustWindowRect即可尝试预测要传递到MoveWindow的内容。请注意,它并非总是可行,并不总是准确的。例如窗口的最小/最大尺寸,菜单(可以换行到多行)等等。

答案 3 :(得分:0)

问题是父窗口的WS_POPUP标志。 很奇怪。据我所知,不应该有这样的效果。

谢谢大家!