65.9K
CodeProject 正在变化。 阅读更多。
Home

向对话框添加控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.31/5 (9投票s)

2000年11月17日

6分钟阅读

viewsIcon

140700

downloadIcon

1236

关于在对话框中使用 Windows 公共控件之一的入门教程。

引言

本教程将演示如何使用基于对话框的应用程序向非常基本的对话框添加公共控件。它将涵盖以下几点:

本教程假设您熟悉使用 VC++ 6 类向导创建基于对话框的应用程序。如果您需要有关此主题的信息,请查阅文章:对话框基础应用程序入门指南 - 第 1 部分

在对话框上放置控件

生成基于对话框的应用程序后,转到工作区窗口中的资源。在对话框部分中选择对话框IDD_USINGCTRLSINDIALOGS_DIALOG。对于此示例,使用按钮控件,从控件调色板中选择它。十字形光标指示按钮中心将放置的位置。

下面显示了您使用的许多常见控件及其工具提示。这些控件将在本网站上的其他教程中详细讨论。

调整对话框上控件的大小

当光标移动到“加宽边框”上方时,它会变成双头箭头,指示您可以调整控件大小的方向。您将在右下角的状态栏上看到控件的位置和尺寸。我必须指出,这些是以对话框单位而不是像素为单位的。因此,如果要在控件上放置图像,则必须小心。

对话框单位 (DLU)

对话框中的水平或垂直距离单位。水平 DLU 是当前对话框字体平均宽度的四分之一。垂直 DLU 是当前对话框字体平均高度的八分之一。

从上面的定义可以看出,DLU 取决于字体,并假设字体的纵横比为 2:1(高度:宽度)。这就是为什么某些对话框在设计它们的系统上看起来很好,但在其他系统上看起来不太好的原因。这对于多语言应用程序来说至关重要,因为文本的长度不仅会因另一种语言而异,而且字体的样式也会不同。

对齐控件

对话框的布局对于用户友好性很重要,因此请不要将此演示作为好例子。控件应该以逻辑顺序整齐布局。为了帮助实现后者,资源编辑器可以在对话框上放置网格,并且当网格打开时,控件将吸附到网格。网格的大小可以通过转到布局 >> 网格设置来调整。此外,还有一个易于使用的对齐工具栏。

这些工具允许选定的控件左对齐或右对齐,居中对齐,大小相同等。

上面,按钮已放置,并带有近似的垂直间距,然后按Space Down (Alt+UpArrow),这将使顶部和底部按钮保持在原位,并使其他按钮均匀分布。按Align Left (Ctrl+LeftArrow),按钮将与按钮 1左对齐,因为它已被高亮显示。如果按钮 2已被高亮显示,则按钮 1将向右移动,与按钮 2对齐。

更改控件样式和属性

要更改控件的样式和属性,请选择它,然后选择视图下的属性菜单,或者右键单击控件并选择属性

属性对话框有三个选项卡:常规样式扩展样式。对于大多数控件,常规扩展样式选项卡是相同的,用于输入控件的 ID 和文本、默认启用/可见状态,以及是否将其作为 Tab 键顺序的一部分。扩展样式包括边框类型和希伯来语和阿拉伯语应用程序的阅读顺序。

样式选项卡包含特定于控件类型的样式,如上面列表框所示。这些样式的效果将在本网站上的其他文章中详细讨论。

设置 Tab 键顺序

Tab 键顺序是您使用 TAB 键在一系列控件中移动焦点的顺序。默认情况下,Tab 键顺序是控件在对话框中放置的顺序。一旦放置完成,值得检查 Tab 键顺序是否遵循逻辑流程,以便最好地访问控件。

为此,请按CTRL+D布局菜单Tab 键顺序。然后将显示对话框(如下所示),数字表示当前的 Tab 键顺序。按照控件应按 Tab 键的顺序单击每个控件。如果某个控件已经处于正确的顺序,仍然单击它以使其保持其在顺序中的位置。当顺序完成时,按ENTER或单击没有控件的地方。

如果只需要重新排序少数几个控件,请按住CTRL键并单击要更改的控件之前的控件,然后松开CTRL键并像以前一样进行。如果双击控件,它将成为 Tab 键顺序中的第一个。

将变量链接到控件

将变量链接到控件,例如指向控件类方法的指针。

  1. 选择视图 >> 类向导
  2. 选择成员变量选项卡
  3. 选择控件的 ID
  4. 单击添加变量按钮以弹出添加成员变量对话框,
  5. 输入变量名,选择类别(如果需要,每个类别可以有一个变量),以及变量类型。

类向导将在对话框的头文件中进行以下条目:

// Dialog Data
    //{{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

允许的变量数量因控件而异。

链接通知处理程序

将通知处理程序链接到控件

  1. 选择视图 >> 类向导
  2. 选择消息映射选项卡。
  3. 选择对话框的类名CUsingCtrlsInDialogsDlg,以显示该类的相关对象 ID。
  4. 选择对象 ID,在本例中为IDC_BUTTON1。这将显示允许的消息
  5. 选择要处理的消息,然后单击添加函数按钮。

类向导将在对话框的头文件中进行以下条目:

    // Generated message map functions
    //{{AFX_MSG(CUsingCtrlsInDialogsDlg)
.
.
.
    afx_msg void OnButton();
    //}}AFX_MSG

并在 CPP 文件的消息映射中

    ON_BN_CLICKED(IDC_BUTTON1, OnButton)

并在文件底部添加了以下函数

void CUsingCtrlsInDialogsDlg::OnButton() 
{
    // TODO: Add your control notification handler code here
}

您会注意到类向导会将函数命名为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日:初始版本

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.