使用 Visual Studio 2015 中的 MFC,可以创建用户可以调整大小的对话框,并且可以控制布局调整大小的方式。 例如,可以将对话框底部的按钮附加到底部边缘,以便它们始终位于底部。 还可以设置某些控件,例如列表框、编辑框和文本字段,以在用户展开对话框时展开。
指定 MFC 对话框的动态布局设置
当用户调整对话框大小时,对话框中的控件可以调整或移动 X 和 Y 方向。 当用户调整对话框大小时控件的大小或位置的变化称为动态布局。 例如,在调整大小之前,下面是一个对话框:
调整大小后,列表框区域将增加以显示更多项目,按钮随右下角一起移动:
可以通过在 IDE 中的资源编辑器中指定每个控件的详细信息来控制动态布局,也可以通过访问 CMFCDynamicLayout
特定控件的对象并设置属性以编程方式控制动态布局。
在资源编辑器中设置动态布局属性
可以使用资源编辑器设置对话框的动态布局行为,而无需编写任何代码。
在资源编辑器中设置动态布局属性
打开 MFC 项目后,打开要在对话编辑器中处理的对话。
选择控件并在 “属性 ”窗口中( 在“类视图”中)设置其动态布局属性。 “属性”窗口中的“动态布局”部分包含“移动类型”、“大小调整类型”的属性,以及定义控件移动或更改大小的特定属性,具体取决于为这些属性选择的值。 移动类型 确定在更改对话框大小时控件的移动方式; 大小调整类型 确定在更改对话框大小时如何调整控件的大小。 移动类型和大小调整类型可以是水平、垂直、两者或无,具体取决于要动态更改的维度。 水平为 X 维度;垂直方向为 Y 方向。
如果希望某个控件(如按钮)处于固定大小且位于右下角,与 “确定 ”或“ 取消 ”按钮一样常见,请将 大小调整类型 设置为 “无”,并将 “移动类型 ”设置为“ 两者”。 对于“移动类型”下的“移动 X”和“移动 Y”值,请设置 100%,使控件与右下角保持固定距离。
假设你还有一个控件,你想要在对话框展开时展开。 通常,用户可能会展开对话框以展开多行编辑框以增加文本区域的大小,或者他们可能会展开列表控件以查看更多数据。 在这种情况下,请将 大小调整类型 设置为“两者”,并将 “移动类型 ”设置为“无”。 然后,将 大小调整 X 和 大小调整 Y 值设置为 100。
试验可能对控件有意义的其他值。 例如,具有单行文本框的对话框可能仅将 大小调整类型 设置为 “水平 ”。
以编程方式设置动态布局属性
上一过程可用于在设计时指定对话框的动态布局属性,但如果希望在运行时控制动态布局,则可以以编程方式设置动态布局属性。
以编程方式设置动态布局属性
在对话类的实现代码中查找或创建一个位置,可在其中指定对话框的动态布局。 例如,你可能想要添加一个方法,例如
AdjustLayout
在对话框中,并从需要更改布局的位置调用该方法。 你可能首先从构造函数调用此函数,或者在对对话框进行更改后调用它。对于对话框,请调用类的方法
CWnd
GetDynamicLayout。GetDynamicLayout
返回指向CMFCDynamicLayout
对象的指针。CMFCDynamicLayout* dynamicLayout = pDialog->GetDynamicLayout();
对于要向其添加动态行为的第一个控件,请使用动态布局类上的静态方法创建 MoveSettings 结构,该结构对控件的调整方式进行编码。 首先选择适当的静态方法: CMFCDynamicLayout::MoveHorizontal、 CMFCDynamicLayout::MoveVertical、 CMFCDynamicLayout::MoveNone 或 CMFCDynamicLayout::MoveHorizontalAndVertical。 为移动的水平和/或垂直方面传递百分比。 这些静态方法都返回新创建的 MoveSettings 对象,该对象可用于指定控件的移动行为。
请记住,100 意味着与对话框更改大小一样精确移动,这会导致控件的边缘与新边框保持固定距离。
MoveSettings moveSettings = CMFCDynamicLayout::MoveHorizontal(100);
对大小行为执行相同的作,该行为使用 SizeSettings 类型。 例如,若要指定控件在调整对话框大小时不会更改大小,请使用以下代码:
SizeSettings sizeSettings = CMFCDynamicLayout::SizeNone();
使用 CMFCDynamicLayout::AddItem 方法将控件添加到动态布局管理器。 对于指定所需控件的不同方式,有两种重载。 其中一个采用控件的窗口句柄(HWND),另一个采用控件 ID。
dynamicLayout->AddItem(hWndControl, moveSettings, sizeSettings);
对需要移动或调整其大小的每个控件重复上述作。
如有必要,可以使用 CMFCDynamicLayout::HasItem 方法来确定控件是否已在受动态布局更改约束的控件列表中,或 CMFCDynamicLayout::IsEmpty 方法来确定是否存在任何受更改的控件。
若要启用对话框布局,请调用 CWnd::EnableDynamicLayout 方法。
pDialog->EnableDynamicLayout(TRUE);
下次用户调整对话框大小时,将调用 CMFCDynamicLayout::Adjust 方法,该方法实际上应用了设置。
如果要禁用动态布局,请使用 FALSE 调用 CWnd::EnableDynamicLayout 作为 bEnabled 参数。
pDialog->EnableDynamicLayout(FALSE);
从资源文件以编程方式设置动态布局
使用 CMFCDynamicLayout::MoveHorizontalAndVertical 方法在指定动态布局信息的相关资源脚本文件(.rc 文件)中指定资源名称,如以下示例所示:
dynamicLayout->LoadResource("IDD_DIALOG1");
命名资源必须引用一个对话框,该对话框以资源文件中 AFX_DIALOG_LAYOUT 条目的形式包含布局信息,如以下示例所示:
///////////////////////////////////////////////////////////////////////////// // // AFX_DIALOG_LAYOUT // IDD_MFCAPPLICATION1_DIALOG AFX_DIALOG_LAYOUT BEGIN 0x0000, 0x6400, 0x0028, 0x643c, 0x0028 END IDD_DIALOG1 AFX_DIALOG_LAYOUT BEGIN 0x0000, 0x6464, 0x0000, 0x6464, 0x0000, 0x0000, 0x6464, 0x0000, 0x0000 END
另请参阅
CMFCDynamicLayout 类
控件类
对话框类
对话框编辑器
Visual C++ 2015 中 MFC 的动态对话框布局