我非常渴望解决这个非常烦人的问题:( 我试图在父窗口上显示一个子窗口。有时窗口需要调整大小。但由于某种原因,当我使用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}
为什么?????
我做错了什么?我是否忘记了窗口初始化的一些标志?!
答案 0 :(得分:1)
使用GetClientRect
和GetWindowRect
将其调整为父窗口坐标,而不是使用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标志。 很奇怪。据我所知,不应该有这样的效果。
谢谢大家!