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

Rob*_*tas 11 winapi visual-c++

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

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

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

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

Jer*_*fin 11

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

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


Cor*_*tup 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]);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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