版权所有 复制必究 第7章 对话框和控件
对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。 对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。本章主要介绍对话框的工作原理和编程方法,并通过实例学习一些标准控件和公共控件的使用方法。
7.1 对话框概述 就用户交互输入功能而言,菜单和工具栏的功能是极其有限的。而对话框除了用来显示提示信息(如程序启动时显示版权和运行进度信息),一个主要功能是用于接收用户的输入数据。 在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。 对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框,当然,对话框也可以作为一个程序的主界面。
7.1.1 基于对话框的应用程序 可以直接利用MFC AppWizard向导创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择Dialog Based项。此时,应用程序向导将出现与单文档和多文档程序向导不同的操作步骤,因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。 按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化工作方式。利用向导创建应用程序的框架后,程序员可根据程序具体功能要求添加代码。
例 编写一个对话框应用程序MyDialog,程序运行后显示一个对话框,并在对话框上显示文本串。 1.执行File|New命令出现New对话框,选择MFC AppWizard[exe]项,输入程序名MyDialog,单击OK按钮。在随后出现的MFC AppWizard-Step 1对话框窗口中选择Dialog Based选项,单击Finish按钮就创建了应用程序项目,并在Developer Studio中打开了对话框编辑器和控件工具栏。 2.去掉对话框中标题为“TODO: 在这里设置对话控制”的静态文本控件,调整对话框大小,在成员函数CMyDialogDlg::OnPaint()中添加代码。
void CMyDialogDlg::OnPaint() { . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSPARENT); dc.TextOut(20, 50, "这是一个对话框应用程序!"); CDialog::OnPaint(); }
7.1.2 对话框类CDialog MFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是CDialog类的派生类。CDialog类还是其它所有对话框类的基类,其派生关系如下所示: CObject CCmdTarget CWnd CDialog
对话框类为程序员提供了管理对话框的编程接口。 CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。在你的CDialog类的派生类中可以直接调用CDialog类的成员函数。大部分的成员函数是虚函数,可以在你的派生类中重载,以实现特定的目的。除了CDialog类成员函数,类CWnd和CWinApp也提供了一些成员函数用于对话框的管理。
有关对话框的常用处理函数 CDialog::CDialog() 通过调用派生类构造函数,根据对话框资源模板定义一个对话框。 CDialog::DoModal() 激活模态对话框,显示对话框窗口。 CDialog::Create() 根据对话框资源模板创建非模态对话框窗口。如果对话框不是Visible属性,还需通过调用CWnd::ShowWindow()函数显示非模态对话框窗口。 CDialog::OnOk() 单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。 CDialog::OnCancel() 单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,关闭对话框。
CDialog::OnInitDialog() WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。 CDialog::EndDialog() 用于关闭模态对话框窗口。 CWnd::ShowWindow() 显示或隐藏对话框窗口 CWnd::DestroyWindow() 关闭并销毁非模态对话框 CWnd::UpdateData() 通过调用DoDataExchange()设置或获取对话框控件的数据 CWnd::DoDataExchange() 被UpdateData()调用以实现对话框数据交换,不能直接调用。
CWnd::GetWindowText() 获取对话框窗口的标题 CWnd::SetWindowText() 修改对话框窗口的标题 CWnd::GetDlgItemText() 获取对话框中控件的文本内容 CWnd::SetDlgItemText() 设置对话框中控件的文本内容 CWnd::GetDlgItem() 获取控件或子窗口的指针 CWnd::MoveWindow() 用于移动对话框窗口 CWnd::EnableWindow() 使窗口处于禁用或可用状态
7.1.3 对话框数据交换DDX和验证DDV 在对话框中实现用户数据输入和输出的一般方法是通过ClassWizard类向导将对话框控件与成员变量相关联,利用对话框数据交换DDX(Dialog Data Exchange)和验证DDV(Dialog Data Validation)机制实现数据的输入和输出。 当利用ClassWizard类向导添加成员变量时,用户如果在窗口的左下角输入数据的范围,ClassWizard将自动加入函数DDV的调用代码。
例如,当添加一个UINT型的成员变量m_nInput时指定它的最小值和最大值分别为0和100,则ClassWizard类向导将在成员函数DoDataExchange()中添加以下DDV函数的调用语句: DDV_MinMaxUInt(pDX, m_nInput, 0, 100); 程序运行后,如果用户的输入数据超出0~100的范围,DDV将显示一个提示信息对话框(例7-2c),提示用户有效的输入范围。
UpdateData()的用法: 当调用UpdateData(TRUE)时,MFC通过调用DDX函数将数据从控件传递到关联的成员变量;当调用UpdateData(FALSE)时,MFC通过调用DDX函数将数据从成员变量传递到关联的的控件。利用UpdateData()函数实现了在刷新后重新获取成员变量。
注意: 表面上看程序并没有调用UpdateData(),但是,当程序调用CDialog::DoModal()创建并显示对话框时,将自动调用CDialog::OnInitDialog()完成初始化的工作。在OnInitDialog()中调用了UpdateData(FALSE),将数据从成员变量传递到关联的控件,从而显示在控件中。而单击OK按钮将调用CDialog::OnOk()函数,在OnOK()中调用了UpdateData(TRUE),将数据从控件传递到关联的成员变量。 由此看来,不管MFC将DDX技术如何复杂化,我们只需知道,DDX就如同一条双向通道,而方向控制开关就是UpdateData()函数中的BOOL类型参数是TRUE还是FALSE。
7.1.4 提示信息对话框 提示信息对话框也称消息对话框,用来显示有关的提示信息。提示信息对话框是一种最简单的对话框,不需要用户自己创建它就可以直接使用,Visual C++提供了相应的函数实现这样的功能。: int AfxMessageBox(LPCTSTR lpText, UINT nType=MB_OK, UINT nlDHelp=0); int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT nType); int CWnd::MessageBox(LPCTSTR lpText, LPCTSTR lpCaption=NULL, UINT nType=MB_OK);
这三个函数分别是MFC全局函数、API函数和CWnd类的成员函数,它们的功能基本相同,但适用范围有所不同。AfxMessageBox()和::MessageBox()可以在程序中任何地方使用,而CWnd::MessageBox()只能用于控件、对话框、窗口等一些窗口类中。 例如,在软件安装过程中为了弹出如下图所示的警告提示信息对话框并进行相应的处理:
int nChoice=MessageBox("文件复制失败!", "错误", 编写的代码如下: int nChoice=MessageBox("文件复制失败!", "错误", MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) { case IDABORT: // 用户按下"终止"按钮 . . . . . . case IDRETRY: // 用户按下"重试"按钮 case IDIGNORE: // 用户按下"忽略"按钮 }
7.2 使用对话框 为了在屏幕上显示对话框: (1)首先需要建立对话框资源及其与资源相关的对话框类; (2)然后添加控件、与控件关联的成员变量和消息处理函数; (3)最后在程序中显示对话框并访问与控件关联的成员变量。 在Visual C++中可以利用集成工具如对话框编辑器和ClassWizard类向导很方便地创建对话框,不需要程序员手工编写太多的源代码。
7.2.1 一般对话框工作流程 当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。 7.2.1 一般对话框工作流程 当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。 声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。例如,假设定义了一个名为CMyDialog的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码: CMyDialog myDlg; myDlg.DoModal();
函数OnOK()、 OnCancel()与DoModal()的关系: 对话框中一般都有OK和Cancel按钮,单击OK按钮时调用CDialog::OnOK()函数,单击Cancel按钮时调用CDialog::OnCancel()函数。OnOK()函数和OnCancal()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值。OnOK()函数令DoModal()返回IDOK,OnCancel()函数令DoModal()返回IDCANCAL。用户可以根据DoModal()的返回值做出不同的选择。如: if (myDlg.DoModal() = = IDOK ) { …… }
对话框的初始化可以在三个不同的阶段所调用的函数中进行: (1)对话框类构造函数; (2)WM_CREATE消息处理函数; (3)WM_INITDIALOG消息处理函数。 通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INIT- DIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。
7.2.2 创建对话框 在Windows中对话框是作为一种资源被使用,在程序中要创建一个对话框,首先要创建一个对话框模板资源,然后创建一个基于该对话框模板资源的对话框类。对话框模板资源指定了对话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性,而对话框类规定了对话框和对话框中每个控件的行为。通过对话框模板资源才能创建对话框类和对象。
对话框资源的添加: 为了向应用程序项目中添加一个对话框资源,执行Insert|Resource命令或直接按Ctrl+R键,弹出Insert Resource资源列表框。一般要加入通用对话框资源,所以在Insert Resource框中直接选择Dialog项,然后单击New按钮。系统将给对话框资源设置一个默认的ID标识,对话框的默认标题Caption为Dialog,对话框有OK和Cancel两个按钮。 添加对话框资源的简单方法: 在项目工作区鼠标右击资源项Dialog,从弹出式菜单中选择“Insert Dialog”命令项。
对话框是在对话框模板资源和对话框类的基础上形成的,在完成了对话框的属性和外观设计后,再来设计对话框的行为。我们需要利用ClassWizard类向导创建一个对话框类,并将这个类同先前创建的对话框资源连接起来。在创建对话框类之前或之后,都可以为对话框资源添加控件。而在创建对话框类之后,还可以为对话框资源添加与对话框控件相关联的成员变量和消息处理函数。
创建对话框类: 如果按Ctrl+W键或在对话框资源的非控件区域双击鼠标,ClassWizard类向导将发现已添加了一个对话框模板资源,却没有设计其对应的类,因此将弹出Adding a Class对话框,询问用户是否需要利用该对话框资源创建一个对话框类。
在Adding a Class对话框单击OK按钮,弹出New Class对话框: Name框:用于输入对话框类的名称; File Name框:列出类的文件名,单击Change按钮可改变文件名; Base class下拉框:列出可选择的基类; Dialog ID下拉框:列出可选择对话框资源的ID。 例 假设已利用MFC AppWizard应用程序向导建立了一个名为Mysdi的单文档应用程序,请向应用程序中添加对话框资源和对话框类。
1.首先向应用程序项目添加一个对话框资源,在项目工作区鼠标右击资源项Dialog,从弹出式菜单中执行Insert Dialog命令,插入一个对话框资源。 2.设置对话框的属性,将光标指向对话框的空白位置,单击鼠标右键,从弹出式菜单中选择Properties项,或直接按Enter键,弹出Dialog Properties属性对话框。该对话框包括General、Styles、More Styles、Extended Styles、More Extended Styles等页面,用于设置对话框多种不同的属性。 3.创建对话框类,鼠标双击对话框资源的非控件区域。
7.2.3 添加控件及关联的成员变量 如果没有控件,对话框完成不了什么具体功能,对话框与控件有着密不可分的关系。结合对话框编辑器,利用Controls控件工具栏可给当前正在编辑的对话框模板资源添加控件。 若Visual C++窗口中没有出现Controls工具栏,只需将光标指向菜单栏并单击鼠标右键,从弹出式菜单中选择Controls项。 控件工具栏上的每一个图标都代表了一种控件,如果不能确定控件的类型,只要将光标在该控件图标上停留片刻,就会显示该控件类型的提示。
向对话框添加控件时,先在Controls工具栏单击要添加的控件,再将光标指向对话框空白区域并单击鼠标。
添加与控件关联的成员变量 在生成自己的对话框类并添加需要的控件后,可以利用ClassWizard类向导在对话框类的定义中为对话框资源上的每一个控件添加一个或多个对应的成员变量。ClassWizard类向导的Member Variables页面主要用来为对话框类添加和删除与对话框控件关联的成员变量,我们在编写对话框程序时经常同该页面打交道。
在Member Variables页面: Class name下拉框:选择要添加成员变量的对话 框类; Control IDs栏:选择控件,因为要添加的成员变量总是与一个对话框控件ID联系在一起,它们代表控件对象本身或控件的某项属性; Add Variable按钮:添加与控件关联的成员变量; Delete Variable按钮:删除控件的某个成员变量。 Control IDs栏:列出对话框资源上已有的控件,第1列Control IDs表示控件的ID,第2列Type表示变量的类型,第3列Member表示成员变量名。
Add Member Variable对话框 Member variable name框:输入成员变量名; Category下拉框:选择成员变量的类别,可为Control或 Value; Variable type下拉框:选择成员变量的类型。
如果在Category下拉框选择Value项,表示要为该控件的某项属性定义一个变量,这意味着程序关心的是控件中的值,而不是控件对象本身。这时,还可以通过Variable type下拉框为变量选择不同的类型,可以选择一般的C++数据类型或Visual C++自定义的数据类型。 例如,对于编辑框控件,此时成员变量的类型可以是int、float、long、BOOL等C++一般数据类型或者是UINT、CString等Visual C++自定义数据类型。
如果在Category下拉框中选择Control项,则表示定义的变量代表控件对象本身, Control类别的变量实质是一个控件对象,其类型是MFC控件类。 例如,对于编辑框控件,此时成员变量的类型为CEdit。因此,可以通过添加的控件对象访问控件类的成员变量和调用控件类的成员函数,实现对控件行为的控制和管理。 可以为一个控件同时定义一个Control类别的变量和一个Value类别的变量。这些变量都是作为对话框派生类的成员变量,为了在程序其它地方能够直接访问添加的成员变量,它们都被声明为public属性。
例 完善Mysdi程序,向对话框资源添加需要使用的控件,并添加与控件关联的成员变量。 1.向对话框资源添加控件。添加一个静态文本控件,其Caption为“请输入半径”。添加一个Edit Box编辑框控件,其ID标识为IDC_EDIT_ RADIUS,该控件用于接收用户的输入数据。 2.添加与控件关联的成员变量。按Ctrl+W键启动ClassWizard类向导,单击Member Variables标签。在Class name下拉框选择类CRadiusDialog,在Control IDs栏选择编辑框IDC_EDIT_RADIUS,单击Add Variable按钮。通过Add Member Variable对话框添加成员变量m_nRadius,其数据类型为UINT。 3.使用对话框数据验证DDV功能,在该页面的左下角输入成员变量m_nRadius的最小值5和最大值250。
在程序中使用创建的对话框 例 完善Mysdi程序,通过“编辑”菜单中的“输入半径(I)”命令打开上述标题为“输入半径”的对话框,并根据输入的半径画一个圆。 1.为了在视图对象中接收并存储对话框编辑控件的值,在视图类CMysdiView中手工定义一个UINT类型的成员变量m_nCViewRadius。 2.利用菜单编辑器在“编辑”菜单增加一个菜单项“输入半径(I)”,其ID标识为ID_EDIT_INPUTRADIUS,Caption为“输入半径(&I)...”。按Ctrl+W键启动ClassWzard类向导,在视图类中为ID_EDIT_INPUTRADIUS菜单项添加消息COMMAND的处理函数,在函数中添加代码。
void CMysdiView::OnEditInputradius() { // TODO: Add your command handler code here CRadiusDialog dlg; // 定义一个对话框对象 dlg.m_nRadius=100; // 设置编辑框显示的初始值 if (dlg.DoModal()==IDOK) // 显示对话框 m_nCViewRadius=dlg.m_nRadius; // 接收并存储编辑框数据 Invalidate(); // 刷新视图 }
3.在视图类构造函数CMysdiView::CMysdiView()中将成员变量m_nCViewRadius初始化为0。在函数CMysdiView::OnDraw()中添加如下画圆的语句: pDC->Ellipse(0, 0, 2*m_nCViewRadius, 2*m_nCViewRadius); 在视图类实现文件MysdiView.cpp的开始位置加入包含对话框类头文件的语句: #include "RadiusDialog.h”
7.2.4 非模态对话框 模态对话框在关闭之前,不允许用户切换到程序的其它窗口。因为当弹出模态对话框时,它就获得了程序的控制权,并且,模态对话框拥有自己的消息循环,因此其窗口中所有产生的消息都不会送到主窗口的消息循环。 非模态对话框弹出后,用户不需要关闭它就可以在非模态对话框和应用程序其它窗口之间进行切换。常用的Find查找和Replace替换对话框就是非模态对话框。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。
非模态对话框的创建 对于非模态对话框,使用对话框编辑器创建对话框资源和使用ClassWizard类向导添加对话框类、成员变量和消息处理函数的方法与模态对话框一样,但创建和退出对话框的方式有所不同。 创建模态对话框时是由系统自动分配内存空间,因此在退出对话框时,系统自动调用CDialog::EndDialog()函数来删除对话框。而创建非模态对话框则需要用户来分配内存,退出时还需用户自己删除非模态对话框。
非模态对话框的实例应声明为全局对象,不能象模态对话框那样作为局部对象。一般用new操作符生成,使用结束时用delete操作符将其删除。 区别于模态对话框,非模态对话框用new生成对象后,不是调用CDialog::DoModal()函数,而是调用CDialog::Create()函数装入对话框资源,并创建和显示对话框。 Create()函数在显示非模态对话框后就立即返回,而DoModal()函数是在模态对话框被关闭之后才返回。并且,由于Create()函数不会启动新的消息循环,非模态对话框与应用程序共用一个消息循环,这样,非模态对话框就不会垄断用户的输入。
7.2.5 公用对话框 Windows将一些常用的对话框集成到操作系统中,作为Windows公用对话框库Commdlg.dll的一部分。用户在程序中可以直接使用这些公用对话框,不必再创建对话框资源和对话框类,减少了大量的编程工作。并且,用户还可以定制公用对话框的外观和性能。 为了在MFC应用程序中使用公用对话框,MFC提供了封装这些公用对话框的类。这些公用对话框类都是从CCommonDialog类派生而来,而CCommonDialog类又是CDialog类的派生类。
公用对话框 MFC公用对话框类 CColorDialog CFileDialog CFindReplaceDialog CFontDialog CPagesSetupDialog CPrintDialog COleDialog 说 明 颜色设定对话框,选择不同的颜色 文件存取对话框,打开或保存文件 查找和替换对话框,查找和替换文本串 字体设定对话框,选择不同的字体。 页面设置对话框,设置页码、页眉等 标准的打印对话框,用于打印和打印设置 该类及其派生类用于生成OLE对话框
7.3 标准控件 Windows提供的控件分为两类:标准控件和公共控件。 7.3 标准控件 Windows提供的控件分为两类:标准控件和公共控件。 标准控件:静态控件、编辑框、按钮、列表框、组合框和滚动条等。利用标准控件可满足大部分用户界面程序设计的要求。 公共控件:滑块、进度条、列表视控件、树视控件和标签控件等,利用公共控件实现应用程序用户界面风格的多样性。
7.3.1 控件概述 控件是Windows提供的完成特定功能的独立小部件,它使应用程序对话功能的设计更容易完成,在对话框与用户的交互过程中担任主要角色,用于完成用户输入和程序运行过程中的输出。 控件对应一个CWnd派生类的对象,它实际上也是一个窗口,可以通过调用窗口类的成员函数实现控件的移动、显示或隐藏、禁用或可用等操作,也可以重新设置它们的尺寸和风格等属性。 MFC以类的形式对标准控件和公共控件进行了封装,这些类大部分是从CWnd类直接派生而来。
常用的MFC控件类 MFC类 控 件 CStatic 静态文本、图片控件 CEdit 编辑框 CButton 按钮、复选框、单选按钮、组框 控 件 CStatic 静态文本、图片控件 CEdit 编辑框 CButton 按钮、复选框、单选按钮、组框 CComboBox 组合框 CListBox 列表框 CScrollBar 滚动条 CSpinButtonCtrl 旋转按钮 CProgressCtrl 进度条 CSliderCtrl 滑块 CListCtrl 列表视控件
常用的MFC控件类 MFC类 控 件 CTreeCtrl 树视控件 CTabCtrl 标签 CAnimateCtrl 动画控件 控 件 CTreeCtrl 树视控件 CTabCtrl 标签 CAnimateCtrl 动画控件 CRichEditCtrl 复合编辑框 CDateTimeCtrl 日期时间选取器 CMonthCalCtrl 日历 CComboBoxEx 扩展组合框 CStatusBarCtrl 状态条控件 CToolBarCtrl 工具条控件 CImageList 图像列表
控件通知Notification消息: 用户对控件的操作将引发控件事件,Windows产生对应的控件通知Notification消息,消息由其父窗口(如对话框)接收并处理。 标准控件发送WM_COMMAND控件通知消息,公共控件一般发送WM_NOTIFY控件通知消息,有时也发送WM_COMMAND消息。 通过WM_COMMAND消息参数标识发出消息的控件和具体的事件,消息参数中包含了控件的ID标识和通知码(如BN_CLICKED单击按钮事件)。控件通知码前缀最后一个字母为N。 程序员不必关心消息具体的发送和接收,只需利用ClassWizard将控件映射到成员变量,将控件消息映射到成员函数,然后编写具体的处理代码。
控件的创建方法: 控件在程序中可作为对话框控件或独立的窗口两种形式存在,因此,控件的创建方法也有两种。 一种方法是在对话框模板资源中指定控件,这样当应用程序创建对话框时,Windows就会为对话框创建控件,编程时我们一般都采用这种方法。 一种方法是通过调用MFC控件类的成员函数Create()创建控件,也可以调用API函数CreateWindow()或CreateWindowEx()创建控件。 控件也可以用于其它窗口,如在程序视图窗口显示控件。这时,需要首先声明一个MFC控件类的对象,然后调用Create()函数创建控件。
7.3.2 控件的组织 1. 添加或删除控件 打开对话框编辑器和控件工具栏,在控件工具栏中单击要添加的控件,此时,当光标指向对话框时将变成十字形状,在对话框指定位置处单击鼠标左键,则该控件被添加到对话框中指定的位置。也可以将光标指向控件工具栏中的控件,然后按住鼠标不放,采用鼠标拖曵的方法将控件拖入到对话框中。 要删除已添加的控件,先单击对话框中的控件,再按Delete键即可删除指定的控件。
2. 设置控件属性 将光标指向对话框中需设置属性的控件,按回车键(或右击鼠标,在弹出式菜单中选择Properties项)弹出Properties对话框,在Properties对话框中设置控件属性。可以将属性对话框始终保持打开,只需要按下属性对话框左上角的图钉按钮。 3. 调整控件的大小 对于静态文本控件,当输入标题内容时,控件的大小会自动改变。对于其它控件,先单击控件,然后利用控件周围的尺寸调整点来改变控件的大小。所选对象的位置和大小将显示在状态栏的右端。
4. 同时选取多个控件 一种方法是在对话框内按住鼠标不放,拖曵出一个大的虚线框,然后释放鼠标,则被该虚线框所包围的控件都将被同时选取;另一种方法是按住Shift(或Ctrl)键不放,然后用鼠标连续选取控件。 5. 移动和复制控件 当单个或多个控件被选取后,按方向键或用鼠标拖动选择的控件可移动控件。若在鼠标拖动过程中按住Ctrl键则复制控件,复制的控件保持原来控件的大小和属性。并且,控件能够通过复制和粘贴操作而加入到其它对话框中。
6. 编排控件 编排控件主要是指同时调整对话框中一组控件的大小或位置。编排控件有两种方法,一种方法是使用控件布局工具栏,自动编排对话框中同时选定的多个控件;另一种方法是使用Layout菜单,当打开对话框编辑器时,Layout菜单将出现在菜单栏上。为了便于用户在对话框内精确定位各个控件,系统还提供了网格、标尺等辅助功能。 测试对话框和控件的方法: 通过按下Ctrl+T组合键就能测试对话框运行时的界面效果。
7.3.3 控件共有属性 控件的属性决定了控件的外观和功能,我们只有通过控件属性对话框才能设置控件的属性。 7.3.3 控件共有属性 控件的属性决定了控件的外观和功能,我们只有通过控件属性对话框才能设置控件的属性。 控件属性对话框上有若干选项卡,如General(通用属性)、Style(风格)及Extend Styles(扩展风格)选项卡等,其中General页用于设置控件的通用属性,Styles和Extendcd Styles页用来设置控件的外观和辅助属性。 不同控件有不同的属性,但它们都具有通用属性,如控件标识ID、标题Caption等项,
控件的General属性 项 目 说 明 ID 控件的标识,对话框编辑器会为每一个加入的控件分配一个默认的ID Caption 项 目 说 明 ID 控件的标识,对话框编辑器会为每一个加入的控件分配一个默认的ID Caption 控件的标题,作为程序执行时在控件位置上显示的文本 Visible 指明显示对话框时该控件是否可见 Group 用于指定一个控件组中的第一个控件 HelpID 表示为该控件建立一个上下文相关的帮助标识ID Disabled 指定控件初始化时是否禁用 Tab Stop 表示对话框运行后该控件可以通过使用Tab键来获取焦点
7.3.4 静态控件 静态控件(Static control)是用来显示一个文本串或图形信息的控件,它包括静态文本控件、图片控件和组框。 7.3.4 静态控件 静态控件(Static control)是用来显示一个文本串或图形信息的控件,它包括静态文本控件、图片控件和组框。 静态文本控件用来显示一般不需要变化的文本;图片控件用来显示边框、矩形、图标或位图等图形;组框用来显示一个文本标题和一个矩形边框,通常用来作为一组控件周围的虚拟边界,并将一组控件组织在一起。 管理静态文本控件和图片控件的MFC类是CStatic类,而管理组框的MFC类是CButton类。
所有静态控件默认的ID标识都为IDC_STATIC,如果要为一个静态控件添加成员变量或消息处理函数,必须重新为它指定一个唯一的ID标识。 编程时用的最多是静态文本控件,它被用来作为其它控件的标题。每一个静态文本控件最多可以显示255个字符,可以使用“\n”换行符,并可以通过Styles页面设置控件的风格。
7.3.5 编辑框 编辑框(Edit box)又称文本框或编辑控件,它一般与静态文本控件一起使用,用于数据的输入和输出。编辑框提供了完整的键盘输入和编辑功能,可以输入各种文本、数字或者口令。 编辑框为用户提供了良好的输入、输出功能,能够将键盘输入的字符串转化为要求的数据类型,并验证它是否符合输入要求(字符串长度或数值范围)。通过前述对话框内容的学习我们已经知道,完成上述工作是利用了MFC提供的对话框数据交换(DDX)和数据验证(DDV)技术。
编辑框常用属性: Multiline设置单行或多行编辑,Align text设置文本对齐方式,Number表示只能输入数字,Password表示键入编辑框的字符都将显示为“*”,Uppercase或Lowercase表示键入编辑框的字符全部转换成大写或小写形式,Read-Only表示只能输出数据。 当编辑框的文本被修改,会向父窗口发送消息,可以利用ClassWizard在对话框类中添加消息处理函数。编辑框发送消息有:EN_CHANGE、EN_KILLFOCUS、EN_SETFOCUS、EN_MAX TEXT、EN_UPDATE等。
例 编写一个SDI应用程序Password,程序启动后首先弹出一个如图所示的用户身份确认对话框,当用户键入正确的口令后才能进入程序的主界面。
7.3.6 按钮 按钮(Button)包括按键按钮、单选按钮、复选框和组框等4种类型。虽然封装按钮控件的MFC类都是CButton类,但它们具有不同的功能。按键按钮在被按下时会立即执行某个命令,也被称为命令按钮;单选按钮用于在一组互相排斥的选项中选择其中一项;复选框用于在一组选项中选择其中一项或多项;组框可以使一组控件关联起来。
1. 按键按钮 几乎所有的对话框都使用简单的按键按钮,如OK按钮。通过Properties对话框可以设置按钮的不同风格,如通过设置Default button属性设置一个默认按钮。默认按钮是指当对话框刚显示时的命令执行按钮,此时按下Enter键将执行该按钮的命令功能。一个对话框只能有一个Default button默认按钮,通常情况下将OK按钮设置为默认按钮。 其它属性:Owner draw利用WM_DRAWITEM消息处理函数定制按钮的外观,Icon表示用图标代替原来的文本标题,Bitmap表示用位图代替原来的文本标题,Client edge、Static edge、Modal frame用于设置按钮的外观。
2. 单选按钮 单选按钮是由一个圆圈和紧随其后的文本标题组成,当它被选中时,圆圈中就标上一个黑点。 单选按钮设置Auto自动属性为默认属性,Auto属性表示用户若选中同组中的某个单选按钮,则自动清除其余单选按钮的选中状态,保证一组选项中始终只有一项被选中。 一般将一组单选按钮放在一个组框中,在一组单选按钮中,第一个(Tab键顺序)按钮最重要,其ID值可用于在对话框中为控件建立关联的成员变量。必须为同组中的第一个单选按钮设置Group属性,而同组的其它单选按钮不可再设置Group属性。
3. 复选框 复选框是由一个空心方框和紧随其后的文本组成,当它被选中时,空心方框中就加上一个“√”或“×”标记。 不同于单选按钮,在一组复选框中每次可以同时选择多项。除了选中和没选中两种状态,复选框还有第三种状态,此时选中标记显示为暗色,它表示该项不可以由用户选择。通过设置Tri-state属性得到这种三态复选框。另外,我们可以通过设置Push-like属性使单选按钮或复选框具有普通按钮的外观。
按钮控件发送的消息: 按钮控件只能发送通知码为BN_CLICKED(单击按钮)和BN_DOUBLECLICKED(双击按钮)的WM_COMMAND消息,我们经常需要编写按钮的BN_CLICKED消息处理函数。 CButton类提供了一些成员函数实现对按钮控件对象的控制和管理,如利用成员函数GetCheck()或SetCheck()获取或设置单选按钮或复选框的当前状态,利用成员函数GetButtonStyle()或SetButtonStyle()获取或改变按钮控件的风格。
例 编写一个对话框应用程序ColrButn,对话框中有两个用于选择颜色模式的单选按钮和三个用于选择具体颜色的复选框,只有在彩色模式下才能选择三种不同颜色的组合。当用户单击“应用”按钮,对话框右边的按键按钮将根据选择的颜色实现按钮的自画。
7.3.7 列表框 Windows提供了几个列表类型控件,如列表框、组合框、列表视控件和树视控件,其中列表框是一种最简单的列表类型控件。 7.3.7 列表框 Windows提供了几个列表类型控件,如列表框、组合框、列表视控件和树视控件,其中列表框是一种最简单的列表类型控件。 列表框(List box)是一个列出了一些文本项的窗口,常用来显示类型相同的一系列清单,如文件、字体和用户等。与复选框类似,用户可以选择其中一项或多项,但同时列表框中选项的数目和内容可以动态变化,用户可往列表框中添加或删除某些选项。 列表框有单选Single、多选Multiple、扩展多选Extended、不选None四种风格,在控件Properties属性对话框的Selection下拉框中设置。
当列表框中发生了某个事件,列表框就会向其父窗口发送一条通知消息。列表框常用的通知消息有:用户双击列表框中的列表项时发送消息LBN_DBLCLK,列表框失去键盘输入焦点时发送消息LBN_KILLFOCUS,列表框获得键盘输入焦点时发送消息LBN_SETFOCUS,列表框中的当前选择项发生改变时发送消息LBN_SELCHANGE。 封装列表框控件的MFC类是CListBox类,当列表框创建之后,在程序中可以通过调用CListBox类成员函数来实现列表项的添加、删除、修改和获取等操作。
例 编写一个对话框应用程ExmpList,对话框中有一个列表框,当用户单击列表框中的一个列表项(一个国家)时,在四个编辑框分别显示指定国家的名称、首都、面积和人口。单击“添加”按钮时,“国家”编辑框中的文本将被添加到列表框中;单击“删除”按钮时,当前的列表项将被删除。
7.3.8 组合框 编辑框和列表框在使用时受到一些限制,编辑框允许用户输入文本内容,但用户却不能直接选择以前已输入的文本内容。列表框可列出各种可能的选项,但用户却不能在列表框中输入新的列表项。而组合框(Combo box)吸收了列表框和编辑框的优点,它可以显示列表项供用户进行选择,也允许用户输入新的列表项。实质上,组合框是多个控件的组合,包括编辑框、列表框和按钮。 组合框有简单组合框(Simple)、下拉组合框(Dropdown)和下拉列表框(Drop List)等三种形式,通过控件Properties属性对话框Styles页面的Type下拉框设置这三种形式。
组合框控件的Data属性: 与编辑框或列表框相比,组合框有一个新的功能属性,可以通过组合框控件属性对话框的Data页面添加初始的列表项。注意,每输入完一个列表项,按下Ctrl+Enter键后才能换行输入下一项。也可以在对话框类的初始化成员函数OnInitDialog()中编写代码添加列表项。
组合框发送的消息 : 组合框消息有:关闭组合框消息CBN_CLOSEUP,打开列表框消息CBN_DROPDOWN,双击列表项消息CBN_DBLCLK,选择一个列表项并按下Enter键或单击下拉按钮隐藏列表框时发送消息CBN_SELENDOK,当前选项被取消时(如重新选择其它控件或关闭对话框)发送消息CBN_SELENDCANCEL,当前选项改变消息CBN_SELCHANGE;当组合框的编辑框中的文本被修改且新的文本显示之后发送消息CBN_EDIT CHANGE,当编辑框中的文本被修改且新的文本显示之前发送消息CBN_EDITUPDATE;组合框失去键盘输入焦点消息CBN_KILLFOCUS,组合框获得键盘输入焦点消息CBN_SETFOCUS。
例 编写一个单文档应用程序ExmpCombo,执行“测试控件|组合框”菜单命令时打开一个对话框,初始的对话框有一个用于显示标准控件名的组合框,当用户在组合框下拉的列表框中选择一个控件时,该控件将显示在对话框的右部。当用户在组合框的编辑框中输入一个列表项并单击“应用”按钮,一个指定标题的静态文本控件将出现在对话框的右部。
7.3.9 滚动条 滚动条作为一个独立的控件,其主要作用通过可视化的滚动操作实现程序设计所要求的功能,如滚动显示数据内容、在一个有效范围内选取合适的数值等。 滚动条分为垂直滚动条和水平滚动条两种类型。滚动条两端有两个箭头按钮,中间有一个可沿滚动条方向移动的滚动块。 当移动滚动条时发送消息WM_HSCROLL或WM_VSCROLL。滚动消息含有通知码,表示用户对滚动条的操作方式,如SB_LINEUP和SB_LINEDOWN表示向上或下滚动一行(或一个单位),SB_PAGEUP表示向上滚动一页。
7.4 公共控件 在Window 95推出之前,只提供了静态文本、按钮、编辑框、列表框和组合框等标准控件。在推出Window 95时,将其中一些较为流行的控件作为公共控件引入到Windows中,如旋转按钮、进度条、滑块、列表视控件、树视控件、日期时间选取器等公共控件。 标准控件保存在System目录下的User.exe文件中,公共控件保存在System目录下的Comctl32.dll中文件。MFC对这些公共控件以类的形式进行了封装,如CProgressCtrl、CListCtrl和CTreeCtrl等。
7.4.1 旋转按钮 旋转(Spin)按钮控件也称微调控件或上下控件,其形状与滚动条类似,两端也有两个箭头按钮,但中间没有滚动块。用户单击箭头按钮可以增加或减少一个数值,这个值表示旋转按钮滚动位置或另一个与旋转按钮相关联的控件中的数据。 当程序需要用户在某个范围内输入一个值时可以使用旋转按钮,其好处是无需当心用户输入一个无效值而导致程序的崩溃。 旋转按钮控件经常和一个关联控件(如编辑框)绑定在一起使用,用户只需用鼠标单击旋转按钮控件的上下箭头,就能设置关联控件中的数据内容。对用户而言,一个旋转按钮和它的关联控件看起来就象一个控件。
关联控件的设置: 可以在程序中通过调用成员函数设置关联控件,但常用的方法是通过控件Properties对话框直接设置关联控件。 在Alignment下拉框设置旋转按钮与关联控件的位置关系,Right和Lift分别表示旋转按钮紧靠在关联控件窗口的右内侧或左内侧,Unattached表示旋转按钮的位置与关联控件无关;属性Auto buddy表示旋转按钮把它前一个控件(按TabOrder顺序)作为关联控件;属性Set buddy integer表示单击旋转按钮改变位置时,关联控件窗口能自动显示这个位置值。
旋转按钮的属性和操作: 在控件Properties属性对话框的Orientation下拉框中设置垂直(Vertical)或水平(Horizontal)方向两种风格;Wrapt表示当旋转按钮达到最大(最小)值时重新回绕到最小(最大)值;No thousands表示取消显示数值中的千分位分隔符;Arrow keys表示可以使用键盘“↑”和“↓”键改变控件位置值。 对旋转按钮的操作通过调用MFC类CSpinButtonCtrl的成员函数来完成,主要成员函数有:SetRange()和GetRange()用于设置或获得旋转按钮的上下限范围,SetPos()和GetPos()用于设置或获得旋转按钮的当前位置值,函数SetBuddy()用于动态设置关联控件,函数GetBuddy()用于获得关联控件窗口的指针。
例 编写一个单文档应用程序ExmpComctl,执行“测试控件|公共控件”菜单命令打开一个对话框,对话框有一个带旋转按钮的编辑框,用于输入圆周线的宽度。单击旋转按钮,在编辑框显示旋转按钮所表示的线宽。单击OK按钮,程序根据线宽在用户视图区画一个圆。
7.4.2 滑块 滑块(Slider)控件也称滑动条或游标控件,它由滑杠、可沿着滑杠方向移动的滑块和可选择刻度的标尺组成。用户可以通过鼠标或键盘移动滑块,滑块不同的位置代表了一个不同的数值。 与滚动条相比,滑块控件中间只有一个滑块,两端箭头按钮。与旋转按钮相比,滑块控件比旋转按钮控件更具独立性,一般不需要关联控件。 滑块控件的属性:Orientation下拉框设置滑块控件的垂直(Vertical)或水平(Horizontal)方向风格。Point设置刻度标尺的位置,Both表示滑块是一个矩形块,Top/Left表示标尺位于滑杆的左边或上方,Bottom/Right表示标尺位于滑杆的右边或下方。
滑块控件发送的消息和操作: 当滑动滑块时,滑块控件将发送滚动消息来通知父窗口,垂直滑块发送消息WM_VSCROLL,水平滑块发送WM_HSCROLL。 可调用封装滑块控件的MFC类CSliderCtrl的成员函数设置滑块的最小、最大值、刻度出现的疏密、行和页间距。如:GetLineSize()、SetLineSize()、GetPageSize()、SetPageSize()、GetRange()、Set- Range()、GetPos()、SetPos()等。
例 完善例7-10a中的应用程序ExmpComctl,向对话框资源添加一个滑块控件,用于设置圆的半径。在对话框中单击OK按钮,程序根据设置的线宽和半径在用户视图区画一个圆。
7.4.3 进度条 进度条(Progress)是一个在进行一系列费时操作时显示反馈信息的控件,通过其状态的动态变化告诉用户当前的操作进度。进度条也能表示某个范围内的值,如温度、水平面高度以及音响系统频率的模拟显示。 形状上看,进度条由一个细长的矩形窗口和一些填充块组成,其中的填充块越多,表示任务越接近于完成,当蓝色块填满时,任务也就完成了。 我们一般使用进度条的默认属性,其常用的属性有:Border表示进度条有一个边框;Vertical表示垂直进度条;Smooth表示使用不间断的蓝色条填充控件窗口。
进度条控件的操作: 进度条控件也有一个“范围”和“当前位置”,范围表示整个操作需要完成的工作量,当前位置表明该操作已完成了多少。初始化时只需设置进度条值的范围、当前值和使用步长。 进度条控件用于输出,一般不需要进行消息处理。 为了设置和获得进度条有关参数,需要调用封装进度条控件MFC类CProgressCtrl的有关成员函数。函数SetRange()或GetRange()用于设置或获取控件值的范围,函数SetPos()和GetPos()用于设置或获取控件的当前位置,函数SetStep()用于设置步长,函数StepIt()用于在控件窗口填充一个蓝色块。
例 编写一个单文档应用程序PrgresAnmt,执行“测试控件|进度条和动画”菜单命令时在用户视图区播放一段动画,并用进度条提示动画播放的进程。
7.4.4 标签控件和属性表 1. 标签(Tab)控件 标签(Tab)控件也称选项卡控件,它是一个分割成多个页面的窗口,每个页面都配有一个带有标题的标签,单击一个标签就显示对应的页面。 标签控件在功能上等价一系列对话框窗口,但使用起来更接近于我们的使用习惯。编程时使用标签控件,可以在一个窗口的相同区域内定义多个页面,其中每个页面(可以是一个对话框)上包括一些不同的控件,以实现不同的对话功能。 标签作为控件使用,它不是对话框,编程时不能直接在各个标签页上添加控件,只能在选中不同标签时在相同位置显示含有不同控件的对话框。
标签控件的属性和消息: 标签控件的属性有:Alignment下列框用于设置每个标签的宽度为自动随标题长度调节(Right Justify)或固定宽度(Fixed Width0,Buttons表示标签采用按钮形状,Multiline表示标签可以多行的形式显示,Bottom表示标签位于控件的底端,Vertical表示标签以垂直的方式出现。 标签控件消息:单击标签时发送消息NM_CLICK。选择不同标签时发送消息TCN_SELCHANGING (标签切换前)或TCN_SELCHANGE(标签切换后)。
封装标签控件的MFC类: MFC类CTabCtrl提供了标签控件的各项服务功能,通过其成员函数实现了对控件及其数据结构进行操作的方法。编程时常用的成员函数有:函数InsertItem()或DeleteItem()用于插入或删除一个标签,函数GetCurlSel()或SetCurSel()用于获取所选择标签的索引号或设置当前标签。 在CTabCtrl类的很多成员函数中都用到一个TCITEM结构(取代了TC_ITEM结构)的参数,该结构用于设置每一个标签的属性,
例 编写一个单文档应用程序ExmpTabCtl,执行“测试控件|标签控件”菜单命令打开一个标签对话框,对话框有2个标签页面,在每个页面分别显示 “组合框”和“公共控件”对话框,并完成与前面例题要求相同的程序功能。
2. 属性表(Property sheet) 属性表(Property sheet)又称属性对话框,其形式和功能都类似于前面介绍的标签对话框。一个属性表由一个CPropertySheet类对象和多个CPropertyPage类对象构成,CPropertySheet类或其派生类对象代表一个属性表,CPropertyPage派生类对象代表每个不同的属性页。 虽然CPropertySheet派生于CWnd,但属性表的使用方法与CDialog类似,即先调用构造函数创建属性表,然后调用CPropertySheet::AddPage()函数将属性页加入属性表中,最后调用CPropertySheet:: DoModal()创建一个模态属性表,或调用CPropertySheet::Create()函数创建非模态属性表。
一个属性页对应一个对话框,用于进行数据的输入和输出。CPropertyPage类派生于CDialog类,因此,每个属性页实际上就是一个对话框。我们可以利用对话框编辑器为每个属性页添加控件,并可利用ClassWizard创建自己的派生类,添加与控件关联的成员变量和消息处理函数。 例 利用属性表实现与前例相同的功能。
7.4.5 图像列表 图像列表(Image list)是一个由一些大小相同的图像(如图标或位图)组成的集合,如图所示。图像列表本身只是一种存储结构,这种存储结构与数组极为相似,存储在图像列表中的每个图像通过一个索引值识别。 图像列表不是控件,没有对应的控件窗口,我们不能直接看见它,但可利用MFC图像列表类或图像列表的关联控件来显示图像列表中的图像。
封装图像列表的MFC类: 图像列表由MFC类CImageList支持。CImageList类提供了创建、显示和管理图像列表的方法,调用CImageList类的成员函数Create()创建图像列表,调用函数Add()或Remove()向图像列表中添加或删除一个图像,调用函数GetImageCount()获得图像列表中图像个数,调用函数Draw()绘制图像。 编程时可以直接使用图像列表,但图像列表最主要的用途还是作为与其相关联控件的显示项的图形标志,如图片控件、列表视控件、树视控件、扩展组合框、标签控件和属性页等。
例 编写一个单文档应用程序,利用图像列表在视图区显示一系列位图。 例 编写一个单文档应用程序,利用图像列表在视图区显示一系列位图。
7.4.6 列表视控件 列表视(List view)控件也称列表控件,在需要以报表形式显示数据时,列表视控件是最好的选择。区别于列表框,列表视控件可显示由多个子项组成的项目,并允许以多种方式显示信息。列表视控件还可以为显示的项目增加一个图标,但代表项目的图标必须存储在一个图像列表中。 列表视控件包含一个项目列表,而其中每一个项目由图标、项目名称(主项)和多个子项组成,每个项目所包含子项的数目必须相同,属性相同的每个子项显示在同一列中。列表视控件有两个重要的数据结构LVCOLUMN和LVITEM。
列表视控件的属性: 列表视控件的属性一般使用其默认值,其常用的属性有:View指定程序运行后列表视控件最初显示的方式,可设置为Icon(大图标)、Small Icon(小图标)、List(列表)或Report(报表);Single selection 表示每次只能选中一个项;Auto arrange使得项目在Icon和Small Icon显示方式下能够自动排列整齐;Edit Labels表示可以编辑项目的卷标,即主项(第0列)的文本,这时需要添加控件通知消息LVN_ENDLABELEDIT的处理函数;No column header取消控件所有列的标题。
列表视控件的操作: 列表视控件有多种显示形式,其细节由控件本身实现的。MFC提供了CListCtrl类用于实现列表视控件的各种功能,如对项目进行添加、删除、修改和检索等。主要成员函数:InsertItem()或DeleteItem()插入或删除一个主项,GetItemText()或SetItemText()获得或添加子项文本;GetItemCount()获取项目的总数(行数);FindItem()查找具有某些特征的项目;GetNextItem()查找并返回某些项目的索引,常用于查找当前选择的项目;SetImageList()把图像列表与列表视控件关联;InsertColumn()或DeleteColumn()插入或删除一个列。
例 编写对话框应用程序MyList,对话框中有一个列表视控件、一个列表框和其它一些控件。列表视控件显示一些由图标、名称、人口和面积组成的项目,列表框列出了大图标、小图标、列表和报表四种显示方式。选中列表框中的显示方式时,列表视控件窗口以指定方式显示其中的项目。单击列表视控件中的一个项目时,在三个编辑框分别显示该项目的数据。单击“添加”或“删除”按钮将添加或删除一个项目。
7.4.7 树视控件 树视(Tree view)控件也称树控件,用于表示有层次关系的事物或能够进行分类划分的对象。 7.4.7 树视控件 树视(Tree view)控件也称树控件,用于表示有层次关系的事物或能够进行分类划分的对象。 树视图控件中每个项目由项目名称和一个可选择的图标组成,项目分为父项目和子项目,一个父项目拥有一个子项目列表,双击父项目可以展开或折叠其中的子项目。父项目位于子项目的上一层,子项目又可以是低一层子项目的父项目。 树视控件编程时常用到的数据结构:TVITEM结构和TVINSERTSTRCT结构。TVITEM结构用于定义项目,TVINSERTSTRCT结构用于定义插入项,该结构含有一个TVITEM结构成员。
树视控件的属性: 使用树视控件时经常需要重新设置它有关属性,树视控件常用的属性有:Has buttons表示父项目的前面有一个“+”或“-”按钮,单击该按钮可以展开或折叠该项目;Has lines表示用连线表示项目之间的层次关系;Lines at root表示在项目的最高层用连线将项目与根项目连接;Edit labels表示可以编辑项目的名称;Check boxes表示项目的左侧有一个复选框;Single expand表示单击项目可以展开或折叠该项目。
树视控件的操作: 封装树视控件的MFC类是CTreeCtrl类,CTreeCtrl的成员函数有:SetImageList()设置与树视控件关联的图像列表;GetCount()返回控件中项目的数量;GetSelectedItem()返回当前选中的项目;GetNextItem()获得满足某种条件的项目;GetChildItem()或GetParentItem()返回一个项目的子项目或父项目;GetNextSiblingItem()或GetPrevSiblingItem()返回下一个或上一个兄弟项;GetRootItem()返回根项目;GetItemText()或SetItemText()用于获取或设置项目的文本串;GetItemData()或SetItemData()获得或设置项目的关联数据;InsertItem()插入一个项目;DeleteItem()删除一个项目;DeleteAllItem()删除所有项目;Expand()展开或者折叠项目。
例 编写一个对话框应用程序MyTree,对话框中有一个树视控件和其它一些如图所示的按钮。树视控件用于显示一些有层次关系的项目,用户可通过“添加”或“删除”按钮向树视控件中添加或删除一个项目
本章重点作业题 7-32,7-33,7-34,7-35,7-37,7-39,7-42,7-43,7-45,7-47,7-49,7-51,7-58,7-63,7-65,7-66