【问题标题】:How to bind child windows to parent window in relative positions?如何将子窗口以相对位置绑定到父窗口?
【发布时间】:2011-11-28 20:58:52
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: winapi visual-c++


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      我使用以下函数返回控件相对于其父级的当前位置,以便可以使用 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相对返回到父窗口/控件。例如,如果您想将子控件的大小调整到父控件的“近”底部边缘,只需在调用 SetWindowPos(childHWND,...) 之前从 rc.bottom 上移出几个像素即可

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

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

      【讨论】:

        【解决方案3】:

        尝试选择控件并使用其属性“Dock”进行播放。有了它,您可以将控件停靠到父控件的某些侧面甚至所有侧面。

        【讨论】:

        • 纯win32没有“Dock”功能,但我发现这个thread基本上回答了我的问题,所以感谢“Dock”关键字:)
        • 好的,很抱歉,但很高兴它仍然有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        相关资源
        最近更新 更多