如何将子窗口绑定到相对位置的父窗口?

时间:2011-11-28 20:58:53

标签: winapi visual-c++

在对话框或主窗口中布置子窗口(常用控件)的最佳做法是什么?我的意思是有一个绑定机制,可以将控件的相对位置固定到父窗口的边框,就像在WPF中一样。在窗口调整大小期间,子控件将与主窗口一起调整大小。 目前我有这个: List view dialog

从红线中可以看出,当我调整列表视图控件的父窗口时,它看起来并不漂亮。我想将ListView的右侧绑定到DialogBox的右边框和类似的其他控件。

我知道我可以使用GetWindowRect,GetClientRect和MoveWindow函数。但这是正确的方法吗?

目前我正在使用没有MFC的纯Win32 Api。

3 个答案:

答案 0 :(得分:10)

如果您只是使用Win32 API,通常通过处理WM_SIZE消息来处理此问题,并通过在父窗口上调用GetClientRect并在子窗口上调用MoveWindow来移动/调整子项大小以适当地填充父项。 / p>

如果你想要足够严重,你可以(当然)实现一个布局管理器,所以程序的其余部分不需要直接处理这样的事情。至少IME,做得这么好是非常值得的,除非你能够大量使用那个布局代码,否则很难有麻烦。

答案 1 :(得分:10)

虽然它是一个手动过程,但我觉得在相对于每个控件的父窗口的坐标中工作很有帮助。

我使用以下函数返回控件相对于其父级的当前位置,以便可以使用SetWindowPos()轻松移动/调整大小。

void GetRelativeCtrlRect(HWND hWnd, RECT *rc) {
   // Get the position of the window relative to the entire screen
   GetWindowRect(hWnd, rc);

   // Now convert those with regards to the control's parent
   ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[0]);
   ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[1]);
}

这会将大小RECT relative 返回到父窗口/控件。例如,如果您想将子控件的大小调整为父级的“近”底边,只需在调用SetWindowPos(childHWND,...)之前在rc.bottom上关闭几个像素

我还有一些“锚定”功能,可以帮助相对于其他参考点进行位置控制。然而,它仍然是手动 - 代码 - 时间 - 过程,但提供了优秀的手动调整结果。

我收藏的其他一些选项,都可能需要调整以满足您的需求,但它可以让您了解其他人为解决此问题而创建的一些工具。

答案 2 :(得分:2)

尝试选择控件并使用其属性“Dock”进行播放。这样,您可以将控件停靠在父控件的某些边或甚至所有边上。