在本教程中,将探讨如何创建一个基于对话框的应用程序,并介绍以下要点:
当基于对话框的应用程序生成后,转到工作区窗口中的“资源”部分。在“对话框”部分中选择对话框IDD_USINGCTRLSINDIALOGS_DIALOG
。以按钮控件为例,从控件调色板中选择它。十字形光标指示按钮中心将放置的位置。
以下是一些常用的控件及其工具提示,这些控件将在本站的其他教程中更详细地讨论。
当光标移动到“加宽边框”上时,它会变成双头箭头,指示可以调整控件的大小方向。将在屏幕右下角的状态栏上看到控件的位置和尺寸。必须指出,这些是以对话框单位(DLU)而不是像素为单位的。因此,如果需要在控件上放置图像,需要特别注意。
对话框单位(DLU):对话框框内水平或垂直距离的单位。水平DLU是当前对话框字体宽度的平均值除以4。垂直DLU是当前对话框字体高度的平均值除以8。
从上述定义可以看出,DLUs依赖于字体,并假设字体的宽高比为2:1(高度:宽度)。这就是为什么一些对话框在设计它们的系统上看起来不错,但在其他系统上看起来不太好。对于多语言应用程序来说,这一点极其重要,因为不仅文本的长度在另一种语言中可能会变化,而且字体的风格也会变化。
对话框的布局对于用户友好性至关重要,因此不要将此演示作为好的示例。控件应该按照逻辑顺序排列,并整齐布局。为了帮助后者,资源编辑器可以为在对话框上放置一个网格,当网格打开时,控件会吸附到网格上。可以通过转到“布局”>>“网格设置”来调整网格的大小。还有一个对齐工具栏,使用起来非常简单。
这些工具允许选择的控件左对齐或右对齐,居中对齐等。在上面,按钮已经放置了大致的垂直间距,然后按下“Space Down(Alt+UpArrow)”,这将保持顶部和底部按钮的位置,并将其他按钮均匀地间隔开。按下“Align Left(Ctrl+LeftArrow)”,按钮将与“Button 1”左对齐,因为它被高亮显示。如果“Button 2”被高亮显示,“Button 1”将被移动到右侧,与“Button 2”对齐。
要更改控件的样式和属性,请选择它,然后在“视图”下选择“属性”菜单,或者右键单击控件并选择“属性”。
属性对话框有三个选项卡:“常规”、“样式”和“扩展样式”。对于大多数控件,“常规”和“扩展样式”选项卡是相同的,它们提供了输入控件的ID和文本、默认启用/可见状态,以及它是否是Tab顺序的一部分。扩展样式包括边框类型和希伯来语和阿拉伯语应用程序的阅读顺序。
“样式”选项卡有特定于控件类型的样式,如上面的列表框所示。这些样式的效果在本站的其他文章中有更详细的讨论。
Tab顺序是使用Tab键通过一系列控件移动焦点的顺序。默认情况下,Tab顺序是控件放置在对话框上的顺序。一旦放置完成,值得检查Tab顺序是否遵循逻辑流程,以便最好地访问控件。
为此,请按CTRL+D,然后选择“布局”菜单中的“Tab顺序”。然后对话框将显示(如下所示),数字表示当前的Tab顺序。点击每个控件,按照控件要被Tab的顺序。如果一个控件已经在正确的顺序中,仍然点击它,以便它保持在顺序中的位置。当顺序完成后,按ENTER或点击没有控件的地方。
如果只需要重新排序几个控件,按住CTRL键并点击要更改的控件之前的控件,然后释放CTRL键并像以前一样继续。如果双击控件,它将成为Tab顺序中的第一个。
要将变量链接到控件,例如指针,它将提供对控件类方法的访问:
类向导将在对话框的头文件中做出以下条目:
// 对话框数据
//{{AFX_DATA(CUsingCtrlsInDialogsDlg)
enum { IDD = IDD_USINGCTRLSINDIALOGS_DIALOG };
CEdit m_Edit;
CString m_strEdit;
//}}AFX_DATA
然后在对话框的构造函数中:
//{{AFX_DATA_INIT(CUsingCtrlsInDialogsDlg)
m_strEdit = _T("");
//}}AFX_DATA_INIT
并在DoDataExchange()方法中做出以下条目:
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUsingCtrlsInDialogsDlg)
DDX_Control(pDX, IDC_EDIT1, m_Edit);
DDX_Text(pDX, IDC_EDIT1, m_strEdit);
//}}AFX_DATA_MAP
允许的变量数量取决于控件。
要将通知处理程序链接到控件:
类向导将在对话框的头文件中做出以下条目:
// 生成的消息映射函数
//{{AFX_MSG(CUsingCtrlsInDialogsDlg)
.
.
.
afx_msg
void
OnButton();
//}}AFX_MSG
并在CPP文件的消息映射中:
ON_BN_CLICKED(IDC_BUTTON1, OnButton)
并在文件底部添加以下函数:
void
CUsingCtrlsInDialogsDlg::OnButton()
{
// TODO: 在此处添加控件通知处理程序代码
}
会注意到类向导将函数命名为OnButton1()。这是因为打算使用相同的处理程序处理所有四个按钮。因此,消息映射条目在头文件和代码文件的类向导保留部分之外进行了移动。
原型也修改为接受按钮ID作为输入。
//}}AFX_MSG
afx_msg
void
OnButton(UINT nID);
DECLARE_MESSAGE_MAP()
消息映射条目被修改为处理一系列按钮控件。为此工作,至关重要的是ID是连续的。
//}}AFX_MSG_MAP
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON4, OnButton)
END_MESSAGE_MAP()
添加函数内容以在静态控件中显示按钮编号。
void
CUsingCtrlsInDialogsDlg::OnButton(UINT nID)
{
m_strReport.Format("%d", nID-IDC_BUTTON1+1);
UpdateData(FALSE);
}
在这篇文章中展示了基础知识,尽管布局非常糟糕。它应该提供了一个起点。更完整和高级的信息可以在本站的其他文章中找到。
编程愉快!
2001年3月24日:初始版本