控件是用户可与之交互以输入或操作数据的对象。控件通常出现在对话框中或工具栏上。本系列主题介绍三类主要控件:
- Windows 公共控件,包括所有者描述的控件
- ActiveX 控件
- 由 Microsoft 基础类库 (MFC) 提供的其他控件类
Windows 公共控件
Windows 操作系统总是提供了若干 Windows 公共控件。这些控件对象都是可编程的,Visual C++ 对话框编辑器支持将这些控件对象添加到对话框。Microsoft 基础类库 (MFC) 提供相应的类来封装这些控件中的每一个,如表 Windows 公共控件和 MFC 类中所示。(表中的某些项有进一步描述它们的相关主题。有关没有主题的控件的信息,请参见 MFC 类的文档。)
CWnd 类是所有窗口类(包括所有控件类)的基类。下列环境支持 Windows 公共控件:
- Windows 95、Windows 98 和 Windows 2000
- Windows NT 3.51 版及更高版本
- Win32 系列 1.3 版(Visual C++ 4.2 版及更高版本不支持 Win32 系列)
旧式公共控件在 Windows 的早期版本中同样可用,这些旧式公共控件包括复选框、组合框、编辑框、列表框、选项按钮、普通按钮、滚动条控件和静态控件。
ActiveX 控件
ActiveX 控件(以前称为 OLE 控件)可以在 Windows 应用程序的对话框中使用,或在万维网的 HTML 页中使用。有关更多信息,请参见 MFC ActiveX 控件。
其他 MFC 控件类
除了封装所有 Windows 公共控件的类和支持对您自己的 ActiveX 控件进行编程(或使用其他应用程序提供的 ActiveX 控件)的类以外,MFC 本身还提供了下列控件类:
- CBitmapButton
- CCheckListBox
- CDragListBox
查找关于 Windows 公共控件的信息
下表简要描述了每个 Windows 公共控件,包括控件的 MFC 包装类。
控件 | MFC 类 | 说明 | 是否是 Windows 95 中新增的类 |
---|---|---|---|
animation | CAnimateCtrl | 显示 AVI 视频剪辑的连续帧 | 是 |
button | CButton | 导致操作的普通按钮,也用于复选框、单选按钮和分组框 | 否 |
combobox | CComboBox | 编辑框和列表框的组合 | 否 |
date and time picker | CDateTimeCtrl | 使用户得以选择特定的日期或时间值 | 是 |
edit box | CEdit | 用于输入文本的框 | 否 |
extended combo box | CComboBoxEx | 具有图像显示功能的组合框 (ComboBox) 控件 | 是 |
header | CHeaderCtrl | 出现在文本列上方的按钮;控制文本的显示宽度 | 是 |
hotkey | CHotKeyCtrl | 使用户得以创建“热键”以快速执行操作的窗口 | 是 |
image list | CImageList | 用于管理大图标或位图集的图像集合(图像列表不是真正的控件;它支持其他控件所使用的列表) | 是 |
list | CListCtrl | 显示带图标的文本列表的窗口 | 是 |
listbox | CListBox | 包含字符串列表的框 | 否 |
month calendar | CMonthCalCtrl | 显示日期信息的控件 | 是 |
progress | CProgressCtrl | 指示长操作进度的窗口 | 是 |
rebar | CRebarCtrl | 可以包含控件形式的其他子窗口的工具栏 | 是 |
Rich Edit | CRichEditCtrl | 用户可以在其中用字符和段落格式进行编辑的窗口(请参见与 Rich Edit 控件相关的类) | 是 |
scroll bar | CScrollBar | 用作对话框内(而不是窗口上)的控件的滚动条 | 否 |
slider | CSliderCtrl | 包含带可选刻度线的滑块控件 (Slider Control) 的窗口 | 是 |
spin button | CSpinButtonCtrl | 一对箭头按钮,单击这两个按钮可增减值。 | 是 |
static-text | CStatic | 为其他控件加标签的文本 | 否 |
status bar | CStatusBarCtrl | 显示状态信息的窗口,类似 MFC 类的 CStatusBar | 是 |
tab | CTabCtrl | 类似笔记本中的分隔卡,用于“选项卡对话框”或属性表 | 是 |
toolbar | CToolBarCtrl | 具有命令生成按钮的窗口,类似 MFC 类的 CToolBar | 是 |
tool tip | CToolTipCtrl | 小的弹出窗口,描述工具栏按钮或其他工具的用途 | 是 |
tree | CTreeCtrl | 显示分层的项列表的窗口 | 是 |
MFC的类层次
MFC(微软基础类)也是一种应用程序框架,定义了应用程序的一般处理流程,用于对Windows API实现基于面向对象技术的封装,隐藏在Windows下使用C++编程的大量内部细节。在开发应用程序的过程中,编程人员可以通过对类库中已有类的继承,生成功能更加强大的类库以供自己所用。
在MFC中类的层次结构(即继承关系)如图5-3所示。
图5-3 MFC中类的层次结构 |
从图中可知,在MFC中大多数的类都派生于CObject类,它的主要作用是为子类提供一些基本的功能,这些派生类构成了MFC应用程序的基本框架,它们各自的功能描述如表5-1所示。
派生类 | 功能描述 |
CCmdTarget | 用于处理用户请求 |
CWinThread | 代表应用程序内部的执行线程 |
CWinApp | 应用程序的核心 |
CWnd | 为所有的窗口类提供基本的功能,处理常见的系统消息 |
CView | 用于显示数据并与文档对象进行交互 |
CFrameWnd | 应用程序的主框架 |
CDocument | 包含应用程序的数据集 |
下面将对上述表中各个类的功能进行具体的讲解。
1)CCmdTarget类
CCmdTarget类是MFC的消息映射基础类,MFC为该类设计了许多的成员变量及函数以解决消息映射的问题。派生于CCmdTarget的类可用于处理当用户选择菜单或单击按钮等操作时所产生的Command消息。
在实际的开发过程中,我们通常很少直接从CCmdTarget中派生类。当想要生成一个处理按键消息的类时,只需从继承于CCmdTarget类的框架子类CView、CWinApp、CDocument、CWnd和CFrameWnd中选择一个来充当父类即可。
2)CWinThread类
CWinThread类是MFC中用于封装线程的类,它的成员函数可以使MFC应用程序创建和管理包括UI及工作者在内的线程。每个MFC应用程序都至少应该使用一个从CWinThread派生的类,应用程序类CWinApp就是一个代表。
3)CWinApp类
CWinApp类通常代表应用程序自己,它封装了应用程序的初始化、运行及终止的过程。基于框架的应用程序必须有且仅有一个派生于CWinApp的类的对象,并在完成窗口的创建工作之前执行对该对象的构造。
应用程序类的对象需要完成以下工作。
初始化应用程序。
建立文档模板结构。
循环检索消息队列中的消息并将这些消息发送到指定的地方。
执行应用程序退出时的清理工作。
4)CDocument类
CDocument类是在使用文档/视图结构的应用程序中文档对象的基类,它为应用程序的文档对象提供了基本的功能,包括新建、串行化数据等。
5)CWnd类
CWnd类是所有MFC 窗口的基类,它封装了窗口的基本操作,包括窗口的创建、销毁、设置窗口风格等,以及窗口对大部分消息的默认响应。开发人员可以直接从CWnd派生其他类,但通常情况下我们并不这么做,而是通过继承CWnd的派生类生成新类。
6)CFrameWnd类
CFrameWnd类往往用于创建应用程序的主窗口,并定义了大量管理视图和文档对象的成员函数及变量。在编写文档/视图结构的应用程序时,视图对象等将作为CFrameWnd的子窗口实现对客户区的共享,并被CFrameWnd有序排列。
7)CView类
CView类是在使用文档/视图结构的应用程序中视图对象的基类,它是用户的主要操作界面。在应用程序中,一个视图对象通常只对应一个文档对象,但一个文档对象却可以关联多个视图对象,并且每个视图对象都以不同的形式来显示文档中的数据。
在上述CObject类的派生类中,CWinApp类、CDocument类、 CCmdTarget类及CWinThread类构成了应用程序的结构类,代表了应用程序的基本结构元素。换句话说,当一个应用程序开始运行时,这些类将最先实现初始化。
在类的层次结构中,应用程序类CWinApp是一个基于MFC应用程序的最外层对象容器,它不仅拥有诸如实例句柄等需要被传送到WinMain()函数中去的参数,还包含了应用程序的主框架窗口,当主框架窗口被关闭时,应用程序也就跟着结束了。因此,开发人员必须为程序创建一个全局的应用程序对象。
MFC类库越来越强大,其基本层次结构如图所示,箭头的方向是从派生类指向基类。 其中,CObject类是MFC提供的绝大多数类的基类。该类完成动态空间的分配与回收,支持一般的诊断、出错信息处理和文档序列化等。
CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息发送、等待和派遣(调度)等工作,实现应用程序的对象之间协调运行。
CWinApp类是应用程序的主线程类,它是从CWinThread类派生而来。CWinThread类用来完成对线程的控制,包括线程的创建、运行、终止和挂起等。
CDocument类是文档类,包含了应用程序在运行期间所用到的数据。
CWnd类是一个通用的窗口类,用来提供Windows 中的所有通用特性。
CView 是用于让用户通过窗口来访问文档以及负责文档内容的显示。
CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。
CDialog 类用来控制对话框窗口。
CMDIFrameWnd和CMDIChildWnd类分别用来多文档应用程序的主框架窗口和文档子窗口的显示和管理。
CMiniFrameWnd类是一种简化的框架窗口,它没有最大化和最小化窗口按钮,也没有窗口系统菜单,一般很少用到它。