【问题标题】:WTL layout with resizing调整大小的 WTL 布局
【发布时间】:2011-08-31 10:19:14
【问题描述】:

我想知道拥有更多 WTL 知识的人会如何创建这样的东西:

一个可调整大小的对话框 (-> WS_THICKFRAME),其中包含两个“区域”。调整大小时,一个区域在 y 方向上增长,并包含一些组件,这些组件之间的高度距离应相等(例如,在区域高度的 0%、25%、50%、75% 和 100% 处)。

另一个区域在下方并具有固定高度。调整大小时,这两个区域都应在 x 方向上增长。

这里的重要问题是: a) 这两个区域使用什么容器等 b) 如何处理大小调整(DLGRESIZE_CONTROL 不允许以相等的距离分隔控件,例如 afaik)

谢谢。

【问题讨论】:

  • 您可能会从 MFC 的这个答案中获得一些见解:stackoverflow.com/questions/138040/…
  • 这有点帮助,是的。不过仍然想知道如何处理区域/容器。
  • 我发布的代码不做容器,你应该单独处理每个控件。但是您的布局似乎并不太难,上面的控件移动了 0%、25% 等,正如您所说的那样,底部总是移动 100%。
  • 但是哪些类可以用作容器呢?并且顶部容器本身不应按 % 调整大小,因为下方区域的高度是固定的。所以我也需要某种锚。

标签: c++ resize wtl


【解决方案1】:

您可以为此使用CDialogResize 类。简单地从类中的这个类继承 定义您的窗口并定义每个控件应调整为窗口大小的方式 已更新。这些调整大小是级联的,因此您可以拥有一个以同样实现CDialogResize 的方式调整大小的窗口。

class CFooWindow : ... public CDialogResize<CFooWindow> {

    BEGIN_MSG_MAP(CFooWindow)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        ... more messages here
        CHAIN_MSG_MAP(CDialogResize<CFooWindow>)
    END_MSG_MAP()

    // This map defines how the controls within the window are resized.
    // You can also use DLGRESIZE_GROUP() to group controls together.
    BEGIN_DLGRESIZE_MAP(CFooWindow)
       DLGRESIZE_CONTROL(IDC_WINDOW_TOP,    DLSZ_SZIZE_X | DLSZ_SIZE_Y);
       DLGRESIZE_CONTROL(IDC_WINDOW_BOTTOM, DLSZ_SZIZE_X | DLSZ_MOVE_Y);
    END_DLGRESIZE_MAP()


    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {

       DlgResize_Init();
    }
      .. the rest of your class here
}

您可以通过使用DLGRESIZE_GROUP() 并在资源文件中分隔控件来实现控件之间的间隙,因为您希望它们在最终布局中被分隔。规模 然后将更新这些项目。如果您需要任何太复杂的东西,您可以使用对话框调整大小回调来控制项目的确切位置。只需在您的类中实现CDlgResize::OnSize(UINT nType, int cx, int cy) 并手动更新控件的大小。

【讨论】:

  • 需要更多然后查看here
【解决方案2】:

这可以通过拆分器来完成。这是一个很棒的教程:http://www.codeproject.com/KB/wtl/wtl4mfc7.aspx

您可以将 SPLIT_BOTTOMALIGNED 设置为扩展样式以仅调整顶部窗格的大小(不调整底部窗格的大小)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2017-06-20
    • 2016-07-17
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多