08对话框.doc_第1页
08对话框.doc_第2页
08对话框.doc_第3页
08对话框.doc_第4页
08对话框.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

第8章 对话框28.1对话框模板28.1.1 资源描述文件对话框模板脚本28.1.2 对话框编辑器设计对话框48.2对话框类58.2.1 对话框类的定义58.2.2 对话框的类型68.3对话框的数据交换108.3.1数据交换DDX函数108.3.2进行数据交换DoDataExchange函数118.3.3更新数据DoDataExchange函数118.3.4为对话框控件添加成员变量11第8章 对话框对话框是Windows应用程序与用户进行交互的重要手段,用户是通过操作对话框中的控件与Windows应用程序实现交互的。对话框是CDialog类对象,CDialog类是CWnd类的派生类。从程序设计的角度来说,设计一个对话框需要编写对话框模板资源描述文件和派生对话框类。本章主要介绍如下内容:l 对话框模板;l 对话框的定义及使用;l 对话框的综合运用;l 属性页。8.1对话框模板创建对话框有两种方法,一种是在资源描述文件中通过编写对话框模板脚本的方式来定义对话框的外观,另外一种是利用VC+6.0提供的资源编辑器对对话框进行设计。8.1.1 资源描述文件对话框模板脚本在资源描述文件中,对话框模板脚本描述了对话框的外观及控件的放置位置。对话框模板脚本的格式为:对话框名 DIALOG 载入特性选项 X, Y, Width, Height设置选项BEGIN对话框上控件的定义END其中,对话框名是对话框资源标识符,DIALOG是对话框的关键字,X和Y分别是对话框左上角位置的横坐标和纵坐标,Width和Height分别是对话框的宽度和高度,设置选项一般包括CAPTION(对话框标题),FONT(字体)和STYLE(样式)等。对话框上可以放置各种各样的控件,控件的定义放在BEGIN和END之间。设置选项的CAPTION后面是标题文本,FONT后面是字号和字体, STYLE确定了对话框的外貌,除了可以选用窗口的一般样式外,系统还定义了对话框所特有的样式,见表8.1.1。其中,DS_是对话框样式(Dialog Style)的前缀。表8.1.1 对话框常用的样式对话框样式名说 明对话框样式名说 明DS_3DLOOK使用三维边框DS_MODALFRAME细实线边框DS_FIXEDSYSSYSTEM_FIXED字体DS_SYSMODAL系统模式对话框DS_SHADOW带阴影的对话框DS_CENTER使对话框位置居中DS_SETFOREGROUND使对话框置于前台DS_LEFT使对话框位置居左通常在对话框上需要放置各种各样的控件,来实现用户和应用程序之间的交互。在对话框的资源描述文件中应该有定义控件的语句,这些语句放置在BEGIN和END之间。对话框中常用的控件及其说明见表8.1.2。表8.1.2对话框中常用的控件对话框样式名说 明对话框样式名说 明CHECKBOX复选框控件DEFPUSHBUTTON默认按钮控件RADIOBUTTON单选按钮控件EDITTEXT编辑框控件COMBOBOX组合框控件GROUPBOX成组框控件CTEXTOUND文本居中的静态控件ICON图标LISTBOX列表框控件LTEXT文本左对齐的静态控件PUSHBUTTON按钮控件SCROLLBAR滚动条控件 建立一个工程名为exp8的单文档界面应用程序,以记事本方式打开exp8文件夹里面的资源描述文件exp8.rc。其中,关于对话框定义脚本的代码如下所示,这是用户使用鼠标点击窗口中菜单栏的“帮助”/“关于”后弹出的“关于对话框”的定义。IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 235, 55CAPTION 关于 exp8STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENUFONT 9, 宋体BEGINICON IDR_MAINFRAME, IDC_STATIC, 11, 17, 20, 20LTEXT exp8 1.0 版,IDC_STATIC,40,10,119,8, SS_NOPREFIXLTEXT 版权所有 (C) 2014,IDC_STATIC,40,25,119,8DEFPUSHBUTTON 确定,IDOK,178,7,50,14,WS_GROUPEND如果需要创建一个自定义的对话框,可以通过在资源描述文件中编写对话框模板脚本的方式来设计对话框的外观和位置。例如,在exp8.rc文件中,编写下列代码建立自定义对话框IDD_DIALOG1,这个对话框包含了“确认”按钮和“取消”按钮。IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 167, 53STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENUCAPTION 添加的对话框FONT 9, System BEGIN DEFPUSHBUTTON OK, IDOK, 40, 28, 50, 14 PUSHBUTTON Cancel, IDCANCEL, 104, 28, 50, 14END 8.1.2 对话框编辑器设计对话框在VC+ 6.0开发环境中,可以使用系统提供的可视化编辑工具来创建对话框模板资源,这种方法相对于在资源描述文件中定义对话框脚本来说更简单一些。打开可视化对话框编辑工具的方法如下。在工程窗口中选择第二个选项卡“Resource View”,右键单击Dialog文件夹,在弹出式下拉菜单中选择Insert Dialog选项,出现如图8.1.1所示的对话框编辑器。在这个对话框编辑器中,有一个对话框模板和一个控件箱,这个对话框模板的资源标识符为IDD_DIALOG1。图8.1.1 开发环境提供的对话框编辑器对话框IDD_DIALOG1的右上角预置了两个常用的按钮控件“OK”和“Cancel”,系统已经为这两个按钮设计了与功能相应的代码。如果不+需要这些预置的按钮控件,可以用鼠标选中这两个按钮,再按下键盘上的Delete键来删除它们。根据程序需要,可以使用鼠标选中控件箱中的控件,添加到这个默认的对话框模板上,调整相应的控件位置后再点击“文件”菜单的“保存”菜单选项,于是创建对话框模板资源的工作就结束了。8.2对话框类8.2.1 对话框类的定义要让用户使用对话框,程序员需要先定义对话框类。MFC提供了对话框类CDialog,程序员自定义的对话框类要从CDialog类派生而来。创建自定义的对话框类要通过CDialog类的构造函数,CDialog类有两个构造函数,它们分别是: CDialog(LPCTSTR lpszTemplate, CWnd *pParentWnd=NULL);和 CDialog(UINT nIDTemplate, CWnd * pParentWnd=NULL); 函数中的第一个参数是对话框模板资源名称或资源标识符ID,第二个参数是对话框的父窗口指针,通常情况下,可以使用其默认值NULL。在实际编程过程中,经常使用VC+6.0提供的编程工具来派生自定义的对话框类。派生自定义的对话框类的方法如下。打开图8.1.1所示的对话框资源编辑器,用鼠标双击对话框模板, 在图8.2.1所示的Add a Class对话框中单击“Ok”按钮,在图8.2.2所示的New Class对话框中填写自定义的对话框类名(例如:COurDialog),单击“OK”按钮,即可生成自定义类的代码。系统自动生成的自定义对话框类代码的主要部分为:/COurDialog类的声明class COurDialog : public CDialogpublic:COurDialog(CWnd* pParent = NULL); / standard constructorenum IDD = IDD_DIALOG1 ;/ COurDialog类的实现文件中构造函数定义COurDialog:COurDialog(CWnd* pParent /*=NULL*/): CDialog(COurDialog:IDD, pParent)图8.2.1 Add a Class对话框图8.2.2 New Class对话框8.2.2 对话框的类型1. 模态对话框创建自定义对话框类COurDialog后,就可以在需要使用对话框的地方使用它了。如果使用CDialog类的成员函数DoModal( )来创建对话框,则该对话框就是一个模态对话框,模态对话框需要用户在对话框上操作。DoModal( )函数的原型是: virtual int DoModal( );DoModal( )函数首先载入对话框模板资源(例如,IDD_DIALOG1),接着调用初始化对话框函数OnInitDialog()函数,并且在这个函数中调用更新数据函数UpdateData()初始化对话框上放置的控件。然后,该函数将启动一个消息循环,以响应用户的输入。该消息循环截获了几乎所有的用户输入消息,从而使Windows应用程序的主消息循环接收不到用户消息,所以用户只能与对话框进行操作交互,这就是模态对话框的特点。当用户单击对话框的“OK”按钮或“Cancel”按钮时,在函数DoModal()结束之前,将对话框对象销毁。创建并运行模态对话框的代码如下:COurDialog dialog; /定义自定义对话框类的对象int result=dialog.DoModal(); /显示并运行模态对话框在系统提供的对话框模板上,系统预先设置好了OK按钮和Cancel按钮,并为这两个按钮编写了相应的代码。当用户按下OK按钮时,会调用消息响应函数CDialog:OnOK()。OnOK()函数首先调用UpdateData()函数读取控件上的数据(例如,用户在对话框上的编辑框中输入的数据),并把数据传递给对话框类中与该控件对应的成员变量。然后,调用CDialog:EndDialog()函数关闭对话框,并以OK按钮的标识符IDOK作为DoModal()函数的返回值。当用户按下Cancel按钮时,会调用消息响应函数CDialog:OnCancel(),而它只调用函数CDialog:EndDialog()来关闭对话框,并以Cancel按钮的标识符IDCANCEL作为DoModal()函数的返回值。如果编程人员需要在OK按钮和Cancel按钮的消息响应函数中做一些其他事情,可以重写OnOK()和OnCancel()这两个消息响应函数。但是,在重写的时候函数中一定要调用CDialog类的成员函数CDialog:OnOK()和CDialog:OnCancel(),以便系统做相应的默认处理。例8.1 创建一个单文档界面应用程序,在运行时如果在窗口用户区单击鼠标右键,会出现如图8.2.3所示外观的模态对话框。在模态对话框中点击“OK”按钮后弹出消息框。(1)用MFC AppWizard创建工程名为exp8_1的单文档界面应用程序。(2)用VC+6.0提供的可视化设计工具创建一个对话框模板资源,得到系统默认的对话框。右键单击Dialog文件夹,在弹出式下拉菜单中选择Insert Dialog选项,见图8.1.1。(3)使用控件箱在对话框模板上添加需要的控件,例如静态文本控件和编辑框控件,并调整按钮的位置,见图8.2.3。右键点击第一个静态文本控件,在下拉菜单中选“属性”,在随后出现的文本属性对话框中输入标题,例如年龄,见图8.2.4。右键点击第二个静态文本控件,选“属性”后修改其标题为专业。 图8.2.3 对话框的外观 图8.2.4 属性对话框(4)用鼠标左键双击对话框模板,打开Adding a Class对话框,询问是否要创建一个新的对话框类,选择对话框中默认的选项并且单击OK按钮,在随后出现的图8.2.2 所示的New Class对话框中填写类的名称COurDialog,其余使用默认选项,然后单击OK按钮。在工程管理窗口的Class View选项卡中可以看到新建的COurDialog类, 在Resource View选项卡上可以看到自定义的对话框模板资源标识符IDD_Dialog1。(5)在Resource View选项卡中,选择“文件”/“保存”后,点击File View选项卡,发现在资源头文件Resource.h中自动添加了对话框和编辑框控件的资源标识符的定义。如果不保存,则需要程序员在资源头文件Resource.h中手动写出对话框和编辑框控件的资源标识符的定义。(6)如果想在对话框中点击“OK”按钮后弹出消息框,可以为“OK”按钮添加消息响应函数。右键单击对话框模板上的“OK”按钮,弹出的下拉菜单中选择建立类向导,在随后弹出的类向导对话框中双击IDOK的按钮单击消息BN_CLICKED,在弹出的Add Member Function对话框中出现默认的OnOK函数,单击“OK”按钮,在类向导对话框中单击Edit Code按钮,见图8.2.5。图8.2.5 添加单击OK按钮的消息响应函数(7)在消息响应函数OnOK()中添加代码MessageBox(“你单击了OK按钮”)。void COurDialog:OnOK() MessageBox(你单击了OK按钮);CDialog:OnOK();(8)在视图类的源文件exp8_1View.cpp中添加包含自定义对话框类的头文件。 #include OurDialog.h (9)通过类向导在视图类中添加鼠标右键按下的消息响应函数OnRButtonDown(),在函数中添加定义对话框对象、显示并运行模态对话框的语句。void CExp8_1View:OnRButtonDown(UINT nFlags, CPoint point) COurDialog dialog; /定义模态对话框对象dialog.DoModal(); /显示并运行模态对话框CView:OnLButtonDown(nFlags, point);例8.1程序运行结果见图8.2.6。当用户在应用程序的窗口中单击鼠标右键时,在窗口中弹出一个自定义的对话框。如果再单击对话框中的OK按钮,则弹出一个消息框显示字符串你单击了OK按钮。用户如果在这个自定义的对话框外按下鼠标左键,对话框将闪烁并且扬声器会“叮”一声,提示用户必须在对话框内操作鼠标。这种必须在对话框内部操作鼠标的对话框就是模态对话框。反之,不限制用户在哪里操作鼠标的对话框就是非模态对话框,并且在非模态对话框外操作鼠标不会出现闪烁,也不会发出“叮”的声音。图8.2.6 对话框单击OK按钮出现的消息框2. 非模态对话框 非模态对话框并不要求用户必须在对话框中操作。非模态对话框的创建与模态对话框的创建方法不一样,创建并显示非模态对话框的代码如下。CNoModalDialog *dialog= new CNoModalDialog();dialog-Create(UINT nIDTemplate, CWnd *pParentWnd=NULL);dialog-ShowWindow(SW_SHOW);其中,假设CNoModalDialog是程序员定义的非模态对话框类。对话框类的成员函数Create()表示创建一个非模态对话框。这个函数的第一个参数是非模态对话框的资源ID,第二个参数是父窗口指针。对话框类的成员函数ShowWindow()表示在窗口中显示非模态对话框。例8.2 创建一个单文档界面应用程序,在运行时如果在窗口用户区单击鼠标右键,会出现一个如图8.2.3所示外观的非模态对话框。可以在非模态对话框的外面单击鼠标左键。(1)用MFC AppWizard创建工程名为exp8_2的单文档界面应用程序。(2)后面的步骤与例8_1的步骤(2)、(3)、(5)类似。(3)用鼠标左键双击对话框,打开Adding a Class对话框,选择对话框默认的选项并且单击OK按钮,在随后出现的New Class对话框中填入类的名称CNoModalDialog,其余使用默认选项,单击“确定”按钮。(4)在视图类的实现文件exp8_2.cpp中添加非模态对话框类的头文件的包含。#include NoModalDialog.h(5)通过类向导在视图类中添加鼠标右键按下的消息响应函数OnRButtonDown(),在该函数中添加创建一个非模态对话框的代码。void CExp8_2View:OnRButtonDown(UINT nFlags, CPoint point) CNoModalDialog *dialog= new CNoModalDialog(); /定义非模态对话框指针对象dialog-Create(IDD_DIALOG1, this); /创建非模态对话框 dialog-ShowWindow(SW_SHOW); /非模态对话框显示在窗口中CView:OnRButtonDown(nFlags, point);当用户在应用程序的窗口中单击鼠标右键时,在窗口中弹出一个自定义的非模态对话框,见图8.2.7。与例8.1程序不同的是,用户如果在这个自定义的非模态对话框外按下鼠标左键,对话框不会闪烁也不会“叮”一声。在窗口用户区再次按下鼠标右键时,弹出第二个非模态对话框。图8.2.7 例8.2程序运行后在对话框外单击左键8.3对话框的数据交换在应用程序中使用对话框,实际上就是要通过对话框上的控件(例如编辑框、下拉列表框、按钮等)向应用程序中的变量传递数据,或者是把应用程序中变量的数据传送到控件上进行显示,从而使得用户能够与控件交互数据信息,这就是数据交换(Data Exchange,DDX)。数据交换是在对话框类的成员函数DoDataExchange()中进行的。8.3.1数据交换函数DDX 为了保存控件上的数据,在声明对话框类时,需要声明一些成员变量。同时,还要把这些成员变量与对应的控件联系起来,这样才能实现控件与成员变量进行数据交换的目的。MFC已经定义了大量的以DDX_为前缀的函数,这些函数既可以实现成员变量与对话框控件关联,又可以实现数据交换。例如,与编辑框控件进行数据交换的DDX_Text( )函数、与单选按钮控件进行数据交换的DDX_Radio( )函数、与复选框按钮控件进行数据交换的DDX_Check( )函数等等。这些数据交换函数的原型非常类似,例如,DDX_Text( )函数的原型为:void DDX_Text(CDataExchange *pDX, /数据交换类指针对象 int nIDC, /控件资源标识符IDCString& value); /与控件相关联的变量在所有这些以DDX_为前缀的函数的参数中都有一个CDataExchange类的对象的指针pDX,MFC在CDataExchange类中封装了实现成员变量与控件关联和进行数据交换的操作。部分控件与对应的DDX函数见表8.3.1。不同的控件有不同的DDX函数,所有的控件函数都有一个如下形式的DDX函数。void DDX_Control (CDataExchange *pDX, int nIDC, CWnd& rControl); 表8.3.1 部分控件及其对应的DDX函数控件对应的DDX函数名控件对应的DDX函数名编辑框DDX_Text下拉列表框DDX_CBString按钮DDX_Control微调器DDX_LBString单选按钮DDX_Radio水平、垂直滚动条DDX_Scroll 复选按钮DDX_Check 进度条DDX_Control 8.3.2进行数据交换函数DoDataExchange 对话框CDialog类从窗口CWnd类继承了一个函数DoDataExchange()来统一管理对话框的数据交换,这个函数的原型为:virtual void DoDataExchange(CDataExchange* pDX);为了实现控件与对话框类的成员变量之间进行数据交换,必须在DoDataExchange函数中调用DDX函数。例如,下列代码表示在DoDataExchange函数中调用了编辑框控件的数据交换函数DDX_Text()。void CDTestDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_szFileName);8.3.3更新数据函数DoDataExchange 函数DoDataExchange()是在函数UpdateData()中被调用的,UpdateData()函数的原型为:BOOL UpdateData( BOOL bSaveAndValidate = TRUE );当其参数bSaveAndValidate为TRUE时,控件将向对应成员变量写入数据;而当参数bSaveAndValidate为FALSE时,控件将从对应成员变量读取数据。 8.3.4为对话框控件添加成员变量为了对控件上的数据进行管理,对话框类必须定义一些与控件相关联的成员变量,定义成员变量与控件相关联的工作最好使用VC+6.0开发环境的设计工具Class Wizard。如果要给对话框上的某个控件提供一个与其相关联的成员变量,则用鼠标右键单击该控件,在出现的下拉弹出式菜单中选择建立类向导选项,打开Class Wizard对话框,选择五个选项卡中的第二个选项卡Member Variables,见图8.3.1。这个选项卡的Control IDs窗口中列出了所有可以声明变量的控件对象ID。在Member Variables选项卡中,找到某个控件对象ID,双击这个控件对象ID后打开Add Member Variable对话框,见图8.3.1。在Add Member Variable对话框中,程序员可以定义与控件对象ID相关联的成员变量的名称、类型等,单击OK按钮后Class Wizard会在对话框类中自动添加该成员变量的声明,并且在对话框类成员函数DoDataExchange()中自动添加相应的数据交换函数DDX,从而把控件与成员变量关联起来,见图8.3.2。 图8.3.1 成员变量选项卡中添加控件对应的变量图8.3.2 自动添加的DDX函数例8.3创建一个程序,当在窗口上单击鼠标右键时,会出现一个对话框。在输入编辑框输入文字。当用鼠标单击“输入”按钮可以存入成员变量,当用鼠标单击“显示”按钮会在显示编辑框中出现填写的姓名,单击OK按钮后对话框关闭,两个文本框中出现的姓名显示在应用程序的窗口上。(1)用MFC AppWizard创建一个工程名为exp8_3的单文档界面应用程序。(2)按照图8.3.3的要求定义对话框模板资源。右键点击资源视图中的Dialog文件夹,选择Insert Dialog,在对话框模板中添加两个文本编辑框、两个静态文本控件和两个按钮控件。右键点击静态文本控件,在图8.3.4所示的属性框中修改标题为“输入”。使用相同的方法设置两个按钮的标题分别为“输入”和“显示”。双击对话框模板,利用New Class工具派生CDialog类的自定义对话框类CourDialog。 图8.3.3 例8.3应用程序的对话框 图8.3.4 在属性对话框中修改控件标题属性(3)用MFC ClassWizard给两个编辑框控件定义相关联的成员变量和两个按钮的消息响应函数。右键第一个编辑框控件,选择建立类向导,选择Member Variables选项卡,双击IDC_EDIT1后填写成员变量名为m_Edit1,类型为CString。第二个编辑框控件对应的变量名为m_Edit2。双击“输入”按钮,弹出的对话框中选择消息响应函数为OnInput。单击“显示”按钮的消息响应函数为OnOutput。(4)在对话框类中实现两个按钮的消息响应函数。void COurDialog:OnInput() UpdateData(TRUE); /输入编辑框控件上的数据写入到成员变量m_Edit1void COurDialog:OnOutput() m_Edit2=m_Edit1; /第一个编辑框的变量值赋值给第二个编辑框的变量 UpdateData(FALSE); /成员变量m_Edit2的数据传送到显示编辑框控件中(5)在视图类的实现文件中添加自定义的对话框的头文件OurDialog.h。#include OurDialog.h(6)在视图类中添加两个成员变量m_outEdit1和m_outEdit2,类型都是CString。(7)通过类向导为视图类添加鼠标右键按下的消息响应函数OnRButtonDown。void CExp8_3View:OnRButtonDown(UINT nFlags, CPoint point) COurDialog dialog; /声明自定义对话框类的对象int result=dialog.DoModal(); /显示并运行对话框if(result=IDOK) /如果单击了对话框的OK按钮m_outEdit1=dialog.m_Edit1; /对话框编辑框变量值传递给视图类变量m_outEdit2=dialog.m_Edit2;Invalidate(); /刷新窗口,调用OnDraw函数CView:OnRButtonDown(nFlags, point);(8)在视图类的OnDraw()函数中编写代码。void CExp8_3View:OnDraw(CDC* pDC)CExp8_3Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(10, 10, m_outEdit1); /显示第一个编辑框中填写的值pDC-TextOut(100, 10, m_outEdit2);由于自定义的对话框对象dialog定义在OnRButtonDown函数中,所以编辑框对应的变量m_Edit1不能使用在OnDraw函数中的TextOut中。通过定义全局变量m_outEdit1,将对话框编辑框中填写的文字显示在窗口中。8.3.4数据检验为了对用户输入数据的合法性进行必要的检验,MFC提供了多个名称带有DDV_前缀的函数来与DDX函数配合使用,其目的就是为了对用户的输入数据进行检验并作一定的限制。如函数:void DDV_MaxChars (CDataExchange *pDX, CString const& value, int nChars);其中,第三个参数nChars就是用来限制第二个参数value的字符个数的。第二个参数value是用户在编辑框中输入的字符串变量。与数据交换一样,数据检验也是在DoDataExchange()函数中完成的。例8.3的程序中,如果将COurDialog:DoDataExchange函数中的最后一行DV_MaxChars前面的双斜杠注释去掉,运行程序后在对话框的输入编辑框中输入6个及其以上字符时,弹出如图8.3.5 所示的警告框。这是因为DDV_MaxChars(pDX, m_Edit1, 5)函数的最后一个参数是5,限制了编辑框中输入字符的个数不能超过5。图8.3.5 输入字符数超过限制时弹出警告框8.4基于对话框的应用程序由于模态对话框有自己的消息循环和对应的窗口函数,所以对话框不仅可以作为应用程序的一个资源,而且还能以对话框作为主界面来设计应用程序,这种应用程序称为基于对话框的应用程序。这种基于对话框的应用程序适合比较简单的应用,例如,QQ登录界面、杀毒软件等。8.4.1对话框应用程序框架的设计使用MFC AppWizard设计基于对话框的应用程序非常简单:在MFC AppWizard的第一个步骤中,选择创建Dialog Based应用程序的选项即可。选择创建Dialog Based后,如果单击Finish按钮,则应用程序向导将会在Visual C+6.0的开发环境中提供一个预置了两个常用的OK和CANCEL按钮控件和一个静态文本控件的对话框。程序员如果不需要这两个按钮,可以把它们删除。基于对话框应用程序运行后,8.4.2对话框应用程序的消息响应函数设计基于对话框应用程序的主要工作,是为对话框上的各个控件的消息响应函数填写代码。开发环境为程序员提供了一个很方便的添加消息响应函数的工具Class Wizard。选中要添加消息响应函数的控件,用鼠标右键点击该控件,在弹出的下拉菜单中选择Class Wizard选项即可打开Class Wizard对话框(见图8.4.1)。在该对话框中选择第一个选项卡Message Mags,MFC AppWizard正是通过这个选项卡建立控件与消息响应函数之间的消息映射的。图8.4.1 Class Wizard的消息映射选项卡通过Message Maps选项卡可以用来声明消息映射和消息响应函数原型。在图8.4.1中,程序员使用Project下列选择框来选择当前的工程;使用Class Name下拉选择框来选择要操纵的类;使用Object IDs滚动窗口选择当前类中某个产生消息的对象,在Message窗口中显示该对象可以使用的消息。如果选中了某个消息,双击该消息或者单击Add Function按钮,就会打开一个Add Member Functions对话框,并在对话框窗口中提供一个默认的消息响应函数名。如果程序员不喜欢这个消息响应函数名,可以修改函数名,然后单击OK按钮,则Class Wizard会自动在程序中添加消息映射和消息响应函数的声明、消息函数定义等相关的代码。例8.4 设计一个界面如图8.4.2所示的对话框应用程序,当用户鼠标单击Read按钮后,在左边的编辑框中显示该编辑框对应的变量m_Edit1的值;而当用户单击Write按钮后,左边编辑框中的数据会出现在下面的编辑框中。 图8.4.2 例8.4对话框应用程序的界面 图8.4.3 添加例8.4的两个成员变量(1)用MFC AppWizard创建一个工程名为exp8_4的单文档界面应用程序框架,删除对话框预置的OK和CANCEL按钮,按照图8.4.2的要求通过控件箱添加两个编辑框控件和两个按钮控件。(2)如图8.4.3所示,使用Class Wizard设置两个与编辑框控件相关联的成员变量。如图8.4.4所示,使用类向导添加两个按钮单击消息对应的消息响应函数。图8.4.4 添加例8.4的两个按钮单击消息响应函数(3)在两个按钮鼠标单击的消息响应函数中写入如下代码。void CExp8_4Dlg:OnRead() UpdateData(FALSE); /把变量的值读到编辑框void CExp8_4Dlg:OnWrite() m_Edit2=m_Edit1;UpdateData (FALSE); (4)在对话框类的初始化函数OnInitDialog中初始化变量m_Edit的值m_Edit1=abc;程序运行后按下Read按钮的结果见图8.4.5,按下Write按钮后结果见图8.4.6。 图8.4.5 按下Read按钮的结果 图8.4.6 按下Write按钮的结果8.4.3属性页属性页是一种很特殊的对话框,在属性页的上面有多张选项卡式的页面,用户可以用鼠标选择不同的选项卡,并利用选项卡上的控件与应用程序进行交互。例如,Visual C+6.0提供的Class Wizard对话框就是属性页的一个应用。属性页中的每个属性页面(选项卡)都是一个对话框,只不过是使用了一个特殊的对话框(属性页)把所有的属性页面集中地放在一起进行管理。每一个属性页面(选项卡)都是CPropertyPage类的派生类的对象,而属性页是CPropertySheet类的派生类的对象。设计属性页的方法非常简单。首先,就像设计一般对话框模板资源那样,设计每一个属性页面的模板资源,并在资源中把对话框的Style(样式)设置为Child,Border(边框)设置为Thin,同时关闭System menu选项,从而使其具有选项卡的外观。然后,以MFC的CPropertyPage类为基类派生一个对话框类。于是,这个派生自CPropertyPage类的对话框类的对象就是一个属性页面了。按照上述方法设计了全部的属性页面类之后,就可以设计装载和管理属性页面的属性页类。首先,设计作为属性页的对话框模板资源;然后声明属性页类,这个类的基类应该是MFC的CPropertySheet类。于是,这个派生自CPropertySheet类的对话框类的对象就是一个装载和管理属性页面的属性页对象。在应用程序中创建属性页时,首先应该创建各个属性页面对象(使其成为属性页类的成员变量);然后在属性页的构造函数中,用CPropertySheet类的成员函数AddPage向属性页添加属性页面。该函数的原型为:void AddPage(CPropertyPage* pPage);其参数为要添加到属性页上的属性页面的指针。例8.5 设计一个对话框应用程序,按下“下一步”按钮以后出现的对话框如图8.4.7所示的属性页。 图8.4.7 例8.5程序按“下一步”按钮出现的属性页(1)用MFC AppWizard创建一个名为exp8_5的基于对话框的应用程序框架。(2)在资源视图,右键对话框文件夹,选择Insert/Dialog/IDD_PROPERTY_SMALL,单击新建按钮。修改对话框标题为“Habit Options”。如图8.4.7所示的要求设计属性页面。(3)双击对话框模板,单击OK后打开New Class对话框,填写类名为CHabitOptions,基类为CPropertyPage,见图8.4.8所示。第二个属性页面的类名为CGradeOptions, 基类为CPropertyPage。图8.4.8 创建属性页面类(4)选择菜单栏“Insert / New Class”,在New Class对话框中填写类型为MFC Class,类名为CSheetDlg,基类为CPropertSheet,见图8.4.9。图8.4.9 创建属性页类(5)在CSheetDlg类的头文件中包含属性页面头文件。在类定义的前面包含两个属性页面的头文件。#include HabitOptions.h#include GradeOptions.hclass CSheetDlg : public CPropertySheet(6)在CSheetDlg类中以成员变量的形式声明两个属性页面类的对象。声明以后在SheetDlg.h文件中类的定义中包含属性页面类对象的定义。public:CGradeOptions m_gradeoptions;CHabitOptions m_habitoptions;(7)在CSheetDlg的第2个构造函数中添加两个AddPage函数。CSheetDlg:CSheetDlg(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage):CPropertySheet(pszCaption, pParentWnd, iSelectPage) AddPage(&m_habitoptions); AddPage(&m_gradeoptions);(8)在应用程序对话框模板中添加一个“下一步”按钮,双击该按钮添加消息响应函数OnNext。void CExp8_5Dlg:OnNext() CSheetDlg dlg(属性页); dlg.DoModal();(9)在在应用程序对话框类的实现文件中包含属性页类的头文件。#include SheetDlg.h程序运行结果及第一个选项卡见图8.4.7,用户使用鼠标点击第二个选项卡见图8.4.10。定义属性页对象时,对象名后面的小括号中的字符串参数是属性页标题文本。而定义普通对话框对象时,则不需要带上参数。 图8.4.10 例8.5属性页中的第二个选项卡习题7一、判断题(对)1. 对话框是Windows应用程序与用户交互的重要手段,分为模态对话框和非模态对话框。(对)2. 对话框模板资源可以使用VC+的资源编辑器来创建和编辑。(错)3. 调用CDialog的成员函数DoModal可以创建并打开模态对话框。调用CDialog的成员函数DoNoModal可以创建并打开非模态对话框。(对)4 对话框使用数据交换(DDX)机制实现控件与变量之间的数据交换,使用数据检验(DDV)机制检验通过控件录入的数据是否超过限制。(错)5. 属性页面和属性页实际上是同一概念,都是对话框。二、选择题(A)1. 创建模态对话框时,对话框类对象调用 函数来显示并运行对话框。A. DoModal( ) B. DoModel( ) C. Domodal( ) D. Model( ) 2. 创建非模态对话框时,对话框类对象调用 函数来创建非模态对话框。(C)A. DoModal( ) B DoNoModal( ) C. Create( ) D. NoModal( )(B)3. 属性页是 类派生类的对象,它包含若干属性页面。A. PropertySheet B. CpropertySheet C. PropertyPage D. CpropertyPage(D)4. 属性页面是 类派生类的对象,它是一个对话框。A. PropertySheet B. CpropertySheet C. PropertyPage D. CpropertyPage(C)5. MFC中对话框类的类名是 。A. Dialog B. Cdialog C. CDialog D. dialog三、填空题1. 使用MFC ClassWizard为对话框添加成员变量并与相应的控件进行关联。2. 使用MFC ClassWizard为对话框添加消息响应函数并与相应的控件消息进行关联。3. 在对话框外面单击鼠标左键,对话框不会闪烁也不会有“叮”的一声,这种对话框是非模态对话框对话框。4. MFC中属性页类的名称是CPropertySheet。5. MFC中属性页面类的名称是CPropertyPage。四、编程题1. 编写一个对话框应用程序,程序运行以后出现一个对话框,在对话框界面上有三个文本编辑框,前2个文本编辑框中输入数值,第3个文本编辑框中显示前2个数的计算结果,对话框界面上有“+”按钮和“-”按钮,可以进行加法运算和减法运算。

温馨提示

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

评论

0/150

提交评论