《对话框及常用控》PPT课件.ppt_第1页
《对话框及常用控》PPT课件.ppt_第2页
《对话框及常用控》PPT课件.ppt_第3页
《对话框及常用控》PPT课件.ppt_第4页
《对话框及常用控》PPT课件.ppt_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八讲 对话框及常用控件,中国地质大学(武汉) 计算机学院,计算机高级语言(C+),本章内容主要包括包含控件的对话框资源的建立,对话框类和对话框资源的关联,利用对话框类来操纵对话框资源,对话框的消息处理,对话框框中控件的访问。 要求了解控件的使用、对话框资源的建立方法和常见属性的含义,熟悉利用控件属性,对话框设置控件属性的方法及常见控件属性的含义,掌握对对话框消息WM_INITDIALOG的响应,会利用类向导添加控件变量和消息映射函数,熟练掌握控件类型的无关访问。,教学要点,对话框及常用控件,8.1 对话框概述 8.2 对话框程序的创建 8.3 标准Windows控件,8.1 对话框概述,界面是Windows程序设计中的一种重要的接口对话框和控件也是组成界面的重要元素。如何编写基于对话框的应用程序,在界面中放置什么样的控件。当创建了一个包含各种控件的对话框资源后,控件如何来响应用户的各种操作。 本节内容: 8.1.1 对话框简介 8.1.2 对话框的分类 8.1.3 对话框的组成,8.1.1 对话框简介,对话框是一种用户界面,它为用户提供了一种标准的处理数据的方法。因为大部分的对话框是作为对菜单的单击响应而显示出来的(在Word软件中,单击菜单项后有的菜单,看都会出现哪些对话框),因此对话框常常被看作是用户菜单命令的扩展。 从程序员角度来看,对话框和控件都是窗口,查看MSDN中的MFC组织图可以看到,它们都是从CWnd类派生来的,这正好说明了“对话框和控件都是窗口”。因此,对对话框的操作,经常要使用窗口的成员函数来进行。,8.1.2 对话框的分类,1模态对话框 在对话框关闭之前,用户无法在应用程序的其它窗口中进行工作的对话框称为模态对话框。例如Windows的各种应用软件中的Open File 对话框,用户不能在应用程序的其它地方工作,直到对话框关闭。 2非模态对话框 对话框保留在屏幕的同时,用户还可以在应用程序其它窗口中进行工作的对话框称为非模态对话框。例如,Word字处理软件中的Find 和Replace对话框就是非模态对话框的一个很好的例子。,8.1.3 对话框的组成,对话框模板 对话框模板定义了对话框的特性(比如大小、位置和风格)以及对话框中每个控件的类型和位置。程序员不仅可以使用对话框资源编辑器建立对话框资源模板外,还可以根据需要在内存中创建对话框模板。当对话框模板创建后,程序员好可以在创建和管理对话框时动态地改变部分控件的信息,如禁止、变灰、改变标题和大小。 对话框模板可以看作对话框应用程序的一种用户接口,用户在应用程序的使用中,看到的都是对话框模板中的东西。,8.1.3 对话框的组成(续),对话框类 从CDialog类派生的对话框类提供编程接口来管理与对话框模板相关联的对话框。CDialog类的许多成员函数与对话框编程密切相关,可供程序员调用。由于对话框是一种窗口,因此相应的对话框类必须与一个Windows窗口相联系,而对话框资源模板就是用于创建这个Windows窗口及其包含在其中的控件。 对话框类可以看作对话框应用程序的一种程序员接口,用户对应用程序操作,后台调用的都是该类的成员函数来完成的。,8.2 对话框程序的创建,8.2.1 一个对话框程序 8.2.2 创建对话框资源模板 8.2.3 利用对话框类CDialog操纵对话框 8.2.4 初始化对话框 8.2.5 对话框的调用 8.2.6 对话框的消息处理,8.2.1 一个对话框程序,1程序功能 该应用程序具有认证的功能:当该程序运行时,首先弹出一个“密码验证” 对话框,让用户输入其用户名和密码。用户需要输入用户名“good”和用户密码“good”后才能进入主界面,若有一个输入错误,都不能进入。 2程序类型 该程序重点演示一个模态对话框,它是利用AppWizard创建的一个基于MFC的单文档应用程序。在该程序的主界面出现之前显示“密码验证” 对话框。,静态图片,编辑框,静态文本,组框,按钮,复选框,单选框,组合框,列表框,列表视图,树形视图,标签,8.2.2 创建对话框资源模板,资源文件(.rc)中有关描述对话框模板的文本,模板文件 对话框模板描述了对话框中各控件类型和排列位置,不论是模态还是非模态对话框,都需要对话框模板。对话框模板存储在对话框资源中,这和菜单类似。对话框资源中存储的是对话框脚本,为了了解资源的脚本,我们查看一下脚本文件MfcExam.rc,屏幕看到的是生成的单文档应用程序的对话框的脚本。,8.2.3 利用对话框类CDialog操纵对话框,1利用类向导创建对话框类 进入类向导后,如果从未给刚才建立的对话框资源模板建立对应的对话框类,则类向导会发现这是一个新的对话框资源模板,类向导提问是否要为这个新的对话框资源模板创建一个新的类。选择“OK”按钮,会弹出一个Create New Class的对话框。若选择Cancel后,也可以在类向导中通过增加一个新类的方法来添加对话框资类。不管哪种情况,都是在所出现的对话框的Name栏中输入对话框类的名字CPassWordDlg,Bass Dialog栏选择CDialog,Dialog ID栏选择先前创建的新对话框源模板的标识符IDD_DIALOG_USER(如图所示)。,对话框类的建立界面,2利用类向导添加对话框类的成员变量 为了对编辑框输入的数据进行控制,需要在对话框类中增加与这些控件有关的类的成员变量。 按Ctrl+W打开类向导对话框,选择MFC ClassWizard对话框中的Member Variable标签,然后在Class Name栏中选择对应的CPassWordDlg对话框类,此时在下面该类的变量列表中会出现该对话框中的各控件的资源ID号。,双击Controls IDs列表中的编辑框控件的资源ID号ID_EDIT_USERNAME,在Category栏中选择Value(值变量)(还有一种控件型变量Control),在Value Type栏中选择CString类型。这些操作的界面如图所示。用用样的方法再增加一个变量m_strPassword。,利用对话框类CDialog操纵对话框(续),按OK按钮后,这两个类的成员变量m_strUserName和m_strPassword就被加入到CPasswordDlg类的定义中,定位到该类的头文件PassDlg.h中,找到如下的几行代码:,class CPassWordDlg : public CDialog / Construction public: CPassWordDlg(CWnd* pParent = NULL); / standard constructor / Dialog Data /AFX_DATA(CPassWordDlg) enum IDD = IDD_DIALOG_USER ; CString m_strPassword; /通过类向导增加的字符串变量,保存密码 CString m_strUserName; /通过类向导增加的字符串变量,保存用户名称 /AFX_DATA,8.2.4 初始化对话框,如何初始化各种类型的数据对象是很重要的,当处理像对话框这样复杂对象时,由于它的初始化工作放在多个阶段,所以需要注意次序问题。对话框的初始化工作可以在下面的三个阶段进行:构造函数、对WM_CREATE消息的响应和对WM_INITDIALOG消息的响应。,8.2.4 初始化对话框(续),1在构造函数中初始化 从C+的观点看,在类的构造函数中,应该初始化类的数据成员,但是,在MFC应用程序中应尽量避免在构造函数中完成太多的工作,因为构造函数没有返回失败条件的方法,无法报告其中的失败信息(除非使用异常处理)。 在前面的例子中,变量m_strPasswor和m_strUserName的初始化就是在对话框类的构造函数中进行的,下面是构造函数的实现代码。,CPassWordDlg:CPassWordDlg(CWnd* pParent /*=NULL*/) : CDialog(CPassWordDlg:IDD, pParent) /AFX_DATA_INIT(CPassWordDlg) m_strPassword = _T(“); /成员变量初始化为空 m_strUserName = _T(“); /AFX_DATA_INIT 可见在对话框的构造函数中主要是对对话框的数据成员变量进行初始化。,8.2.4 初始化对话框(续),2在WM_CREATE的消息映射函数中初始化 由于对话框也是窗口,它在窗口创建时会收到WM_CREATE消息,该消息的响应函数是OnCreate()。这样,就能在窗口创建中做一些初始化工作。尽管用户可能在WM_CREATE消息处理函数中进行一些数据成员的初始化工作,但更通常的做法是在对话框中的所有控件都建立起来之后,响应消息WM_INITDIALOG时,对数据成员进行初始化。 3在WM_INITDIALOG的消息映射函数中初始化 在对话框创建时,会收到WM_INITDIALOG消息,该消息的响应函数是OnInitDialog()。在得到了,8.2.4 初始化对话框(续),WM_INITDIALOG消息时,对话框处于一个特殊的状态,首先,当我们获得该消息时,对话框框架已经建立起来,对话框的窗口句柄已经有效;其次,各个控件也建立起来并放在适当的地方;第三,对话框控件还没有显示出来。因此,一般在OnInitDialog()函数中作一些影响对话框外观的初始化工作,如可以设置或优化对话框中各个控件的外观、大小尺寸、位置及其它内容。 一般来说,在创建对话框及其所有的控件后,就在对话框即将显示之前将调用CDialog的成员函数OninitDialog()来初始化对话框。对于模态对话框,在调用DoModal()时调用OninitDialog(),而对于非模态对话框,在调用Create()时调用OninitDialog() 。,8.2.5 对话框的调用,由于对话框是一种输入界面,因而牵涉到在程序的什么地方、什么时候调用的问题,这实质上是创建的对话框类和程序如何交互的问题。根据不同的应用程序类型和程序的功能,其调用的方法也不同。 1在程序主窗口显示前调用 我们已经创建了密码验证MfcExam程序的对话框模板IDD_DIALOG_USER、对话框类CPassWordDlg,紧接着编写调用对话框的代码。由于密码验证是在应用程序的主框架显示之前进行,因此密码验证对话框的调用必须在应用程序主框架显示之前就完成,很显然它不能在视图类中靠和用户交互进行。,8.2.5 对话框的调用(续),应用程序类是控制整个应用程序的运行,它建立的时间最早,因此我们可以把对话框的调用放到应用程序类中的InitInstance()中完成。 (1)在应用程序类中添加文件包含宏 打开应用程序类的实现文件MfcExamApp.cpp,在文件的头件的定义处,添加文件包含的宏指令:,#include “stdafx.h“ #include “MfcExam.h“ #include “MainFrm.h“ #include “MfcExamDoc.h“ #include “MfcExamView.h“ #include “PassWordDlg.h” /需要使用用户登陆对话框,必须包含它 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif,(2)超载应用程序类的虚函数InitInstance() BOOL CMfcExamApp:InitInstance() . /以下为用户添加的代码 CPassWordDlg dlg; /如果点击“取消”按钮 if(dlg.DoModal()!=IDOK) return FALSE; /如果输入的用户名、密码不正确 if(strcmp(dlg.m_strPassword,“good“)!=0) |(strcmp(dlg.m_strUserName,“good“)!=0) MessageBox(NULL,“用户名或密码错误,请重试!“, “错误信息“,MB_OK|MB_ICONERROR); return FALSE; ,8.2.5 对话框的调用(续),2在基于对话框的应用程序中调用 基于对话框的应用程序的类型比较简单,当程序运行后,就自动显示一个对话框的界面。倘若我们程序的输入界面就是它(例如Windows中的计算器程序),则对话框的调用的代码在向导中已经完成,我们没有必要编写,但必须知道在什么地方调用的。 3通过用户交互对象菜单、工具栏调用 在基于文档/视图结构的应用程序中,由于对话框大部分用作用户的输入与输出界面,因此对话框的调用应该在视图类中完成。这在前面和后面的章节都会出现(自己琢磨)。一般来说,对话框的调用在选择菜单项、工具栏、加速键或按了鼠标键、键盘键等触发。,8.2.6 对话框的消息处理,1对话框本身的消息 一般在一个对话框中有多个按钮,其中只有一个按钮是缺省按钮。在缺省按钮的四周有一个虚线矩形框,缺省按钮的作用在于用户不需要用鼠标单击它,只需按回车键就等同于单击它,这减轻了用户的负担。在应用程序中,要想改变或设置对话框中的缺省按钮,只需要使用SendMessage()发送一个对话框的消息 DM_GETDEFID或DM_SETDEFID即可。 2窗口消息 由于对话框是窗口,所以WM_开始的Windows消息,在对话框中类中都可以处理,在ClassWizard窗口的MessageMaps选项页的Messages列表框中显示的就是对话框可以处理的消息,其中包含了很多窗口消息。,8.2.6 对话框的消息处理(续),3控件通知消息 我们可以像对待框架窗口类和视图类一样,向对话框中的派生类中为WM_消息增加消息映射,但却不能对话框中控件的通知消息增加ON_COMMAND消息映射宏,因为控件的通知消息包含有不同的通知代码。控件的通知消息主要指一个对话框中所包含的控件自己可以接收到的消息。例如EN_CHANGE就是一个编辑框内容改变的控件通知消息(Edit Notification Changed)。在Windows对话框应用程序中,当要对其中的控件进行全面的控制时,就要通过类向导对对话框中的控件添加控件的通知消息映射。,【例8-2】在前述程序的基础上,通过发送消息DM_SETDEFID将密码对话框中的缺省按钮设置为“确定”,在WM_INITDIALOG的消息响应函数中将“取消”按钮的大小改变,同时处理“用户名称”编辑框的通知消息EN_CHANGE。步骤如下: (1)利用类向导添加对话框类CPassWordDlg对WM_INITDLG的消息映射函数OnInitDialog(),并编写代码。 (2)利用类向导添加编辑框控件IDC_EDIT_USERNAME的通知消息EN_CHANGE的响应函数OnChangeEditUsername(),并编写代码。,void CPassWordDlg:OnChangeEditUsername() UpdateData(true); /将编辑框输入的内容更新到变量m_strUserName中 if(m_strUserName.Compare(“BenLaDeng“)=0) /如果在用户名称编辑框中输入“BenLaDeng”,则找见了系统的后门 MessageBox(“恭喜您找到后门,不用输入密码就可进入系统“); m_strUserName=“good“; m_strPassword=“good“; UpdateData(false); SendMessage(WM_COMMAND, IDOK,BN_CLICKED); /向确定按钮发送单击消息BN_CLICKED ,8.3 标准Windows控件,本节内容 8.3.1 控件简介 8.3.2 静态控件 8.3.3 按钮控件 8.3.4 编辑控件 8.3.5 列表框控件 8.3.6 组合框控件 8.3.7 控件的类型无关访问 8.3.8 动画控件,8.3.1 控件简介,在Windows应用程序中,菜单系统是用来实现用户与程序进行交互最基本的途径,但仅仅使用菜单来完成这种交互,往往并不方便,有时甚至是难以胜任的。其实,Windows操作系统的一个重要特性就是友好的用户界面。对于编程人员,它也提供了各种控件来实现直观、方便、快捷的交互。在上一节我们使用过对话框,在对话框中的静态文本、图像以及各种按钮都是控件。控件(Control,也称为控制框)是一种子窗口,应用程序用它来与其它窗口一起完成简单的输入输出操作。 作为一般窗口,控件具有许多通用窗口属性,因此控件可以像操作窗口那样使用ShowWindow()、MoveWindow()等窗口管理函数来显示或隐藏控件、改变控件的位置和尺寸以及其它的操作。,8.3.1 控件简介(续),控件创建方式有两种。 一种是在对话框模板中放置控件,当应用程序启动该对话框时,Windows系统就会为对话框创建控件,这种方法是可视化的编程方式,所见即所得,本书的大多数对话框程序都使用这种方式来创建。 另一种方式是通过CreateWindow()或CreateWindowEx()函数来创建控件,这时必须指定控件的窗口类,每个控件都应属于某个窗口类,这个窗口类可以在应用程序中定义并注册,但在更多的情况下,程序员使用的Windows系统预定义好的窗口类。,静态图片,编辑框,静态文本,组框,按钮,复选框,单选框,组合框,列表框,列表视图,树形视图,标签,8.3.2 静态控件,静态控件在MFC中是靠CStatic类来管理的,它是一种单向交互的控件,只能支持应用程序的输出,而不能用来响应用户的输入,也就是说,它可以接收消息,但基本上不会发送消息。 静态控件是多种多样的。在VC集成环境中,Controls工具栏中的Static Text(静态文本)、Picture(图片控件)和Group Box(成组框)分别用来创建文字、图形和由一个方框和一个字符串组成的成组框这三种静态控件。 Static Text、Picture和Group Box均对应CStatic类型的对象,通常可选用对话框模板编辑器自动提供的缺省标识符IDC_STATIC,此时静态控件只是起到一种标识的作用。,8.3.2 静态控件(续),1常见属性 在对话框的应用程序中,想要查看某类控件的属性,先选中该类控件,然后按Alt和回车键,就会弹出控件的属性设置对话框。下图是静态控件的属性窗口。,图8.6 静态控件属性设置窗口图,8.3.2 静态控件(续),2常用方法 静态控件类CStatic的成员函数见下表。,8.3.2 静态控件(续),3常用消息 由于静态控件只用作输出,而不用作输入,因此一般不处理它的消息,但它也有一个BN_CLICKED的消息。要想处理该消息,该控件的属性必须选中属性窗口Style选项页下的Notify复选框,并且修改其默认的资源标识符IDC_STATIC为其它的值。,8.3.3 按钮控件,按钮控件是一个小的矩形窗口,它们可以被单独或成组使用。典型的按钮控件有下压按钮(push button)、单选按钮(radio button)和复选框(check box),它们在外观和使用上都有很大的差异,但在MFC中都是用一个类CButton来封装的。下压按钮通常立即产生某个动作,执行某个命令,因此又叫命令按钮。单选按钮的外形是一个圆圈,当它被选中时,就会出现一个小黑点。复选框为一个空心方框,当它被选中时,就会出现一个“”标记。通常复选框只有选中和未选中两种状态。,8.3.3 按钮控件(续),1常见属性 在对话框的应用程序中,选中所添加的按钮控件,然后按ALT和回车键盘,就会弹出按钮控件的属性设置对话框,如图所示。,8.3.3 按钮控件(续),按钮控件常见属性有:Visible(可视性)、Caption(显示在控件上的标签文本)、Disableed(是否为不接收用户输入的禁止状态)、Group(控件不仅可以单独使用,而且还可以几个编成一组。该属性用于指定同组控件中的第一个控件。在同组控件中用户可以使用箭头键在控件之间移动,它以Tab order为序,在该控件之后的所有该属性值为False的控件将被视为同一组控件,直到遇上Group属性为True的控件为止)、Table stop(是否可以使用TAB键来定位到该控件)等。,8.3.3 按钮控件(续),2常用方法 按钮控件的操作是通过CButton类的成员函数来操作,下表为按钮类CButton的成员函数。,8.3.3 按钮控件(续),3常用消息 下表为常见的按钮通知消息中附带的通知代码。,8.3.4 编辑控件,编辑控件是一个让用户从键盘输入并编辑文字的矩形窗口,用户可以通过它方便地输入各种文字、数字或者口令,也可使用它来编辑或修改简单的文本文件。若用户在编辑控件内单击鼠标,或者按Tab键,就可以选中一个编辑控制框,并赋予它输入焦点。被选中后,编辑控制框中将显示其文本和一个表明插入点的位置的闪烁的插入符,然后用户就可以用键盘或者鼠标来输入文本,移动插入点,或者选择将移动或删除的文本。,1常见属性 在对话框应用程序中,选中所添加的编辑框控件,然后按ALT和回车键,就会弹出编辑框控件属性设置对话框。,8.3.4 编辑控件(续),2常用方法 编辑框控件操作是通过CEdit类的成员函数来操作,表中为编辑框控件类CEdit的成员函数。,3常用消息,表中是常见的编辑框通知消息。,4实例 【例8-3】一个演示静态文本控件、按钮控件和编辑框控件的程序。它能求数一和数二的最大公约数和最小公倍数。 (1)创建一个基于对话框的应用程序GcdExam,向导生成的每个步骤都使用缺省的。 (2)在对话框资源IDD_GCDEXAM_DIALOG中添加控件如下图所示。,在对话框中,设置控件的属性如下表所示,例8-3 (续),(3)添加单选按钮的消息映射 前面讲的所有程序中的消息映射的添加都是通过ClassWizard来进行的,但有时想要处理的消息在类向导中没有,或者需要对一些特殊的情况要处理(如本例子,想用一个消息响应函数OnGcd响应多个ON_COMMAND消息)时,当有很多个命令的功能类似,可以设置它们的ID号为连续的,再在消息映射中处理。ClassWizard不支持这种功能,程序员必须手工在消息映射中添加这类映射项。对于本程序,我们希望单击“最大公约数”或“最小公倍数”时,都执行同一个消息映射函数OnGcd(UINT nID),然后在映射函数再做进一步的处理。手工添加消息映射函数的步骤为:,对话框类CGcdExamDlg头文件GcdExamDlg.h中添加消息映射函数原型说明。 class CGcdExamDlg : public CDialog public: CGcdExamDlg(CWnd* pParent = NULL); / standard constructor / Generated message map functions /AFX_MSG(CGcdExamDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnGcd(UINT nID); /手工添加的消息映射函数原型说明 /AFX_MSG DECLARE_MESSAGE_MAP() ;,在对话框类CGcdExamDlg的实现文件GcdExamDlg.cpp中添加消息映射。 BEGIN_MESSAGE_MAP(CGcdExamDlg, CDialog) /AFX_MSG_MAP(CGcdExamDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND_RANGE(IDC_RADIO1, IDC_RADIO2, OnGcd) /AFX_MSG_MAP END_MESSAGE_MAP() ,在对话框类CGcdExamDlg的实现文件GcdExamDlg.cpp中实现消息映射函数。 void CGcdExamDlg:OnGcd(UINT nID) UpdateData(true); /将前台输入到界面中的数据保存到后台变量中 int p,q,r; p=min(m_nSource1,m_nSource2); /p为两者的较小者 q=max(m_nSource1,m_nSource2);/q为两者的较大者 if (nID=IDC_RADIO1) /求最大公约数的话(利用欧几里德算法) while(r=q%p) q=p; p=r; m_nResult=p; /p为最大公约数,放到变量m_nResult中显示 if (nID=IDC_RADIO2) /求最小公倍约数的话 r=p; /p为较小者 while(p%q!=0) /p不能被q整除的话 p+=r; /一直累加原较小者,直到累加结果能被原较大者整除 m_nResult=p; /p为最大公约数,放到变量m_nResult中显示 UpdateData(false); /将后台更改的数据送到前台加以显示 ,8.3.5 列表框控件,列表框是一个放有用户可以选择的对象列表项的控制窗口,这些列表项一般是以字符串形式或图形形式来给出。它与单选按钮组或复选框组一样,都可以让用户在其中选择一个或多个项,但不同的是,列表框中项的数目是可灵活变化的,程序运行时可往列表框中添加或删除某些项。并且当列表框中的数目较多,列表框不能一次全部显示时,就可以提供滚动条来拓展显示范围。,8.3.5 列表框控件(续),1常见属性 在对话框的应用程序中,选中所添加的列表框控件,然后按鼠标右键弹出菜单,选择“Properities”菜单项,就会弹出列表框控件的属性设置对话框,如下图所示。,8.3.5 列表框控件(续),2常用方法 列表框控件的操作是通过CListBox类的成员函数来操作,下表为列表框控件类CListBox的成员函数。,8.3.5 列表框控件(续),3常用消息 列表框的操作,不仅可以调用CListBox类的成员函数来进行,还可以通过发送消息给列表框来进行。 (1)发送消息到列表框 当列表框创建出来之后,往往要添加、删除、修改或检查列表框中的项,列表框的项除了用字符串来指定外,还往往通过索引来确定。索引表明某项在列表框中排列的位置,它以0为基准,即列表框中的第一项索引为0,第二项索引为1,依此类推。,8.3.5 列表框控件(续),(2)列表框发出的通知消息 当列表框发生了某个事件,如用户双击了列表框中的某一项,列表框就会向其所属的主窗口发送一条通知消息。列表框的通知消息是以带参数的WM_COMMAND消息的形式来发送的。,8.3.5 列表框控件(续),这时WM_COMMAND的wParam参数的高位字就是通知代码,低位字是列表框的资源标识符,lParam参数则是列表框的句柄。 常见的列表框通知消息有三条:LBN_SELCHANGE表示列表框中的选择将要改变,LBN_DBLCLK 表示用户双击了列表框中的某一项,LBN_SELCANCEL表示用户取消了对列表框中的某一项选择。,8.3.6 组合框控件,一个组合框是一个列表框和编辑框控件或者静态文本框控件的组合。控件的列表部分可以始终显示,也可以当用户单击了下拉箭头时才打开,当前选择的内容在静态文本框或编辑框中显示。另外,若组合框具有下拉列表风格,用户可以键入列表框中的某个选项的开始字符来选择它。如果列表框的内容是可见的,列表框将把开头内容与用户键入内容相匹配的第一项高亮度显示。,8.3.6 组合框控件(续),1.常见属性 在对话框的应用程序中,选中所添加的组合框控件,然后按鼠标右键弹出菜单,选择Properities菜单项,就会弹出组合框控件的属性设置对话框,如下图所示。,8.3.6 组合框控件(续),2.常用方法 组合框控件的操作是通过CComboBox类的成员函数来操作,下表为组合框控件类CcomboBox常用的成员函数。,8.3.6 组合框控件(续),3.常用消息 列表框的操作,不仅可以调用CComboBox类的成员函数来进行,还可以通过发送消息给组合框来进行,因此,首先要熟悉可以发送到组合框中的消息有哪些。,8.3.6 组合框控件(续),(1)发送消息到组合框 发给到组合框的消息大体分为两类:一类是作用于组合框中的列表部分,另一类是作用于组合框中的编辑控件,它们分别与发送给列表框和编辑框控件的消息存在对应关系。 作用于组合框中的列表框的消息有CB_ADDSTRING、CB_INSERTSTRING、CB_DELETESTRING等,它们分别对应于发给列表框中的消息LB_ADDSTRING、LB_INSERTSTRING、 LB_DELETESTRING等。 作用于组合框中的编辑框的消息有CB_GETEDITSEL、CB_SETEDITSEL、WM_CUT等。,8.3.6 组合框控件(续),(2)组合框发出的通知消息 组合框发出的通知代码也包含在WM_COMMAND消息的wParam参数高位字节中,它们与列表框以及组合框的通知消息存在一一对应关系。CBN_DBCLICK表示用户双击了一个列表项, CBN_SELCHANGE表示用户当前的选择发生了变化,CBN_CLOSEUP表示下拉列表框的列表即将被关闭,CBN_DROPDOWN表示表示下拉列表框的列表即将被打开等。,例8-4,【例8-4】一个练习列表框与组合框的实例。本实例侧重对话框界面控件的放置和属性的设置。 (1)程序功能:程序运行后的界面如下图所示。在列表框中选择汽车的品牌,左边就会显示相应汽车的图片和注释文字;同时,通过字体组合框开可以选择注释文字的字体。,例8-4(续),(2)生成程序:利用应用程序向导创建一个基于对话框的应用程序StaticControl,向导生成的每个步骤都使用缺省的。 (3)添加控件: 在对话框资源IDD_STATICCONTROL_DIALOG 中添加如上页图所示的几种控件。显示图片的Picture图片控件、选择汽车的列表框控件、选择字体的组合框控件、显示汽车注释的静态文本控件。 (4)增加位图资源:用鼠标右键单击ClassView选项卡的最顶端,在弹出出式菜单中选择“Import”导入命令,将外部的一些汽车图片载入应用程序的资源中,共导入八张图片,其资源的ID号从IDB_BITMAP1到IDB_BITMAP8。,例8-4(续),(5)设置控件的属性:控件的主要属性设置与对应的成员变量, WM_INITDIALOG的消息映射函数代码 BOOL CStaticControlDlg:OnInitDialog() /主要进行列表框中可选项内容的填写 CDialog:OnInitDialog(); /向导生成的代码 /以下为手工添加的代码 /通过向列表框发送消息的方法来访问列表框(向列表框中增加选项) SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“高尔夫“); SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“标 致“); SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“别 克“); SendDlgItemMessage(IDC_LIST1,LB_ADDSTRING,0,(DWORD)“宝 马“); /使用类型无关的方法来访问列表框 CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LIST1); pListBox-AddString(“奥 迪“); pListBox-AddString(“马自达“); pListBox-AddString(“甲克虫“); pListBox-AddString(“奔 驰“); /设置列表框的初始位置为0 pListBox-SetCurSel(0); /设置字体组合框的初始位置为0,通过控件变量的方式来访问 m_ComboxFont.SetCurSel(0); , 组合框控件CBN_CLOSEUP的消息响应函数OnCloseupCombo1() void CStaticControlDlg:OnCloseupCombo1() /在该函数中,实现字体的选择 /显示汽车的描述文字 char *CarIntroduce8=“高尔夫-德国名车,世界经典两相轿车“,“标致-法国名车,线条流畅,造型时尚“,“别克-美国名车,空间宽敞,视野开阔“,“宝马-德国名车,动力充沛,操控灵活“, “奥 迪-德国名车,工艺精细,配置齐全“,“马自达-日本名车,悬挂偏硬,转向灵活“,“甲克虫-德国名车,外型圆滑,提速很快“,“奔 驰-德国名车,造型流畅,充满活力“; UpdateData(true); /获得静态文本框控件IDC_STATIC1的窗口指针和设备环境 CStatic *pTxt=(CStatic *)GetDlgItem(IDC_STATIC1); CDC *pDC=pTxt-GetDC(); /获得静态文本框控件IDC_STATIC1的客户区域 CRect rc; pTxt-GetClientRect(,/设置文字的色彩并输出文字 pDC-SetBkColor(RGB(0,255,0);/设置背景色 pDC-SetBkMode(TRANSPARENT); /设置显示模式为透明 pDC-SetTextColor(RGB(0,0,255);/设置文本颜色 CFont font; /创建字体 VERIFY(font.CreatePointFont(160,m_FontName,pDC); pDC-SelectObject( ,列表框控件CBN_SELCHANGE的消息响应函数OnSelchangeList1() 在该函数中,实现汽车图片的选择并显示: void CStaticControlDlg:OnSelchangeList1() /通过向对话框中的控件发消息拉取列表框中的选择 short bmpNo=SendDlgItemMessage(IDC_LIST1,LB_GETCURSEL,0,0); bmpNo+; /显示汽车的图片 /获得静态文本框控件IDC_STATIC1的窗口指针和设备环境 CStatic *pTxt=(CStatic *)GetDlgItem(IDC_STATIC2); CBitmap MyBitmap; switch(bmpNo) case 1: MyBitmap.LoadBitmap(IDB_BITMAP1); break; case 2: MyBitmap.LoadBitmap(IDB_BITMAP2); break; case 3: MyBitmap.LoadBitmap(IDB_BITMAP3); break;,case 4: MyBitmap.LoadBitmap(IDB_BITMAP4); break; case 5: MyBitmap.LoadBitmap(IDB_BITMAP5); break; case 6: MyBitmap.LoadBitmap(IDB_BITMAP6); break; case 7: MyBitmap.LoadBitmap(IDB_BITMAP7); break; case 8: MyBitmap.LoadBitmap(IDB_BITMAP8); break; pTxt-SetBitmap(MyBitmap.operator HBITMAP(); /将选择的位图送到图片控件中显示 OnCloseupCombo1();/显示汽车的描述文字 ,8.3.7 控件的类型无关访问,面向对象程序设计观点认为,在应用程序中只要获得了应用程序中某对象的指针,就可以实现对该对象的全面控制,那么在对话框的应用程序中,如何获得其中的任何一个控件呢? 对话框中的控件可以使用MFC控件类的接口进行访问,也可以创建控件对象并将其连接到对话框控件上来访问。,8.3.7 控件的类型无关访问(续),1使用成员函数GetDlgItem获取某个资源ID的指针 调用CWnd 的成员函数GetDlgItem 返回一个指向给定控件的临时对象的指针,并将返回值类型制转换成适当的C+控件类型。 2使用Class Wizard 建立Control型变量 使用Class Wizard 可以给某个控件建立与之关联的两类变量,一类是Value值类型变量,另一类是Control控件型变量。 如果只是简单地访问某一控件的值,那么利用类向导建立Value值类型变量。如果不仅仅是访问某一控件的值,而且要实现对该控件的完全控制,就需要用ClassWizard 给该控件建立Control控件型变量。,8.3.7 控件的类型无关访问(续),简单来说,一种建立的是对话框类的普通型成员变量,另一类建立的是对象成员变量,该对象所属的类型就是它的控件类型。 对话框类中的成员变量可以拥有Control属性和Value 属性。Value属性指的是从控件所返回数据的类型(如CString或long等);Control属性允许通过某一成员变量对控件进行直接访问,成员变量的类型必须是MFC控件类(如CEdit或CComboxList)之一。对于某一给定的控件,可以有多个具有Value属性的成员变量,但最多只能有一个具有Control属性的成员变量。,8.3.7 控件的类型无关访问(续),具有Control属性的成员变量又称为对象成员,可以使用对象成员调用控件的任何成员函数进行操作。例如,对于由m_checkboxDefault变量表示的CButton类型的复选框控件,可以用m_checkboxDefault.SetState(TRUE)来设置控件的状态。如果复选框不是自动复选框,那么对话

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论