MFC控件使用手册
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面的步骤是最重要的一步,我们动用了功能强大的工具 ClassWizard。首先, 我们将编辑框与一个 CString 对象相关联,这使用了一种被称为 Dialog Data Exchange (DDX)的机制。在这种机制中,我们先在处理函数 OnInitDialog 或对 话框类的构造函数中对对话框对象的成员变量进行初始化,在对话框显示之前, 框架的 DDX 机制将成员变量的值传递给对话框中的控件。这个过程在成员函数 DoModal 或 Create 被调用的过程中发生。类 CDialog 中对 OnInitDialog 成员函 数的默认实现调用了类 CWnd 成员函数 UpdateData 来初始化对话框中的控件。这 时我们就可以看到前面的第 6 步还可在具有下面的几种变通方案:
图 6. 9 以消息框的形式反馈输入的字符串
下面我们来看在上面的步骤中都完成了什么。首先我们使用资源编辑器向对话框 模板中添加这些标准控件,这一步的概念很清晰,因此并不难理解。 然后,我们打开了所绘制的编辑框的 Properties (属性)对话框。先将其控件 ID 设置为 IDC_EDIT。这时如果打开头文件 Resource.h,就会发现宏 IDC_EDIT 被定 义为常量 1001。不过,事实上在很多情况下我们并不需要关心每一控件的 ID 的
图 6. 7 使用 ClassWizard 设置数据验证方案
6. 从 Workspace 窗口的 ClassView 中双击类 CDialogDemoDlg 的 OnInitDialog 成员函数,使用下面的代码来代替位于语句
return TRUE;
前的// TODO 注释:
m_strEdit="您好! 请在这里输入一些字符串。"; UpdateData(FALSE);
• 类 CCheckListBox 用于创建选择列表框,这种列表框中的每一项前面有一 个复选框,以决定该项是否被选中。
• 类 CDragListBox 用于创建一种特殊的列表框,这种列表框允许用户移动 列表项。
在本章我们仅讲述第一类控件,即 Windows 标准控件。所涉及的内容包括各个控 件的使用及相应的技巧。
显示文本及其图标列表的窗口
包括一系列字符串的列表
用于在一较长操作中提示用户所完 成的进度
多格式文本编辑 CRichEditCtrl
提供可设置字符和段落格式的文本 编辑的窗口
滚动条
CScrollBar
为对话框提供控件形式的滚动条
滑块
CSliderCtrl
包括一个有可选标记的滑块的窗口
旋转按钮
CSpinButtonCtrl 提供一对可用于增减某个值的箭头
如果用户单击了对话框中 ID 为 IDOK 的按钮,或者以 TRUE 为参数调用函数 UpdateData,DDX 机制从控件中将值传递到成员变量,同时对话框数据验证 (dialog data validation,DDV)机制根据设定的验证规则验证所有数据项。
在数据交换的过程中,成员函数 UpdateData 先创建一个 CDataExchange 对象, 然后调用对话框对类 CDialog 成员函数 DoDataExchange 的重载版本。该
VC++\MFC\Windows 标准控件使用手册
控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户 交互的元素。在 Visual C++中,可以使用的控件分成三类:
(1) Windows 标准控件
Windows 标准控件由 Windows 操作系统提供,在 Windows 95 中还提供了一些新 增的控件。所有这些控件对象都是可编程的,我们可以使用 Visual C++提供的 对话框编辑器把它们添加到对话框中。Microsoft 基础类库(MFC)提供了封装这 些控件的类,它们列于表 6.1。
• Windows 95 • Windows NT 3.51 及以后版本 • Win32s 1.3 • 注意: • Visual C++ 4.2 及以后版本不再支持 Win32s。
(2) ActiveX 控件
ActiveX 控件可用于对话框中,也可用于 HTML 文档中。这种控件过去被称为 OLE 控件。本书将在专门的章节中来讲述关于 ActiveX 控件的知识。这里仅指出 ActiveX 控件使用了与标准控件完全不同的接口和实现方法。
具有一系列命令生成按钮的窗口,同 MFC 类 CToolBar 类似
CToolTipCtrl
一个小的弹出式窗口,用于提供对工具 条按钮或其它控件功能的简单描述
CTreeCtrl
用于显示一系列的项的继承结构
前面提到过,在 MFC 中,类 CWnd 是所有窗口类的基类,很自然的,它也是所有 控件类的基类。Windows 标准控件在以下环境下提供:
表 6.1 Windows 标准控件
控件 动画 按钮 组合框 编辑框 标题头 热键 图象列表
列表 列表框 进度
MFC 类 CAnimateCtrl CButton CComboBox CEdit CHeaderCtrl CHotKeyCtrl CImageList
CListCtrl CListBox CProgressCtrl
描述
显示连续的 AVI 视频剪辑
用来产生某种行为的按钮,以及复选 框、单选钮和组框
编辑框和列表框的组合
用于键入文本
位于某一行文本之上的按钮,可用来 控制显示文件的宽度
用于通过按下某一组合键来很快的 执行某些常用的操作
一系列图象(典型情况下是一系列图 标或位图)的集合。图象列表本身不 是一种控件,它常常是和其它控件一 起工作,为其它控件提供所用的图象 列表
(3) 其它 MFC 控件类 除了 Windows 标准控件和自己编写的或者来自于第三方软件开发商的 ActiveX 控件以外,MFC 还提供了另外三种控件,它们由下面的三个类进行封装:
• 类 CBitmapButton 用于创建以位图作为标签的按钮,位图按钮最多可以包 括四个位图图片,分别代表按钮的四种不同状态。
图 6. 6 为控件映射添加成员变量
5. 检查一下现在的 ClassWizard 对话框(图 6.7)与图 6.5 相比有何不同。在图 6.7 所示的对话框中下方的 Maximum characters 文本框中输入 50。由字面意思 可以很容易猜出其含义,即将编辑框 IDC_EDIT 中可能的最长字符串的大小限制 为 50。单击 OK 关闭对话框。
Fra Baidu bibliotek
静态文本
CStatic
常用于为其它控件提供标签
状态条
CStatusBarCtrl 用于显示状态信息的窗口,同 MFC 类 CStatusBar 类似
控件 选项卡
工具条 工具提示 树
MFC 类
描述
CTabCtrl
在选项卡对话框或属性页中提供具有类 似笔记本中使用的分隔标签的外观的选 项卡
CToolBarCtrl
图 6. 4 向对话框中添加一个编辑框控件
图 6. 5 ClassWizard 对话框
单击 Member Variables 选项卡,确信在 Project 处选择了 DialogDemo,在 Class name 处选择了 CDialogDemoDlg。现在我们为刚才添加的编辑框控件 IDC_EDIT 添加一个数据映射入口。在 Control IDs 处选择 IDC_EDIT,单击右边的 Add Viable 按钮。打开如图 6.6 所示的对话框。 在 Member variable name 处链接变量名 m_strEdit (这里 m 表示该变量为类 CDialogDemoDlg 的一个成员变量,str 表明其类型为字符串,即类 CString), 在 Category 下拉列表中选择 Value (另一种选择是 Control,两种选择的不同将 在后面的内容中讲述),在 Variable type 下拉列表中选择 CString (还有其它 很多数据类型可供选择,但由于这里编辑框中的内容为一字符串,因此 CString 是最恰当的选择)。单击 OK 关闭对话框。
第一节 使用对话框编辑器和 ClassWizard
对于大多数 Windows 标准控件,我们一般都使用对话框编辑器来将它们添加到对 话框中。
图 6. 1 在 ResourceView 中选择对话框 IDD_DIALOGDEMO_DIALOG
图 6. 2 控件的 Properties 对话框
图 6. 3 对话框编辑器的 Controls 工具窗口 在下面的过程中,我们将一个编辑框控件添加到在第四章创建的基于对话框的 MFC 框架应用程序的主对话框窗口中。 1. 首先,在 Workspace 窗口的 ResourceView 选项内双击 DialogDemo resources\Dialog 节点下的 IDD_DIALOGDEMO_DIALOG 图标。上面的操作如图所 示。 2. 用鼠标选中标有“要做……”的静态文本控件。右击鼠标,从上下文菜单中 选择 Properties,打开如图 6.2 所示的对话框,在 Caption 文本框中输入新的 控件文本:“在下面的文本框中输入一些字符”,然后将静态文本控件拖动到对 话框的左上角。 3. 从 Controls 工具窗口(如图 6.3 所示,如果在你的资源编辑器中看不到该工 具窗口,可以在工具条上右击鼠标,从上下文菜单中选择 Controls)中选择编辑 控件图标 ,在对话框中绘制一个编辑框控件,如图 6.4 所示。 在该编辑框控件的 Properties 窗口的 General 选项卡中输入其 ID 为 IDC_EDIT。 然后在 Styles 选项卡下将 Multiline 复选框划上勾,并消除 Auto HScroll 复选 框前的勾。 4. 右击该编辑框控件,从上下文菜单中选择 ClassWizard 命令,打开 ClassWizard 对话框,该对话框看起来如图 6.5 所示。
m_pMainWnd = &dlg;
8. 编译并运行该应用程序。显示如图 6.8 所示的对话框。
图 6. 8 示例程序 DialogDemo 的运行结果
在图 6.8 所示的文本框中输入一些字符,单击“确定”。随即弹出如图 6.9 所示 的消息框。该消息框复述了用户在图 6.8 所示的对话框中的输入。我们还发现, 在图 6.8 所示的对话框中,当输入字符串达到一定的长度之后,我们不可以再输 入更多的字符,这是我们在前面设置了 Maximum characters 为 50 的结果。
7. 在 ClassView 中双击类 CDialogDemoApp 的 InitInstance 成员函数,使用下 面的代码来找替位于选择支
if (nResponse == IDOK)
下的//TODO 注释:
AfxMessageBox(dlg.m_strEdit);
然后将同一成员函数中的下面的代码行删掉(或注释掉):
1. 将代码行
m_strEdit="您好! 请在这里输入一些字符串。";
移到对基类的 OnInitDialog 成员函数的调用之前,即位于下面的代码之前:
CDialog::OnInitDialog();
2. 将代码
m_strEdit="您好! 请在这里输入一些字符串。";
移到类 CDialogDemoDlg 的构造函数中。
对于上面的两种方法,与前面第 6 步中使用的方法相比,我们没有必要调用类 CWnd 的成员函数 UpdateData。因为该函数在类 CDialog 的成员函数 OnInitDialog 中将被调用。
这三种方法之间并没有明确的优劣之分,在很多情况下,它们分别适用于不同的 场合。
这里我们说一下成员函数 UpdateData。该函数带有一个布尔类型的参数,如果 该参数为 FALSE,函数 UpdateData 将成员变量的值传递给对话框的变量;而如 果该参数为 TRUE,函数 UpdateData 将进行相反的过程。
具体值,而只需要记住相应的助记符。对于这里的编辑框控件,我们只需要记住 IDC_EDIT 即可,而不需要关心它等于 1001。接着,我们在 Styles 选项卡中设置 了 Multiline 属性,同时清除了 Auto HScroll 属性,两者共同作用使用得编辑 框 IDC_EDIT 支持多行文本,并且如文本行的长度超过编辑框宽度时自动回行。
图 6. 9 以消息框的形式反馈输入的字符串
下面我们来看在上面的步骤中都完成了什么。首先我们使用资源编辑器向对话框 模板中添加这些标准控件,这一步的概念很清晰,因此并不难理解。 然后,我们打开了所绘制的编辑框的 Properties (属性)对话框。先将其控件 ID 设置为 IDC_EDIT。这时如果打开头文件 Resource.h,就会发现宏 IDC_EDIT 被定 义为常量 1001。不过,事实上在很多情况下我们并不需要关心每一控件的 ID 的
图 6. 7 使用 ClassWizard 设置数据验证方案
6. 从 Workspace 窗口的 ClassView 中双击类 CDialogDemoDlg 的 OnInitDialog 成员函数,使用下面的代码来代替位于语句
return TRUE;
前的// TODO 注释:
m_strEdit="您好! 请在这里输入一些字符串。"; UpdateData(FALSE);
• 类 CCheckListBox 用于创建选择列表框,这种列表框中的每一项前面有一 个复选框,以决定该项是否被选中。
• 类 CDragListBox 用于创建一种特殊的列表框,这种列表框允许用户移动 列表项。
在本章我们仅讲述第一类控件,即 Windows 标准控件。所涉及的内容包括各个控 件的使用及相应的技巧。
显示文本及其图标列表的窗口
包括一系列字符串的列表
用于在一较长操作中提示用户所完 成的进度
多格式文本编辑 CRichEditCtrl
提供可设置字符和段落格式的文本 编辑的窗口
滚动条
CScrollBar
为对话框提供控件形式的滚动条
滑块
CSliderCtrl
包括一个有可选标记的滑块的窗口
旋转按钮
CSpinButtonCtrl 提供一对可用于增减某个值的箭头
如果用户单击了对话框中 ID 为 IDOK 的按钮,或者以 TRUE 为参数调用函数 UpdateData,DDX 机制从控件中将值传递到成员变量,同时对话框数据验证 (dialog data validation,DDV)机制根据设定的验证规则验证所有数据项。
在数据交换的过程中,成员函数 UpdateData 先创建一个 CDataExchange 对象, 然后调用对话框对类 CDialog 成员函数 DoDataExchange 的重载版本。该
VC++\MFC\Windows 标准控件使用手册
控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户 交互的元素。在 Visual C++中,可以使用的控件分成三类:
(1) Windows 标准控件
Windows 标准控件由 Windows 操作系统提供,在 Windows 95 中还提供了一些新 增的控件。所有这些控件对象都是可编程的,我们可以使用 Visual C++提供的 对话框编辑器把它们添加到对话框中。Microsoft 基础类库(MFC)提供了封装这 些控件的类,它们列于表 6.1。
• Windows 95 • Windows NT 3.51 及以后版本 • Win32s 1.3 • 注意: • Visual C++ 4.2 及以后版本不再支持 Win32s。
(2) ActiveX 控件
ActiveX 控件可用于对话框中,也可用于 HTML 文档中。这种控件过去被称为 OLE 控件。本书将在专门的章节中来讲述关于 ActiveX 控件的知识。这里仅指出 ActiveX 控件使用了与标准控件完全不同的接口和实现方法。
具有一系列命令生成按钮的窗口,同 MFC 类 CToolBar 类似
CToolTipCtrl
一个小的弹出式窗口,用于提供对工具 条按钮或其它控件功能的简单描述
CTreeCtrl
用于显示一系列的项的继承结构
前面提到过,在 MFC 中,类 CWnd 是所有窗口类的基类,很自然的,它也是所有 控件类的基类。Windows 标准控件在以下环境下提供:
表 6.1 Windows 标准控件
控件 动画 按钮 组合框 编辑框 标题头 热键 图象列表
列表 列表框 进度
MFC 类 CAnimateCtrl CButton CComboBox CEdit CHeaderCtrl CHotKeyCtrl CImageList
CListCtrl CListBox CProgressCtrl
描述
显示连续的 AVI 视频剪辑
用来产生某种行为的按钮,以及复选 框、单选钮和组框
编辑框和列表框的组合
用于键入文本
位于某一行文本之上的按钮,可用来 控制显示文件的宽度
用于通过按下某一组合键来很快的 执行某些常用的操作
一系列图象(典型情况下是一系列图 标或位图)的集合。图象列表本身不 是一种控件,它常常是和其它控件一 起工作,为其它控件提供所用的图象 列表
(3) 其它 MFC 控件类 除了 Windows 标准控件和自己编写的或者来自于第三方软件开发商的 ActiveX 控件以外,MFC 还提供了另外三种控件,它们由下面的三个类进行封装:
• 类 CBitmapButton 用于创建以位图作为标签的按钮,位图按钮最多可以包 括四个位图图片,分别代表按钮的四种不同状态。
图 6. 6 为控件映射添加成员变量
5. 检查一下现在的 ClassWizard 对话框(图 6.7)与图 6.5 相比有何不同。在图 6.7 所示的对话框中下方的 Maximum characters 文本框中输入 50。由字面意思 可以很容易猜出其含义,即将编辑框 IDC_EDIT 中可能的最长字符串的大小限制 为 50。单击 OK 关闭对话框。
Fra Baidu bibliotek
静态文本
CStatic
常用于为其它控件提供标签
状态条
CStatusBarCtrl 用于显示状态信息的窗口,同 MFC 类 CStatusBar 类似
控件 选项卡
工具条 工具提示 树
MFC 类
描述
CTabCtrl
在选项卡对话框或属性页中提供具有类 似笔记本中使用的分隔标签的外观的选 项卡
CToolBarCtrl
图 6. 4 向对话框中添加一个编辑框控件
图 6. 5 ClassWizard 对话框
单击 Member Variables 选项卡,确信在 Project 处选择了 DialogDemo,在 Class name 处选择了 CDialogDemoDlg。现在我们为刚才添加的编辑框控件 IDC_EDIT 添加一个数据映射入口。在 Control IDs 处选择 IDC_EDIT,单击右边的 Add Viable 按钮。打开如图 6.6 所示的对话框。 在 Member variable name 处链接变量名 m_strEdit (这里 m 表示该变量为类 CDialogDemoDlg 的一个成员变量,str 表明其类型为字符串,即类 CString), 在 Category 下拉列表中选择 Value (另一种选择是 Control,两种选择的不同将 在后面的内容中讲述),在 Variable type 下拉列表中选择 CString (还有其它 很多数据类型可供选择,但由于这里编辑框中的内容为一字符串,因此 CString 是最恰当的选择)。单击 OK 关闭对话框。
第一节 使用对话框编辑器和 ClassWizard
对于大多数 Windows 标准控件,我们一般都使用对话框编辑器来将它们添加到对 话框中。
图 6. 1 在 ResourceView 中选择对话框 IDD_DIALOGDEMO_DIALOG
图 6. 2 控件的 Properties 对话框
图 6. 3 对话框编辑器的 Controls 工具窗口 在下面的过程中,我们将一个编辑框控件添加到在第四章创建的基于对话框的 MFC 框架应用程序的主对话框窗口中。 1. 首先,在 Workspace 窗口的 ResourceView 选项内双击 DialogDemo resources\Dialog 节点下的 IDD_DIALOGDEMO_DIALOG 图标。上面的操作如图所 示。 2. 用鼠标选中标有“要做……”的静态文本控件。右击鼠标,从上下文菜单中 选择 Properties,打开如图 6.2 所示的对话框,在 Caption 文本框中输入新的 控件文本:“在下面的文本框中输入一些字符”,然后将静态文本控件拖动到对 话框的左上角。 3. 从 Controls 工具窗口(如图 6.3 所示,如果在你的资源编辑器中看不到该工 具窗口,可以在工具条上右击鼠标,从上下文菜单中选择 Controls)中选择编辑 控件图标 ,在对话框中绘制一个编辑框控件,如图 6.4 所示。 在该编辑框控件的 Properties 窗口的 General 选项卡中输入其 ID 为 IDC_EDIT。 然后在 Styles 选项卡下将 Multiline 复选框划上勾,并消除 Auto HScroll 复选 框前的勾。 4. 右击该编辑框控件,从上下文菜单中选择 ClassWizard 命令,打开 ClassWizard 对话框,该对话框看起来如图 6.5 所示。
m_pMainWnd = &dlg;
8. 编译并运行该应用程序。显示如图 6.8 所示的对话框。
图 6. 8 示例程序 DialogDemo 的运行结果
在图 6.8 所示的文本框中输入一些字符,单击“确定”。随即弹出如图 6.9 所示 的消息框。该消息框复述了用户在图 6.8 所示的对话框中的输入。我们还发现, 在图 6.8 所示的对话框中,当输入字符串达到一定的长度之后,我们不可以再输 入更多的字符,这是我们在前面设置了 Maximum characters 为 50 的结果。
7. 在 ClassView 中双击类 CDialogDemoApp 的 InitInstance 成员函数,使用下 面的代码来找替位于选择支
if (nResponse == IDOK)
下的//TODO 注释:
AfxMessageBox(dlg.m_strEdit);
然后将同一成员函数中的下面的代码行删掉(或注释掉):
1. 将代码行
m_strEdit="您好! 请在这里输入一些字符串。";
移到对基类的 OnInitDialog 成员函数的调用之前,即位于下面的代码之前:
CDialog::OnInitDialog();
2. 将代码
m_strEdit="您好! 请在这里输入一些字符串。";
移到类 CDialogDemoDlg 的构造函数中。
对于上面的两种方法,与前面第 6 步中使用的方法相比,我们没有必要调用类 CWnd 的成员函数 UpdateData。因为该函数在类 CDialog 的成员函数 OnInitDialog 中将被调用。
这三种方法之间并没有明确的优劣之分,在很多情况下,它们分别适用于不同的 场合。
这里我们说一下成员函数 UpdateData。该函数带有一个布尔类型的参数,如果 该参数为 FALSE,函数 UpdateData 将成员变量的值传递给对话框的变量;而如 果该参数为 TRUE,函数 UpdateData 将进行相反的过程。
具体值,而只需要记住相应的助记符。对于这里的编辑框控件,我们只需要记住 IDC_EDIT 即可,而不需要关心它等于 1001。接着,我们在 Styles 选项卡中设置 了 Multiline 属性,同时清除了 Auto HScroll 属性,两者共同作用使用得编辑 框 IDC_EDIT 支持多行文本,并且如文本行的长度超过编辑框宽度时自动回行。