1、对话框和常用控件对话框和常用控件本章内容本章内容 4.1 4.1 对话框简介对话框简介 4.2 4.2 对话框资源对话框资源 4.3 4.3 对话框程序设计方法对话框程序设计方法 4.4 4.4 常用控件(自学)常用控件(自学)4.5 4.5 作业作业4.1 4.1 对话框简介对话框简介 对对话话框框是是一一种种用用户户界界面面,它它为为用用户户提提供供了了一一种种标标准准的的处处理理数数据据的的方方法法。因因为为大大部部分分的的对对话话框框是是作作为为对对菜菜单单的的单单击击响响应应而而显显示示出出来来的的(在在WordWord软软件件中中,单单击击菜菜单单项项后后有有的的菜菜单单,看看都都
2、会会出出现现哪哪些些对对话话框框),因因此对话框常常被看作是用户菜单命令的扩展。此对话框常常被看作是用户菜单命令的扩展。从程序员角度来看,对话框和控件都是窗口,查从程序员角度来看,对话框和控件都是窗口,查看看MSDNMSDN中的中的MFCMFC组织图可以看到,它们都是从组织图可以看到,它们都是从CWndCWnd类派类派生来的,这正好说明了生来的,这正好说明了“对话框和控件都是窗口对话框和控件都是窗口”。因此,对对话框的操作,经常要使用窗口的成员函数因此,对对话框的操作,经常要使用窗口的成员函数来进行。来进行。4.1.14.1.1对话框的分类对话框的分类 1 1模态对话框模态对话框 在在对对话话
3、框框关关闭闭之之前前,用用户户无无法法在在应应用用程程序序的的其其它它窗窗口口中中进进行行工工作作的的对对话话框框称称为为模模态态对对话话框框。例例如如WindowsWindows的的各各种种应应用用软软件件中中的的Open Open File File 对对话话框框,用用户不能在应用程序的其它地方工作,直到对话框关闭。户不能在应用程序的其它地方工作,直到对话框关闭。2 2非模态对话框非模态对话框 对话框保留在屏幕的同时,用户还可以在应用程对话框保留在屏幕的同时,用户还可以在应用程序其它窗口中进行工作的对话框称为非模态对话框。序其它窗口中进行工作的对话框称为非模态对话框。例如,例如,WordW
4、ord字处理软件中的字处理软件中的Find Find 和和ReplaceReplace对话框就对话框就是非模态对话框的一个很好的例子。是非模态对话框的一个很好的例子。4.1.24.1.2对话框的组成对话框的组成 对话框模板对话框模板 对对话话框框模模板板定定义义了了对对话话框框的的特特性性(比比如如大大小小、位位置置和和风风格格)以以及及对对话话框框中中每每个个控控件件的的类类型型和和位位置置。程程序序员员不不仅仅可可以以使使用用对对话话框框资资源源编编辑辑器器建建立立对对话话框框资资源源模模板板外外,还还可可以以根根据据需需要要在在内内存存中中创创建建对对话话框框模模板板。当当对对话话框框模
5、模板板创创建建后后,程程序序员员好好可可以以在在创创建建和和管管理理对对话话框框时时动动态态地地改改变变部部分分控控件件的的信信息息,如如禁禁止、变灰、改变标题和大小。止、变灰、改变标题和大小。对对话话框框模模板板可可以以看看作作对对话话框框应应用用程程序序的的一一种种用用户户接接口口,用用户户在在应应用用程程序序的的使使用用中中,看看到到的的都都是是资源模板中的东西。资源模板中的东西。4.1.24.1.2 对话框的组成对话框的组成(续续)对话框类对话框类 从从CDialogCDialog类类派派生生的的对对话话框框类类提提供供编编程程接接口口来来管管理理与与对对话话框框模模板板相相关关联联的
6、的对对话话框框。CDialogCDialog类类的的许许多多成成员员函函数数与与对对话话框框编编程程密密切切相相关关,可可供供程程序序员员调调用用。由由于于对对话话框框是是一一种种窗窗口口,因因此此相相应应的的对对话话框框类类必必须须与与一一个个WindowsWindows窗窗口口相相联联系系,而而对对话话框框资资源源模模板板就就是是用用于于创创建建这这个个WindowsWindows窗窗口口及及其其包包含含在在其其中中的的控控件。件。对对话话框框类类可可以以看看作作对对话话框框应应用用程程序序的的一一种种程程序序员员接接口口,用用户户对对应应用用程程序序操操作作,后后台台调调用用的的都都是是
7、该类的成员函数来完成的。该类的成员函数来完成的。Visual C+Visual C+程序设计程序设计6 4.1.34.1.3 对话框的实现过程对话框的实现过程使用对话框的一般过程:使用对话框的一般过程:添加对话框资源;添加对话框资源;设置对话框的属性;设置对话框的属性;添加和布局控件;添加和布局控件;创建对话框类;创建对话框类;添加对话框代码;添加对话框代码;在程序中调用对话框。在程序中调用对话框。4.2 4.2 对话框资源对话框资源图4.1 Ex_SDI资源视图资源类别资源类别资源标识符资源标识符一个单文档应用程序所使用的资源可分为下列几类:一个单文档应用程序所使用的资源可分为下列几类:(1
8、)(1)快快捷捷键键列列表表(Accelerator)(Accelerator)。一一系系列列组组合合键键的的集集合合,被被应应用用程程序序用用来来引引发发一一个个动动作作。该该列列表表一一般般与与菜菜单单命命令相关联,用来代替鼠标操作。令相关联,用来代替鼠标操作。(2)(2)对对话话框框(Dialog)(Dialog)。含含有有按按钮钮、列列表表框框、编编辑辑框框等等各种控件的窗口。各种控件的窗口。(3)(3)图图标标(Icon)(Icon)。代代表表应应用用程程序序显显示示在在WindowsWindows桌桌面面上上的位图,它同时有的位图,它同时有32x3232x32像素和像素和16x16
9、16x16像素两种规格。像素两种规格。(4)(4)菜菜单单(Menu)(Menu)。用用户户通通过过菜菜单单可可以以完完成成应应用用程程序序的的大部分操作。大部分操作。(5)(5)字字串串表表(String(String Table)Table)。应应用用程程序序使使用用的的全全局局字字符串或其他标识符。符串或其他标识符。Visual C+Visual C+程序设计程序设计9(6)(6)工具栏按钮工具栏按钮(Toolbar)(Toolbar)。工具栏外观是以一。工具栏外观是以一系列具有相同尺寸的位图组成的,它通常与一系列具有相同尺寸的位图组成的,它通常与一些菜单命令相对应,用以提高用户的工作效
10、率。些菜单命令相对应,用以提高用户的工作效率。(7)(7)版本信息版本信息(Version)(Version)。包含应用程序的版本、。包含应用程序的版本、用户注册码等相关信息。用户注册码等相关信息。除了上述常用资源类别外,除了上述常用资源类别外,Visual C+6.0Visual C+6.0应用程序中还可有鼠标指针、应用程序中还可有鼠标指针、HTMLHTML等,也可以等,也可以自己添加新的资源类别。自己添加新的资源类别。IDID标识符标识符一般地,要遵循下列规则:一般地,要遵循下列规则:在标识符名称中允许使用字母在标识符名称中允许使用字母azaz、AZAZ、0909以及下以及下划线。划线。标
11、识符名称不区分大小写字母,如标识符名称不区分大小写字母,如new_iddnew_idd与与New_IddNew_Idd是相同的标识符。是相同的标识符。不能以数字开头,如不能以数字开头,如8BIT8BIT是不合法的标识符名。是不合法的标识符名。除了上述规则外,出于习惯,除了上述规则外,出于习惯,Visual C+Visual C+还提供了一还提供了一些常用的定义些常用的定义标识符名称的前缀供使用、参考,见下表。标识符名称的前缀供使用、参考,见下表。Visual C+Visual C+程序设计程序设计11添加对话框资源添加对话框资源对展开的不同类型的对话框资源不作任何选择,选对展开的不同类型的对话
12、框资源不作任何选择,选中中“DialogDialog”,单击,单击 新建新建 按钮,系统就会自动为按钮,系统就会自动为当前应用程序添加了一个对话框资源,并出现如下当前应用程序添加了一个对话框资源,并出现如下图所示的界面。图所示的界面。添加对话框资源后的开发环境Visual C+Visual C+程序设计程序设计13对话框模板对话框模板控件工具栏控件工具栏布局工具栏布局工具栏默认标识符默认标识符一旦对话框资源被打开或被创建,就会出现对话框一旦对话框资源被打开或被创建,就会出现对话框编辑器,通过它可以在对话框中进行控件的添加和编辑器,通过它可以在对话框中进行控件的添加和布局等操作。布局等操作。控件
13、的添加。控件的添加。对对话话框框编编辑辑器器最最初初打打开开时时,控控件件工工具具栏栏是是随随之之出出现现的的,利利用用此此工工具具栏栏中中的的各各个个按按钮钮可可以以顺顺利利完完成成控控件件的添加。下图说明了各个按钮所对应的控件类型。的添加。下图说明了各个按钮所对应的控件类型。Visual C+Visual C+程序设计程序设计15控件的选择控件的选择静态文本静态文本组框组框复选框复选框组合框组合框水平滚动条水平滚动条旋转按钮旋转按钮滑动条滑动条列表视图列表视图标签标签复合编辑复合编辑月历月历用户定制控件用户定制控件静态图片静态图片编辑框编辑框按钮按钮单选框单选框列表框列表框垂直滚动条垂直滚
14、动条进展条进展条热键热键树形视图树形视图动画动画日期选择日期选择IPIP地址地址扩展组合框扩展组合框创建对话框类创建对话框类 MFCMFC提提供供了了一一系系列列对对话话框框类类,并并实实现现了了对对话话框框消消息息响响应应和和处处理理机机制制。CDialogCDialog类类是是对对话话框框类类中中最最重重要要的的类类,我我们们在在程程序序中中创创建建的的对对话话框框类类一一般般都都是是CDialogCDialog类类的的派派生生类类。CDialogCDialog类类还还是是其其它它所所有有对对话话框框类类的的基基类类,其其派派生关系如下所示:生关系如下所示:CObject CObject
15、CCmdTarget CCmdTarget CWnd CWnd CDialogCDialog Visual C+Visual C+程序设计程序设计17CDialogCDialog类类从从CWndCWnd类类派派生生而而来来,所所以以它它继继承承了了CWndCWnd类类的的成成员员函函数数,具具有有CWndCWnd类类的的基基本本功功能能,在在你你的的CDialogCDialog类类的的派派生生类类中中可可以以直直接接调调用用CDialogCDialog类类的的成成员员函函数数。大大部部分分的的成成员员函函数数是是虚虚函函数数,可可以以在在你你的的派派生生类类中中重重载载,以以实实现现特特定定的
16、的目目的的。除除了了CDialogCDialog类类成成员员函函数数,类类CWndCWnd和和CWinAppCWinApp也也提提供供了一些成员函数用于对话框的管理。了一些成员函数用于对话框的管理。有关对话框的常用处理函数有关对话框的常用处理函数CDialog:CDialog()CDialog:CDialog()通通过过调调用用派派生生类类构构造造函函数数,根根据据对对话话框框资资源源模模板定义一个对话框。板定义一个对话框。CDialog:DoModal()CDialog:DoModal()激活模态对话框,显示对话框窗口。激活模态对话框,显示对话框窗口。CDialog:Create()CDia
17、log:Create()根根据据对对话话框框资资源源模模板板创创建建非非模模态态对对话话框框窗窗口口。如如 果果 对对 话话 框框 不不 是是 VisibleVisible属属 性性,还还 需需 通通 过过 调调 用用 CWnd:ShowWindowCWnd:ShowWindow()()函数显示非模态对话框窗口。函数显示非模态对话框窗口。CDialog:OnOk()CDialog:OnOk()单单击击OKOK按按钮钮时时调调用用该该函函数数,接接收收对对话话框框输输入入数数据,关闭对话框。据,关闭对话框。Visual C+Visual C+程序设计程序设计19CDialog:OnCancel(
18、)CDialog:OnCancel()单单击击CancelCancel按按钮钮或或按按EscEsc键键时时调调用用该该函函数数,不接收对话框输入数据,关闭对话框。不接收对话框输入数据,关闭对话框。CDialog:OnInitDialog()CDialog:OnInitDialog()WM_INITDIALOGWM_INITDIALOG消消 息息 处处 理理 函函 数数,在在 调调 用用DoModalDoModal或或CreateCreate函函数数时时系系统统发发送送WM_INITDIALOGWM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。消息,在显示对话框前调用该函数进行
19、初始化。CDialog:EndDialog()CDialog:EndDialog()用于关闭模态对话框窗口。用于关闭模态对话框窗口。CWnd:ShowWindow()CWnd:ShowWindow()显示或隐藏对话框窗口显示或隐藏对话框窗口CWnd:DestroyWindow()CWnd:DestroyWindow()关闭并销毁非模态对话框关闭并销毁非模态对话框CWnd:UpdateData()CWnd:UpdateData()通通过过调调用用DoDataExchange()DoDataExchange()设设置置或或获获取取对对话话框框控控件件的的数数据据,此此函函数数只只有有一一个个BOO
20、LBOOL参参数数,当当为为TRUETRUE时时,将将控控件件信信息息转转换换为为变变量量数数据据;反反之之,将将变变量数据转换为控件信息。量数据转换为控件信息。CWnd:DoDataExchange()CWnd:DoDataExchange()被被UpdateData()UpdateData()调调用用以以实实现现对对话话框框数数据据交交换换,不能直接调用。不能直接调用。CWnd:GetWindowText()CWnd:GetWindowText()获取对话框窗口的标题获取对话框窗口的标题CWnd:SetWindowText()CWnd:SetWindowText()修改对话框窗口的标题修改
21、对话框窗口的标题CWnd:GetDlgItemText()CWnd:GetDlgItemText()获取对话框中控件的文本内容获取对话框中控件的文本内容CWnd:SetDlgItemText()CWnd:SetDlgItemText()设置对话框中控件的文本内容设置对话框中控件的文本内容CWnd:GetDlgItem()CWnd:GetDlgItem()获取控件或子窗口的指针获取控件或子窗口的指针CWnd:MoveWindow()CWnd:MoveWindow()用于移动对话框窗口用于移动对话框窗口CWnd:EnableWindow()CWnd:EnableWindow()使窗口处于禁用或可用
22、状态使窗口处于禁用或可用状态2626 4.3 4.3 对话框程序设计方法对话框程序设计方法例例1:1:模式对话框设计模式对话框设计 在在本本例例中中,我我们们将将制制作作一一个个简简单单的的对对话话框框,它它通通过过菜菜单单命命令令弹弹出出,当当单单击击菜菜单单命命令令“弹弹出出对对话框话框”,应用程序弹出一名为,应用程序弹出一名为“DialogDialog”对话框。对话框。注注意意:在在模模式式对对话话框框推推出出之之前前,程程序序不不能能继继续续进进行,必须等到对话框关闭。行,必须等到对话框关闭。实现步骤:实现步骤:1 1、建立资源;、建立资源;2 2、创建类;、创建类;3 3、实现消息映
23、射,添加代码;、实现消息映射,添加代码;4 4、编译运行、编译运行。1 1、建立资源、建立资源运行运行AppWizardAppWizard建立一个单文档应用程序建立一个单文档应用程序创建对话框模板,单击菜单命令创建对话框模板,单击菜单命令“Insert/ResourceInsert/Resource”,选中选中“DialogDialog”,单击单击“newnew”按钮,可看到如下对话框模板。按钮,可看到如下对话框模板。首先删除首先删除“CancelCancel”按钮,将按钮,将“OKOK”按钮拖放到中下按钮拖放到中下方,之后添加一个方,之后添加一个“Static TextStatic Text
24、”控件,设置标题为控件,设置标题为“VCVC课程课程”。设置对话框设置对话框IDID,鼠标右键单击对话框,选择,鼠标右键单击对话框,选择“PropertiesProperties”选项,在弹出的属性对话框中,选项,在弹出的属性对话框中,IDID设设置为置为IDD_MYDIALOGIDD_MYDIALOG。Visual C+Visual C+程序设计程序设计28创建菜单命令创建菜单命令:打开资源编辑器中的菜单项,添加自己打开资源编辑器中的菜单项,添加自己的菜单命令,其的菜单命令,其IDID值设置为值设置为ID_PUPDIALOGID_PUPDIALOG 2 2、创建类、创建类创创建建基基于于新新
25、对对话话框框的的类类,可可双双击击新新建建的的对对话话框框,它它将弹出下面菜单将弹出下面菜单单击单击“okok”按钮,在下一个出现的对话框中添加新建按钮,在下一个出现的对话框中添加新建的类名,选择基类和对话框的类名,选择基类和对话框IDID,在,在NameName选项中填入选项中填入“CMyDlgCMyDlg”,在,在“Base classBase class”选项中选择选项中选择“CDialogCDialog”作为该类的基类。作为该类的基类。3 3、实现消息映射,添加代码、实现消息映射,添加代码选择类名选择类名CMainFrameCMainFrame(管理菜单),选择(管理菜单),选择IDI
26、D:ID_PUPDIALOG,ID_PUPDIALOG,在在MessageMessage中选择中选择COMMANDCOMMAND,通过,通过ADD ADD FUNCTION FUNCTION 建立菜单项建立菜单项“弹出对话框弹出对话框”的消息映射。的消息映射。在函数中添加如下代码:在函数中添加如下代码:在在MainFrm.cppMainFrm.cpp文件中添加如下代码:文件中添加如下代码:#include#include“MyDlg.hMyDlg.h”4 4、编译运行,单击、编译运行,单击build/Execute *.exebuild/Execute *.exe。结果如下。结果如下例例2 2
27、 文本控件应用文本控件应用本例通过键盘输入信息显示在菜单窗口。本例通过键盘输入信息显示在菜单窗口。步骤:步骤:1 1、建立单文档程序,建立对话框,修改其属性、建立单文档程序,建立对话框,修改其属性2 2、建立菜单、建立菜单3 3、为新对话框建立新类、为新对话框建立新类4 4、建立消息映射、添加代码;、建立消息映射、添加代码;5 5、编译运行、编译运行1 1、建立单文档程序,建立对话框,修改其属性、建立单文档程序,建立对话框,修改其属性运行运行AppWizardAppWizard创建一单文档应用程序创建一单文档应用程序创建对话框模版创建对话框模版将对话框将对话框“OKOK”按钮的标题改为按钮的标
28、题改为“ApplyApply”,添加一添加一个文本控件和一个静态文本控件个文本控件和一个静态文本控件 设置文本控件设置文本控件IDID,IDID值为:值为:IDC_MYEDITIDC_MYEDIT设置对话框设置对话框ID,ID,鼠标右键单击对话框,选择鼠标右键单击对话框,选择“PropertiesProperties”选项,在属性对话框中选项,在属性对话框中IDID设置为设置为IDD_MYDIALOGIDD_MYDIALOG。2 2、建建立立菜菜单单打开资源编辑器中的菜单项,添加自己的菜单命令。打开资源编辑器中的菜单项,添加自己的菜单命令。3 3、为新对话框建立新类、为新对话框建立新类新对话框
29、类属性设置新对话框类属性设置 4 4、建立消息映射、添加代码、建立消息映射、添加代码在在CMyDlgCMyDlg对话框类头文件中添加一个公有成员变量对话框类头文件中添加一个公有成员变量CStringCStringm_String;/m_String;/用于与对话框文本控件数据用于与对话框文本控件数据交换。交换。/通过此字符变量获取文本控件信息。通过此字符变量获取文本控件信息。在在CMyDlgCMyDlg对话框类的构造函数对此变量进行初始化。对话框类的构造函数对此变量进行初始化。CMyDlg:CMyDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDlg:IDD,pPa
30、rent)/AFX_DATA_INIT(CMyDlg)/NOTE:the ClassWizard will add member initialization herem_String=_T();m_String=_T();/AFX_DATA_INIT在在CMyDlgCMyDlg对话框类的对话框类的DoDataExchangeDoDataExchange函数中添加动态函数中添加动态数据映射函数数据映射函数void CMyDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMyDlg)/N
31、OTE:the ClassWizard will add DDX and DDV calls hereDDX_Text(pDX,IDC_MYEDIT,m_String);DDX_Text(pDX,IDC_MYEDIT,m_String);/AFX_DATA_MAP此函数将此函数将IDID为为IDC_MYEDITIDC_MYEDIT的控件内容信息传给的控件内容信息传给m_Stringm_String。在视图类的头文件中添加如下代码:在视图类的头文件中添加如下代码:#include“MyDlg.h”/将对话框类包含到视图类中。class CMyMsgView:public CViewprotect
32、ed:/create from serialization onlyCMyMsgView();DECLARE_DYNCREATE(CMyMsgView)/Attributespublic:CMyMsgDoc*GetDocument();CMyDlg Dlg;/CMyDlg Dlg;/创建对话框对象创建对话框对象 CString str;/CString str;/此字符变量存储对话框传来的控此字符变量存储对话框传来的控件内容信息。件内容信息。/Operations添加菜单命令添加菜单命令“ID_DLGID_DLG”的消息映射的消息映射 在在OnDlgOnDlg函数中添加代码函数中添加代码 vo
33、id CMyMsgView:OnDlg()void CMyMsgView:OnDlg()/TODO:Add your command handler code hereif(Dlg.DoModal()=IDOK)/if(Dlg.DoModal()=IDOK)/输入完毕点击输入完毕点击ApplyApplystr=Dlg.m_String;/str=Dlg.m_String;/将对话框文本控件内容赋值将对话框文本控件内容赋值给视类的字符变量给视类的字符变量strstrInvalidate();/Invalidate();/更新窗口更新窗口 在在OnDrawOnDraw函数中实现将输入文字显示在窗口
34、中,添加函数中实现将输入文字显示在窗口中,添加代码如下:代码如下:void CMyMsgView:OnDraw(CDC*pDC)void CMyMsgView:OnDraw(CDC*pDC)CMyMsgDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereCRect r;/CRect r;/创建矩形类对象创建矩形类对象GetClientRect(&r);/GetClientRect(&r);/获取显示窗口大小获取显示窗口大小int x=r.right/2,y=r.bottom/2;/int x=r.right/2,y=r.bottom/2;/显示字符的起始显示字符的起始点点pDC-SetTextAlign(TA_CENTER|TA_BASELINE);/pDC-SetTextAlign(TA_CENTER|TA_BASELINE);/文文本内容居中显示本内容居中显示pDC-TextOut(x,y,str);/pDC-TextOut(x,y,str);/输出文本输出文本 5 5、编译运行、编译运行本章作业本章作业1 1、练习本章书中对话框例子;、练习本章书中对话框例子;2 2、完成书后实验、完成书后实验9 9;3 3、练习课件的两个例子、练习课件的两个例子
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100