WTL布局与调整大小

4
我想了解更多WTL知识的人如何创建类似于以下内容的对话框:
一个可调整大小的对话框(-> WS_THICKFRAME),其中包含两个“区域”。一个区域在调整大小时沿y方向增长,并包含一些组件,这些组件应该彼此之间具有相等的高度间距(例如,在区域高度的0%,25%,50%,75%和100%处)。
另一个区域位于下方,具有固定的高度。当调整大小时,两个区域都应该沿x方向增长。
重要问题是: a)使用哪些容器等来处理这两个区域 b)如何处理调整大小(例如,DLGRESIZE_CONTROL不允许控件具有相等的间距,据我所知)
谢谢。

你可能会从这个MFC的答案中获得一些见解:https://dev59.com/VnVC5IYBdhLWcg3w9GA9#5739620 - Mark Ransom
有点帮助,是的。不过还在想如何处理区域/容器。 - xnor
我发布的代码不涉及容器,你需要逐个处理每个控件。但是你的布局似乎不太难,上部控件按照0%、25%等比例移动,底部始终移动100%。 - Mark Ransom
但是哪些类可以用作容器呢? 而且顶部容器本身不应该按百分比调整大小,因为下面的区域高度固定。所以我也需要某种锚定。 - xnor
2个回答

2
您可以使用 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),并手动更新控件的大小即可。


需要更多信息,请查看这里 - Simon Featherstone

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接