1、使用 Windows 标准控件 我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。在 Visual C+中,可以使用的控件分成三类: (1) Windows 标准控件 Windows 标准控件由 Windows 操作系统提供,在 Windows 95 中还提供了一些新增的控件。所有这些控件对象都是可编程的,我们可以使用 Visual C+提供的对话框编辑器把它们添加到对话框中。Microsoft 基础类库 (MFC)提供了封装这些控件的类,它们列于表 6.1。 表 6.1 Windows 标准控件 控件 MFC 类 描述 动画 CAnimateC
2、trl 显示连续的 AVI 视频剪辑 按钮 CButton 用来产生某种行为的按钮,以及复选框、单选钮和组框 组合框 CComboBox 编辑框和列表框的组合 编辑框 CEdit 用于键入文本 标题头 CHeaderCtrl 位于某一行文本之上的按钮,可用来控制显示文件的宽度 热键 CHotKeyCtrl 用于通过按下某一组合键来很快的执行某些常用的操作 图象列表 CImageList 一系列图象 (典型情况下是一系列图标或位图 )的集合。图 象列表本身不是一种控件,它常常是和其它控件一起工作,为其它控件提供所用的图象列表 列表 CListCtrl 显示文本及其图标列表的窗口 列表框 CLis
3、tBox 包括一系列字符串的列表 进度 CProgressCtrl 用于在一较长操作中提示用户所完成的进度 多格式文本编辑 CRichEditCtrl 提供可设置字符和段落格式的文本编辑的窗口 滚动条 CScrollBar 为对话框提供控件形式的滚动条 滑块 CSliderCtrl 包括一个有可选标记的滑块的窗口 旋转按钮 CSpinButtonCtrl 提供一对可用于增减某个值的箭头 静态文本 CStatic 常用于为其它控件提供标签 状态条 CStatusBarCtrl 用于显示状态信息的窗口,同 MFC类 CStatusBar 类似 续表 6.1 控件 MFC 类 描述 选项卡 CTab
4、Ctrl 在选项卡对话框或属性页中提供具有类似笔记本中使用的分隔标签的外观的选项卡 工具条 CToolBarCtrl 具有一系列命令生成按钮的窗口,同 MFC 类 CToolBar 类似 工具提示 CToolTipCtrl 一个小的弹出式窗口,用于提供对工具条按钮 或其它控件功能的简单描述 树 CTreeCtrl 用于显示一系列的项的继承结构 前面提到过,在 MFC 中,类 CWnd 是所有窗口类的基类,很自然的,它也是所有控件类的基类。 Windows标准控件在以下环境下提供: Windows 95 Windows NT 3.51 及以后版本 Win32s 1.3 注意: Visual C+
5、 4.2 及以后版本不再支持 Win32s。 (2) ActiveX 控件 ActiveX 控件可用于对话框中,也可用于 HTML 文档中。这种控件过去被称为 OLE 控件。本书将在专门的章节中来讲述关于 ActiveX 控件的知识。这里仅指出 ActiveX 控件使用了与标准控件完全不同的接口和实现方法。 (3) 其它 MFC 控件类 除了 Windows 标准控件和自己编写的或者来自于第三方软件开发商的 ActiveX 控件以外, MFC 还提供了另外三种控件,它们由下面的三个类进行封装: 类 CBitmapButton 用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别
6、代表按钮的四种不同状态。 类 CCheckListBox 用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定该项是 否被选中。 类 CDragListBox 用于创建一种特殊的列表框,这种列表框允许用户移动列表项。 在本章我们仅讲述第一类控件,即 Windows 标准控件。所涉及的内容包括各个控件的使用及相应的技巧。 第一节 使用对话框编辑器和 ClassWizard 对于大多数 Windows 标准控件,我们一般都使用对话框编辑器来将它们添加到对话框中。 图 6. 1 在 ResourceView 中选择对话框 IDD_DIALOGDEMO_DIALOG 图 6. 2 控件的
7、Properties 对话框 图 6. 3 对话框编辑器的 Controls 工具窗口 在下面的过程中,我们 将一个编辑框控件添加到在第四章创建的基于对话框的 MFC 框架应用程序的主对话框窗口中。 1. 首先,在 Workspace 窗口的 ResourceView 选项内双击 DialogDemo resourcesDialog 节点下的IDD_DIALOGDEMO_DIALOG 图标。上面的操作如图所示。 2. 用鼠标选中标有“要做”的静态文本控件。右击鼠标,从上下文菜单中选择 Properties,打开如图 6.2 所示的对话框,在 Caption 文本框中输入新的控件文本:“在下面的
8、文本框中输入一些字符”,然后将静态文本控件拖 动到对话框的左上角。 3. 从 Controls 工具窗口 (如图 6.3 所示,如果在你的资源编辑器中看不到该工具窗口,可以在工具条上右击鼠标,从上下文菜单中选择 Controls)中选择编辑控件图标 ,在对话框中绘制一个编辑框控件,如图 6.4 所示。 在该编辑框控件的 Properties 窗口的 General 选项卡中输入其 ID 为 IDC_EDIT。然后在 Styles 选项卡下将 Multiline 复选框划上勾,并消除 Auto HScroll 复选框前的勾。 4. 右击该编辑框控件,从上下文菜单中选择 ClassWizard 命
9、令,打开 ClassWizard 对话框,该对话框看起来如图 6.5 所示。 图 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_
10、strEdit (这里 m 表示该变量为类 CDialogDemoDlg 的一个成员变量, str 表明其类型为字符串,即类 CString),在 Category 下拉列表中选择 Value (另一种选择是 Control,两种选择的不同将在后面的内容中讲述 ),在 Variable type 下拉列表中选择CString (还有其它很多数据类型可供选择,但由于这里编辑框中的内容为一字符串,因此 CString是最恰当的选择 )。单击 OK 关闭对话框。 图 6. 6 为控件映射添加成员变量 5. 检查一下现在的 ClassWizard 对话框 (图 6.7)与图 6.5 相比有何不同。在图
11、 6.7 所示的对话框中下方的 Maximum characters 文本框中输入 50。由字面意思可以很容易猜出其含义,即将编辑框IDC_EDIT 中可能的最长字符串的大小限制为 50。单击 OK 关闭对话框。 图 6. 7 使用 ClassWizard 设置数据验证方案 6. 从 Workspace 窗口的 ClassView 中双击类 CDialogDemoDlg 的 OnInitDialog 成员函数,使用下面的代码来代替位于语句 return TRUE; 前的 / TODO 注释: m_strEdit=“您好 ! 请在这里输入一些字符串。 “; UpdateData(FALSE);
12、7. 在 ClassView 中双击类 CDialogDemoApp 的 InitInstance 成员函数,使用下面的代码来找替位于选择 支 if (nResponse = IDOK) 下的 /TODO 注释: AfxMessageBox(dlg.m_strEdit); 然后将同一成员函数中的下面的代码行删掉 (或注释掉 ): m_pMainWnd = 8. 编译并运行该应用程序。显示如图 6.8 所示的对话框。 图 6. 8 示例程序 DialogDemo 的运行结果 在图 6.8 所示的文 本框中输入一些字符,单击“确定”。随即弹出如图 6.9 所示的消息框。该消息框复述了用户在图 6.
13、8 所示的对话框中的输入。我们还发现,在图 6.8 所示的对话框中,当输入字符串达到一定的长度之后,我们不可以再输入更多的字符,这是我们在前面设置了 Maximum characters 为 50 的结果。 图 6. 9 以消息框的形式反馈输入的字符串 下面我们来看在上面的步骤 中都完成了什么。首先我们使用资源编辑器向对话框模板中添加这些标准控件,这一步的概念很清晰,因此并不难理解。 然后,我们打开了所绘制的编辑框的 Properties (属性 )对话框。先将其控件 ID 设置为 IDC_EDIT。这时如果打开头文件 Resource.h,就会发现宏 IDC_EDIT 被定义为常量 1001
14、。不过,事实上在很多情况下我们并不需要关心每一控件的 ID 的具体值,而只需要记住相应的助记符。对于这里的编辑框控件,我们只需要记住 IDC_EDIT 即可,而不需要关心它等于 1001。接着,我们在 Styles 选项卡中设置了 Multiline 属性,同时清除了 Auto HScroll 属性,两者共同作用使用得编辑框 IDC_EDIT支持多行文本,并且如文本行的长度超过编辑框宽度时自动回行。 下面的步骤是最重要的一步,我们动用了功能强大的工具 ClassWizard。首先,我们将编辑框与一个 CString 对象相关联,这使用了一种被称为 Dialog Data Exchange (D
15、DX)的机制。在这种机制中,我们先在处理函数 OnInitDialog 或对话框类的构造函数中对对话框对象的成员变量进行初始化,在对话框显示之前,框架的 DDX 机制将成员变量的值传递给对话框中的控件。这个过程在成员函数DoModal 或 Create 被调用的过程中发生。类 CDialog 中对 OnInitDialog 成员函数的默认实现调用了类 CWnd 成员函数 UpdateData 来初始化对话框中的控件。这时我们就可以看到前面的第 6 步还可在具有下面的几种变通方案: 1. 将代码行 m_strEdit=“您好 ! 请在这里输入一些字符串。 “; 移到对基类的 OnInitDial
16、og 成员函数的调用之前,即位于下面的代码之前: CDialog:OnInitDialog(); 2. 将代码 m_strEdit=“您好 ! 请在这里输入一些字符串。 “; 移到类 CDialogDemoDlg 的构造函数中。 对于上面的两种方法,与前面第 6 步中使用的方法相比,我们没有必要调用类 CWnd 的成员函数UpdateData。因为该函数在类 CDialog 的成员函数 OnInitDialog 中将被调用。 这三种方法之间并没有明确的优劣之分,在很多情况下,它们分别适用于不同的场合。 这里我们说一下成员函数 UpdateData。该函数带有一个布尔类型的参数,如果该参数为 F
17、ALSE,函数 UpdateData 将成员变量的 值传递给对话框的变量;而如果该参数为 TRUE,函数 UpdateData 将进行相反的过程。 如果用户单击了对话框中 ID 为 IDOK 的按钮,或者以 TRUE 为参数调用函数 UpdateData,DDX 机制从控件中将值传递到成员变量,同时对话框数据验证 (dialog data validation,DDV)机制根据设定的验证规则验证所有数据项。 在数据交换的过程中,成员函数 UpdateData 先创建一个 CDataExchange 对象,然后调用对话框对类 CDialog 成员函数 DoDataExchange 的重载版本。该
18、 CDataExchange 对象将作为成员函数DoDataExchange 的一个参数,该参数定义了数据交换的上下文。 在 DoDataExchange 中,我们为每一个数据成员指定了一个对 DDX 函数的调用。每一个函数定义了基于由成员函数 UpdateData所提供的 CDataExchange参数所确定的上下文而进行的双向数据交换。 下面的代码摘自实现文件 DialogDemo.cpp 中对函数 DoDataExchange 的定义: void CDialogDemoDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchang
19、e(pDX); /AFX_DATA_MAP(CDialogDemoDlg) DDX_Text(pDX, IDC_EDIT, m_strEdit); DDV_MaxChars(pDX, m_strEdit, 50); /AFX_DATA_MAP 在两行注释 /AFX_DATA_MAP 和/AFX_DATA_MAP 之间的代码部分称作数据映射。函数 DDX_Text使用 CString 对象 m_strEdit 与 ID 为 IDC_EDIT 的编辑框控件相关联。函数 DDV_MaxChars 设置与编辑框控件 IDC_EDIT 相关联 CString 对象 m_strEdit 的最大长度为 50
20、。 需要注意的是,如果用户在模式对话框中单击了“取消” (Cancel)按钮, DoModal 函数将返回值IDCANCEL,在这种情况下,在对话框和对话框对象之前的数据交换不会发生。 由于这个原因,如果 DoModal 函数返回了值 IDOK,我们可以使用下面的代码来复述用户在对话框中所输入的值: AfxMessageBox(dlg.m_strEdit); 注意: 在前面的第 7 步中有一个乍看起来有一些费解的过程,这就是我们为什么要将下面的代码从函数 OnInitDialog 中删除: m_pMainWnd = 这基于下面的一个事实: 类 CWinThread 的数据成员 m_pMainW
21、nd 有一个有用的特征,如果由该成员所引用的窗口被关闭的话, MFC 库将自动的终止 CWinThread 对象所代表的线程。这样,如果我们将指向 dlg 的指针赋予了成员变量 m_pMainWnd,那么,无论我们单击了“确认”还是“取消”,应用程序的主线程都将被自动终止,之后的代码当然不会得到执行。而在本示例中,我们希望在对话框被关闭后程序继续运行 (即弹出一个消息重述用户所输入的内容 ),因此不应该将 dlg 对象的指针赋予成员变量 m_pMainWnd,从而需要将前面的代码从函数 OnInitDialog 中删除。 第二节 所有窗口类的基类: CWnd 在 MFC 中类 CWnd 是一个
22、很重要的类,它封装了 Windows 窗口句柄 HWND。在 Windows 编程中,窗口句柄唯一的标识了一个窗口。然而,尽管类 CWnd 的对象和窗口句柄之间有着如此紧密的联系,但两者并不是等同的概念。 CWnd 对象通过类 CWnd 的构造函数和析构函数创建 和消毁,而 Windows 窗口是 Windows 内部的一种数据结构,在类 CWnd 中,它通过 Create 成员函数创建,通过其析构函数消毁。除此之外,成员函数 DestroyWindow 可以消毁 Windows 窗口,而不需要消毁 CWnd 对象。 传统的 Windows 应用程序中,消息是通过一个称作窗口过程 (windo
23、w procedure,通常具有 WndProc之类的函数名 )的回调函数来处理的。这种方式在 MFC 中仍然使用,但为 CWnd 类及其消息映射所隐藏。在类 CWnd 中, Windows 通知消息会被自动的通过消息映射传递到类 CWnd 中合适的 OnMessage成员函数 (这里 OnMessage 是指这些函数具有的以 On 为前缀的函数名,如 OnPaint 和前面接触到的OnInitDialog 等)进行处理。通常我们都在类 CWnd 的派生类中重载需要处理的特定消息所对应的OnMessage 成员函数。除了直接从 CWnd 派生新的窗口类以外,我们更倾向于从 MFC 中定义的其它
24、类,如 CFrameWnd、CMIDFrameWnd、CMDIChileWnd、CView 和 CDialog 以 及 CButton 之类的控件类派生新的窗口类。在 MFC 中定义的这些类本身也 是从 CWnd 派生的。 通常我们使用两个步骤来创建一个窗口:首先,调用类 CWnd 的构造函数来构造一个 CWnd 对象,然后调用其成员函数 Create 来创建窗口并将该窗口与所创建的 CWnd 对象相关联。 当用户终止该窗口时,消毁与之相关联的 CWnd 对象,或者调用 CWnd 对象的成员函数 DestroyWindow删除窗口并消毁其数据结构。 大多数以 HWND 为参数的 Win32 A
25、PI 函数都已作为类 CWnd 的成员函数进行了封装,事实上,很多时候我们通过类 Wnd 的派生类调用的成员函数并不是由派生类本身所提供的,而是在类 CWnd 中进行定义的。下面我们分类给出在 CWnd 类中定义的各类成员函数。完整而详尽的说明每一个成员函数在本书中是不现实的,这里我们仅给出对每一个成员函数的简短说明,以便读者在编程时能够很快的查找到所需的函数,这时再去查找有关于该函数的详细的说明就不是一件困难的事了。 1. 类 CWnd 的数据成员 (表 6.2): 表 6. 2 类 CWnd 的数据成员 数据成员 描述 m_hWnd 与该 CWnd 对象相关联的 Windows 窗口句柄(
26、HWND) 2. 构造函数 /析构函数 (表 6.3) 表 6. 3 类 CWnd 的构造函数和析构函数 成员函数 获得图标句柄 SetIcon 设置句柄为一指定图标 GetWindowContextHelpId 获得帮助上下文标识符 SetWindowContextHelpId 设置帮助上下文标识符 ModifyStyle 修改当前窗口样式 ModifyStyleEx 修改当前窗口的扩展样式 5. 窗口大小和位置函数 (表 6.6) 表 6. 6 类 CWnd 的窗口大小和位置成员函数 成员函数 描述 GetWindowPlacement 获得显示状态和窗口的正常、最小化和最大化位置 Set
27、WindowPlacement 设置显示状态和窗口的正常、最小化和最大化位置 GetWindowRgn 获得窗口的窗口区域的拷贝 SetWindowRgn 设置窗口区域 IsIconic 判断窗口是否被最小化 (图标化 ) IsZoomed 判断窗口是否被最大化 MoveWindow 改变窗口的位置和度量 SetWindowPos 改变子窗口、弹出式窗口或顶层窗口的大小、位置和顺序 ArrangeIconicWindows 排列所有最小化的子窗口 BringWindowToTop 将 CWnd 对象放到覆盖窗口 栈的顶部 GetWindowRect 获得 CWnd 对象的屏幕坐标 GetCli
28、entRect 获得 CWnd 对象客户区的度量 6. 窗口访问函数 表 6. 7 类 CWnd 的窗口访问成员函数 成员函数 描述 ChildWindowFromPoint 判断包含指定点的子窗口 FindWindow 返回由其窗口名称和窗口类标识的窗口的句柄 GetNextWindow 返回窗口管理器列表中的下一个 (或上一个)窗口 GetOwner 返回指向 CWnd 对象的所有者的指针 续表 6.7 成员函数 描述 SetOwner 改变 CWnd 对象的所有者 GetTopWindow 返回属于 CWnd 对象的第一个子窗口 GetWindow 返回与当前窗口有指定关系的窗口 Get
29、LastActivePopup 判断由 CWnd 对象所有的弹出窗口中最近激活的窗口 IsChild 判断 CWnd 对象是否为一个子窗口 GetParent 如果存在的话,获得 CWnd 对象的父窗口 GetSafeOwner 获得给定窗口的安全的所有者 SetParent 改变父窗口 WindowFromPoint 标识包括给定点的窗口 GetDlgItem 从指定的对话框获得标准符为指定ID 的控件 GetDlgCtrlID 如果 CWnd 为一子窗口,返回其 ID 值 SetDlgCtrlID 当 CWnd 对象为一子窗口 (不仅指对话框中的控件 )时,为其指定控件 ID 或窗口 ID
30、 GetDescendantWindow 检查所有下级窗口 (descendant window)并返回具有指定 ID 的窗口 GetParentFrame 获得 CWnd 对象的父框架窗口 SendMessageToDescendants 发送一条消息到窗口的所有下级窗口 GetTopLevelParent 获得窗口的顶层父窗口 GetTopLevelOwner 获得窗口的顶层所有者窗口 GetParentOwner 返回指向子窗口的父窗口的指针 GetTopLevelFrame 获得窗口的顶层框架窗口 UpdateDialogControls 用来更新对话框按钮或其它控件的状态 Updat
31、eData 初始化对话框或从对话框中获取数据 CenterWindow 相对于父窗口使窗口居中 7. 更新和绘制函数 (表 6.8) 表 6. 8 类 CWnd 的更新和绘制函数 成员函数 描述 BeginPaint 为重绘操作准备 CWnd 对象 EndPaint 标记重绘操作的结束 续表 6.8 成员函数 描述 Print 在指定的设备上下文绘制当前窗口 PrintClient 在指定的设备上下文 (通常是打印机 )绘制所有窗口 LockWindowUpdate 禁止或重新允许绘制指定的窗口 UnlockWindowUpdate 解除 CWnd:LockWindowUpdate 对窗口的锁
32、定 GetDC 获得客户区的显示上下文 GetDCEx 获得客户区的显示上下文,并在绘制过程中允许裁剪 RedrawWindow 在客户区中更新指定的矩形或区域 GetWindowDC 获得整个窗口的显示上下文,包括标题条,菜单和滚动条 ReleaseDC 释放客户区或窗口设备上下文,并使其可为其它程序所使用 UpdateWindow 更新客户区 SetRedraw 决定在 CWnd 对象中的改变是否被重绘 GetUpdateRect 获得完全覆盖 CWnd 对象的更新区域的最小矩形坐标 GetUpdateRgn 获得 CWnd 对象的更新区域 Invalidate 使用整个客户区无效 Inv
33、alidateRect 通过将给定矩形添加到当前更新区域来使包括在给定矩形内的客户区无效 InvalidateRgn 通过将给定区域添加到当前更新区域来使包括在给定区域内的客户区无效 ValidateRect 通过将给定矩形从当前更新区域中移出来使包括在给定矩形内的客户区有效 ValidateRgn 通过将给定区域从当前更新区域中移出来使包括在给定区域内的窗户区有效 ShowWindow 显示或隐藏窗口 IsWindowVisible 判断窗口是否可见 ShowOwnedPopups 显示或隐藏 窗口拥有的所有弹出式窗口 EnableScrollBar 允许或禁止滚动条上的一个或两个箭头 8.
34、 坐标映射函数 (表 6.9) 表 6. 9 类 CWnd 的坐标映射函数 成员函数 描述 MapWindowPoints 从 CWnd 对象的坐标空间映射一系列点到另一窗口的坐标空间 续表 6.9 成员函数 描述 ClientToScreen 转换给定点的客户坐标或显示矩形到屏幕坐标 ScreenToClient 转换给定点的屏幕坐标或显示矩形到客户坐标 9. 窗口文本函数 (表 6.10) 表 6. 10 类 CWnd 的窗口文本函数 成员函数 描述 SetWindowText 设置窗口文本或标题条 (如果有的话 )为指定文本 GetWindowText 获得窗口文本或标题条 GetWin
35、dowTextLength 返回窗口文本或标题条的长度 SetFont 设置当前字体 GetFont 获得当前字体 10. 滚动函数 (表 6.11) 表 6. 11 类 CWnd 的滚动成员函数 成员函数 描述 GetScrollPos 获得滚动框的当前位置 GetScrollRange 拷贝给定滚动框中滚动块的当前最大和最小位置 ScrollWindow 滚动客户区的内容 ScrollWindowEx 滚动客户区内容。与ScrollWindowEx 类似,但具有一些附加特性 GetScrollInfo 获得关于某一滚动条的由SCROLLINFO 结构维护的信息 GetScrollLimit
36、 获得滚动条的限制 SetScrollInfo 设置关于滚动条的信息 SetScrollPos 设置滚动条的当前位置,并在指定的情况下重绘滚动条以反映新的位置 SetScrollRange 设置给定滚动条的最小和最大位置值 ShowScrollBar 显示或隐藏滚动条 EnableScrollBarCtrl 允许或禁止兄弟滚动条控件 GetScrollBarCtrl 返回兄弟滚动条控件 RepositionBars 在客户区中对控件条重定位 11. 拖放函数 (表 6.12) 表 6. 12 类 CWnd 的拖放成员函数 成员函数 描述 DragAcceptFiles 使窗口可以接受文件拖放
37、12. 插入符函数 (表 6.13) 表 6. 13 类 CWnd 的插入符成员函数 成员函数 描述 CreateCaret 新的插入符形状,并获得该插入 符的所有权 CreateSolidCaret 创建方块形状的插入符,并获得该插入符的所有权 CreateGrayCaret 创建变灰方块形状的插入符,并获得该插入符的所有权 GetCaretPos 获得插入符当前位置的客户坐标 SetCaretPos 移动插入符到指定的位置 HideCaret 隐藏插入符 ShowCaret 在插入符的当前位置显示插入符 13. 对话框项函数 (表 6.14) 表 6. 14 类 CWnd 的对话框项函数
38、成员函数 描述 CheckDlgButton 在按钮控件前放置 选中标记或清除按钮控件的选中标记 CheckRadioButton 选中指定的单选钮并清除指定给中其它所有单选钮的选中标记 GetCheckedRadioButton 返回一组按钮中当前选中单选钮的 ID DlgDirList 使用文件或目录列表填充一列表框 DlgDirListComboBox 使用文件或目录列表填充一组合框的列表框 DlgDirSelect 从一列表框中获得当前选择 DlgDirSelectComboBox 从一组合框的列表框中获得当前选择 GetDlgItemInt 将给定 对话框中某一控件的文本转换为一个整
39、数值 GetDlgItemText 获得与某一控件相关联的标题或文本 GetNextDlgGroupItem 查找同一组中的下一个 (或前一个)控件 续表 6.14 成员函数 描述 GetNextDlgTabItem 查找在指定控件之前 (或之后 )的第一个具有 WS_TABSTOP 样式的控件 IsDlgButtonChecked 判断一个按钮控件是否选中 IsDialogMessage 判断一个给定消息是否影响非模态对话框,如果是,处理该消息 SendDlgItemMessage 向指定的控件发送一条消息 SetDlgItemInt 使某一控件的文本为某一给定整数值 SetDlgItemT
40、ext 设置指定对话框中某一控件的标题或文本 SubclassDlgItem 将一个 Windows控件与 CWnd对象相关联,并使其通过 CWnd 对象的消息映射传递消息 ExecuteDlgInit 初始化对话框资源 RunModalLoop 为一模态窗口获取、翻译或发送消息 ContinueModal 使一窗口继续保持模态 EndModalLoop 结束某一窗口的模态状态 14. 数据绑定函数 (表 6.15) 表 6. 15 类 CWnd 的数据绑定成员函数 成员函数 描述 BindDefaultProperty 将调用对象的默认简单绑定属性(该属性在类型库中标记 )绑定至相关联的数据
41、源控件的游标 BindProperty 将数据绑定控件的游标绑定属性绑定至数据源控件,并使用 MFC 绑定管理器注册绑定关系 GetDSCCursor 获得指向由数据源控件的数据源、用户名、密码和 SQL 属性定义的底层游标的指针 15. 菜单函数 (表 6.16) 表 6. 16 类 CWnd 的菜单成员函数 成员函数 描述 GetMenu 获得指向指定菜单的指针 SetMenu 设置菜单为指定的菜单 DrawMenuBar 重绘菜单条 GetSystemMenu 允许应用程序访问控制菜单以进行复制和修改 续表 6.16 成员函数 描述 HiliteMenuItem 加亮顶层菜单项或移去顶层
42、菜单项的加亮显示 16. 工具提示函数 (表 6.17) 表 6. 17 类 CWnd 的工具提示函数 成员函数 描述 EnableToolTip 允许工具提示控件 CancelToolTip 禁止工具提示控件 FilterToolTipMessage 获得对话框中与某一控件相关联的标题或文本 OnToolHitTest 判断一个点是否在指定工具的绑定矩形内,并获得该工具的信息 17. 计时器函数 (表 6.18) 表 6. 18 类 CWnd 的计时器成员函数 成员函数 描述 SetTimer 安装系统计时器,计时器触发时发送WM_TIMER 消息 KillTimer 消除系统计时器 18.
43、 提示函数 (表 6.19) 表 6. 19 类 CWnd 的提示成员函数 成员函数 描述 FlashWindow 闪烁窗口一次 MessageBox 创建并显示一个包括应用程序提供的消息和标题的窗口 19. 窗口消息函数 (表 6.20) 表 6. 20 类 CWnd 的窗口消息成员函数 成员函数 描述 GetCurrentMessage 返回窗口正在处理的消息的指针。仅当在一个 OnMessage 消息处理函数中调用该成员函数。 Default 调用默认窗口过程,该过程提供对所有应用程序未处理的消息的默认处理 PreTranslateMessage 由 CWinApp 使用,在窗口消息被发
44、送到 TranslateMessage 和DispatchMessage 之前对其进行过滤 续表 6.20 成员函数 描述 SendMessage 将一条消息发送到 CWnd 对象,直至该对象处理该消息之后才返回 PostMessage 将一条消息放入程序的消息队列,不等待窗口处理该消息就立即返回 SendNotifyMessage 将指定消息发送到窗口,并尽可能快的返回,这依赖于调用线程如何创建窗口 20. 剪贴板函数 (表 6.21) 表 6. 21 类 CWnd 的剪贴板函数 成员函数 描述 ChangeClipboardChain 从剪贴板查看器链中移去 CWnd 对象 SetClip
45、boardViewer 添到 CWnd 对象到窗口链,这些窗口当剪贴板内容改变时会收到通知 OpenClipboard 打开剪贴板。其它程序仅当Windows CloseClipboard函数被调用时才可以更改剪贴板 GetClipboardOwner 获得剪贴板的当前拥有者的指针 GetOpenClipboardWindow 获得指向当前打开剪贴板的窗口的指针 GetClipboardViewer 获得指向剪贴板查看器链中第一个窗口的指针 21. OLE 控件函数 (表 6.22) 表 6. 22 类 CWnd 的 OLE 控件函数 成员函数 描述 SetProperty 设置 OLE 控件
46、属性 OnAmbientProperty 实现环境属性值 GetControlUnknown 获得指向一未知 OLE控件的指针 GetProperty 获得一 OLE 控件的属性 InvokeHelper 调用 OLE 控件方法或属性 22. 可重载函数 (表 6.23) 表 6. 23 类 CWnd 的可重载成员函数 成员函数 描述 WindowProc 为 CWnd 对象提供一个窗口过程。默认的窗口过程通过消息映射发送消 息 DefWindowProc 调用默认窗口过程,该过程提供应用程序未处理的所有窗口消息的默认处理 PostNcDestroy 在窗口被消毁后由 OnNcDestroy
47、函数调用 OnNotify 由框架调用以通知父窗口某一事件在某一控件中发生或者该控件需要信息 OnChildNotify 由父窗口调用以给通知控件一个响应控件通知的机会 DoDataExchange 用于对话框数据交换和验证。由 UpdateData调用 其余函数包括对各种窗口消息的消息处理函数,这些函数为数众多,这里我们限于篇幅不再 一一介绍。类 CWnd 中定义的消息处理函数几乎都具有一致的命名方式,其格式为前缀 On 再加上相应的消息名,如 WM_PAINT 消息的处理函数在类 CWnd 中被命名为 OnPaint。因此,只需知道所需处理的消息,就可以很快的推知该消息的处理函数名。 第三
48、节 按钮 在本节中要讲述的实际包括四种控件:下压按钮、单选钮、复选框和组框,它们之间无论在外观还是在使用上都有较大的差异。在 MFC 中之所以使用一个类 CButton 来封装这四种不同控件纯粹出于历史的原因。这使得一些使用过 Visual Basic 之类的编程工具的程序员可能 会有一点混淆,但相信只需要很短的时间就可以习惯这一点转变。 下面我们分别讲述这四种按钮控件: 6.3.1 下压按钮 在基于对话框的应用程序中,下压按钮是最常见的控件之一,如图 6.10 所示。 图 6. 10 下压按钮 下面的步骤讲述如何向对话框中添加下压按钮控件。 1. 在 ResourceView 中双击需要添加
49、下压按按钮控件的对话框模板, Developer Studio 将在资源编辑器中打开该对话框模板。如图 6.11 所示。 2. 在图 6.3 所示的控件工具窗口中选择图标 ,直接使用鼠标在对话框中绘制出一个下压按钮。 3. 右击所绘制的下压按钮,选择 Properties 命令打开其属性对话框,设置下压按钮的各项属性。下面详细描述这些属性的含义: 图 6. 11 在资源编辑器中打开一对话框模板 图 6. 12 在对话框中绘制下压按钮控件 一般属性: ID: 在头文件中定义的符号。类型:符号、整数或用引号括起来的字符串 Caption: 控件标签文本。如果在标题中的某个字母前加上了“ 第二种方法: 1. 在资源编辑器中右击按钮 IDC_CLICKHERE,选择 Events 命令,打开如图 6.15 所示的对话框: 2. 在 Class or object to handle 列表框中选择 IDC_CLICKHERE,然后在 New Windows messages/events 列表框中选择 BN_CLICKED,单击右边的 Add and Edit,余下的步骤同第一种方法的第 2 步开始相同。 这时编译并运行上面的程序,单击标签为“单击这里”的下压按钮,弹出如图