基于对话框的应用程序-6868le自定义导航.ppt
《基于对话框的应用程序-6868le自定义导航.ppt》由会员分享,可在线阅读,更多相关《基于对话框的应用程序-6868le自定义导航.ppt(191页珍藏版)》请在三一办公上搜索。
1、第9章对话框和控件,9.1 对话框类CDialog 9.2 基于对话框的应用程序 9.3 模态对话框与非模态对话框 9.4 标准控件 9.5 公用对话框 习题,9.1 对话框类CDialog 在MFC中,对话框的功能都封装在CDialog类中,CDialog类是用来在屏幕上显示和管理对话框的基类。无论是基于对话框的应用程序,还是作为程序资源的模态对话框和非模态对话框,为了显示对话框和定义对话框的行为和功能,都需要从CDialog类派生一个对话框类。一个对话框对象是一个对话框模板资源和一个CDialog派生类的结合。要创建一个对话框,首先要创建一个对话框模板资源,可以使用对话框编辑器创建对话框模
2、板资源并存储在资源文件中,然后利用ClassWizard创建一个基于对话框模板资源的从CDialog派生的对话框类。对话框模板资源指定了对话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性,对话框类规定了对话框和对话框中每个控件的行为。通过对话框模板资源才能创建对话框类和对象。,CDialog类是CWnd类的派生类,继承了CWnd类的成员。因此,对话框具有窗口的一切功能。CDialog类的派生关系如图9-1所示。,图9-1 CDialog类的派生关系,CDialog类提供了管理对话框的成员函数,同时,CWnd类也提供了管理对话框和控件的成员函数和管理一般窗口的函数,可以在对话框
3、类的消息处理函数中调用这些成员函数。CDialog类中有关对话框处理的常用函数如下:(1)CDialog:通过派生类构造函数调用,根据对话框模板资源定义一个对话框对象。函数原型为:CDialog(LPCTSTR lpszTemplateName,CWnd*pParentWnd=NULL);CDialog(UINT nIDTemplate,CWnd*pParentWnd=NULL);CDialog();其中,参数“lpszTemplateName”为对话框模板资源名,“nIDTemplate”为对话框模板资源ID。,(2)Create:根据对话框模板资源创建非模态对话框窗口。如果对话框模板资源不
4、具有Visible属性,则需要调用CWnd:ShowWindow()函数才能显示对话框。函数原型为:BOOL Create(LPCTSTR lpszTemplateName,CWnd*pParentWnd=NULL);BOOL Create(UINT nIDTemplate,CWnd*pParentWnd=NULL);其中,参数“lpszTemplateName”为对话框模板资源名,“nIDTemplate”为对话框模板资源ID。(3)DoModal:激活模态对话框,并显示对话框窗口。当对话框关闭时函数才返回对话框结果。函数原型为:virtual int DoModal();,(4)EndDi
5、alog:关闭模态对话框。函数原型为:void EndDialog(int nResult);其中,参数“nResult”为DoModal关闭对话框时的返回值。(5)OnInitDialog:WM_INITDIALOG消息的处理函数。在调用DoModal或Create函数时系统发送WM_INITDIALOG消息。当创建对话框后、显示之前调用该函数进行初始化工作。函数原型为:virtual BOOL OnInitDialog();,(6)OnOK:单击对话框的OK按钮(ID为IDOK)时调用。在派生对话框类中重载该函数可执行OK按钮命令。如果对话框包含自动的数据检验和交换,则该函数缺省实现对应用
6、程序的某些变量进行数据检验和交换。在非模态对话框中实现OK按钮,必须重载OnOK函数,并在其中调用CWnd:DestroyWindow,但不能调用基类的OnOK函数,否则将会调用EndDialog,不能销毁对话框但使其不可见。函数原型为:virtual void OnOK();,(7)OnCancel:单击Cancel按钮或按ESC键时调用该函数。在派生对话框类中重载该函数可执行Cancel按钮命令。该函数缺省实现调用EndDialog终止模态对话框,并使DoModal返回IDCANCEL。在非模态对话框中实现Cancel按钮,必须重载OnCancel函数,并在其中调用CWnd:Destroy
7、Window,但不能调用基类的OnCancel函数,否则将会调用EndDialog,不能销毁对话框但使其不可见。函数原型为:virtual void OnCancel();另外,CDialog类还提供了对缺省按钮进行操作和在控件间移动输入焦点的函数。函数GetDefID返回对话框中缺省按钮的控件ID,通常为OK按钮。函数GotoDlgCtrl将输入焦点移到指定的控件上。函数NextDlgCtrl将输入焦点移动到下一个控件上。函数PrevDlgCtrl将输入焦点移动到前一个控件上。函数SetDefID将缺省按钮设置为指定ID的按钮。,CWnd类中有关窗口处理和对话框处理的常用函数如下:(1)De
8、stroyWindow:关闭并销毁由CDialog:Create创建的对话框窗口。函数原型为:virtual BOOL DestroyWindow();(2)DoDataExchange:被UpdateData函数调用以实现对话框数据交换,不能直接调用。(3)GetWindowText:获取对话框标题或控件内的文本。函数原型为:int GetWindowText(LPTSTR lpszStringBuf,int nMaxCount)const;void GetWindowText(CString其中,参数“lpszStringBuf”为指向接收对话框标题字符串的指针,“nMaxCount”指定
9、接收字符串的长度,“rString”为保存对话框标题的CString对象。,(4)GetDlgItemText:获取对话框控件的标题或文本。函数原型为:int GetDlgItemText(int nID,LPTSTR lpStr,int nMaxCount)const;int GetDlgItemText(int nID,CString其中,参数“nID”为指定控件的ID值,指向控件的指针由参数“phWnd”或函数返回。,(6)SetWindowText:用指定文本设置对话框的标题,对于控件则设置控件内文本。函数原型为:void SetWindowText(LPCTSTR lpszStrin
10、g);其中,参数“lpszString”为一个指向CString对象或以“0”结尾的字符串的指针,此字符串将作为对话框标题或控件内的文本。(7)SetDlgItemText:设置对话框控件的标题或文本内容。函数原型为:void SetDlgItemText(int nID,LPCTSTR lpszString);其中,参数“nID”为指定控件的ID值,“lpszString”为设置的字符串。,(8)MoveWindow:改变对话框的大小和位置。函数原型为:void MoveWindow(int x,int y,int nWidth,int nHeight,BOOL bRepaint=TRUE)
11、;void MoveWindow(LPCRECT lpRect,BOOL bRepaint=TRUE);其中,参数“x”和“y”指定对话框左上角坐标,“nWidth”和“nHeight”指定对话框的宽度和高度,“lpRect”指定对话框新的位置和大小。(9)EnableWindow:使对话框为禁用或可用状态。函数原型为:BOOL EnableWindow(BOOL bEnable=TRUE);若参数为“FALSE”,则对话框将被禁止使用;若参数为“TRUE”,则对话框允许使用。,(10)UpdateData:通过调用DoDataExchange函数设置或获取对话框控件的数据。函数原型为:BOO
12、L UpdateData(BOOL bSaveAndValidate=TRUE);其中,参数“bSaveAndValidate”指明是用变量设置对话框控件(FALSE)还是获取对话框数据(TRUE)的标志。在CDialog:OnInitDialog函数的缺省实现中,以FALSE为参数调用UpdateData初始化对话框;在CDialog:OnOK函数的缺省实现中,以TRUE为参数调用UpdateData获取对话框数据。如果点击Cancel按钮,并不调用此函数,只关闭对话框,并不获取数据。(11)ShowWindow:显示或隐藏对话框窗口。函数原型为:BOOL ShowWindow(int nC
13、mdShow);其中,参数“nCmdShow”指定窗口显示的方式。,(12)SetDlgItemInt:将整数转换为字符串并设置为控件的文本。函数原型为:void SetDlgItemInt(int nID,UINT nValue,BOOL bSigned=TRUE);其中,参数“nID”为要设置文本的控件的ID值,“nValue”为要转换为字符串的整数。(13)GetDlgItemInt:将指定控件的文本转换成整数并返回。转换时,跳过文本开始的空格,当到达文本的末尾或遇到非数字字符时停止转换。函数原型为:UINT GetDlgItemInt(int nID,BOOL*lpTrans=NULL
14、,BOOL bSigned=TRUE)const;,9.2 基于对话框的应用程序 基于对话框的应用程序运行时就是一个对话框窗口。相对于其它结构的Windows程序要简单的多。可以利用AppWizard应用程序向导和ClassWizard类向导轻松地创建一个对话框应用程序。,创建一个基于对话框的应用程序可以分为以下几步:(1)利用AppWizard创建一个基于对话框的应用程序框架。(2)利用对话框编辑器以可视化的方法编辑对话框,放置各种控件并设置控件的属性。(3)使用C1assWizard在对话框类中添加数据成员、交换函数和有效性验证函数,为控件添加关联的成员变量。(4)使用ClassWizar
15、d为对话框的按钮和其它控件产生的事件添加消息处理函数。(5)对特殊控件进行初始化,为消息处理函数添加代码。,9.2.1 简单应用程序实例 下面通过一个简单的实例来说明创建对话框应用程序的方法和过程。【例9.1】编写一个如图9-2所示的对话框应用程序,完成简单的算术运算。,程序的创建过程如下:(1)利用AppWizard创建应用程序框架。执行“File”“New”菜单命令,打开“New”对话框(见图8-1)。选定“Projects”标签,选择项目类型“MFC AppWizardexe”,在“Project name”文本框中输入项目名EX9_1,在“Location”文本框中输入保存项目的路径和
16、文件夹名,单击“OK”按钮。在随后出现的“MFC AppWizardStep1”对话框(见图8-2)中选择“Dialog based”,单击“Finish”按钮,就以缺省选项建立了应用程序框架,并在Visual C+的集成开发环境下打开对话框编辑器和控件工具栏,如图9-3所示。,图9-3 对话框编辑窗口,(2)添加控件并设置控件属性。一个对话框总是与控件相关联的,对话框的功能主要由各种控件来实现,因此,为了实现对话框的功能,必须利用对话框编辑器为对话框模板资源添加相应的控件。添加控件需要利用控件工具栏,如图9-4所示。控件工具栏上的每一个图标代表一种控件。若Visual C+窗口中没有出现控件
17、工具栏,则只需在菜单栏或工具栏的空白处右击鼠标,在弹出的快捷菜单中选择“Controls”项即可。,图9-4 控件工具栏及控件说明,在对话框模板资源上添加控件的方法:在控件工具栏上单击要添加的控件图标,选择所需的控件,然后在对话框上按住鼠标左键在适当位置画出所需大小的控件。也可以在控件工具栏中选择所需控件后,在对话框指定位置处单击鼠标,则该控件被添加到对话框中指定的位置。本例中,先删除原有的控件,按图9-2所示,添加三个静态文本框、三个编辑框和四个命令按钮。若想改变控件的大小,对齐控件,删除或移动控件等,必须首先选择相应的控件。单击某个控件即可选中该控件。若要同时选择多个控件,一种方法是在对话
18、框内按住鼠标左键不放,拖动鼠标画出一个虚线框,然后释放鼠标,则被该虚线框包围的控件都将被同时选中;另一种方法是按住Shift(或Ctrl)键不放,然后用鼠标分别单击需要选中的控件。,当有多个控件被同时选中时,其中有一个控件周围带有实心标志,其它为空心标志。当需要同时改变多个控件的大小或对齐多个控件时,对话框编辑器以带实心的控件来决定其它控件的大小和对齐方式。按住Ctrl键不放,单击某个控件,即可将实心标志移到该控件上。按住Shift键不放,单击被选中的控件,则可取消该控件的选中。为了调整对话框中控件的位置、大小和对齐控件等,可以使用如图9-5所示的对话框工具栏(一般位于Visual C+集成开
19、发环境的底部)或使用“Layout”菜单来布局控件。只有当打开对话框编辑器时,才会出现Layout菜单。,图9-5 对话框工具栏,在调整控件布局时可以随时单击“测试对话框”按钮观察对话框的运行结果。控件的属性决定了控件的外观和功能。可以在添加控件的同时设置控件的属性,或者在控件添加结束后再设置属性。在对话框模板资源中右击需要设置属性的控件,在弹出的快捷菜单中选择“Properties”,或选中控件按回车键,则弹出如图9-6所示的控件的属性对话框。在对话框中可以选中某选项以设置该属性,或取消选中以清除该属性。若要设置多个控件的属性,可以按下属性窗口对话框左上角的图钉按钮,则属性对话框始终保持打开
20、状态。,图9-6 控件的属性对话框,本例中,对第一个编辑框,在“General”标签下设置控件ID值为IDC_FIRSTNUM,其它属性采用缺省设置。表9-1列出了本例中所有控件的属性设置和添加的成员变量。,表9-1 例9.1中控件的属性设置和添加的成员变量,(3)利用ClassWizard可以在对话框类中添加数据成员、交换函数和有效性验证函数,为控件添加关联的成员变量。在对话框中添加控件后,可以利用ClassWizard在对话框类中为控件添加对应的成员变量,一个控件可以添加一个或多个成员变量。执行“View”“ClassWizard”菜单命令或按“Ctrl+W”快捷键或右击需要关联的成员变量
21、的控件,在快捷菜单中选择“ClassWizard”,打开“MFC ClassWizard”对话框,选中“Member Variables”标签,如图9-7所示。在“Member Variables”标签下,可以在对话框类中为对话框中的控件添加关联的成员变量和删除变量。,图9-7 ClassWizard类向导的“Member Variables”标签,在“Member Variables”标签的Class name下拉列表框中选择要添加成员变量的对话框类,本例为CEX9_1Dlg。“Control IDs”列表框中列出了该对话框中所有控件的ID值。对话框中每一个控件都必须有一个ID值,每一个ID
22、值唯一地代表一个控件。在“Control IDs”下选定需要关联的变量的控件ID,单击“Add Variable”按钮,将弹出如图9-8所示的“Add Member Variable”对话框。在“Member variable name”框中输入成员变量名,ClassWizard缺省以“m_”作为成员变量名的前缀。在“Category”下拉列表框中选择成员变量的类别,可以为Control或Value,在“Variable type”下拉列表框中选择成员变量的数据类型。,图9-8 添加成员变量对话框,若选择成员变量的类别为Value,则添加的成员变量用来保存控件的值或给控件赋值,这时可以在Var
23、iable type下拉列表框中为变量选择不同的数据类型。不同控件的成员变量可以选择的数据类型有所不同。若选择成员变量的类别为Control,则添加的成员变量就是代表控件本身的一个控件对象,其数据类型为控件所对应的MFC控件类。通过此控件对象可以访问控件类的成员函数,实现对控件的管理和控制。例如,对于编辑框,Control类别的成员变量的数据类型为类CEdit。可以为一个控件同时定义一个Value类别的变量和一个Control类别的变量,但有些控件只能定义Control类别的变量,如命令按钮控件。添加的成员变量的访问控制权限都为Public。,在“MFC ClassWizard”对话框的“Me
24、mber Variables”标签下,如果选中的控件已经添加了成员变量,则单击“Delete Variable”按钮可以删除相应的成员变量。在添加Value类别成员变量的同时,还可以为此变量添加有效性验证数据,如变量的最大值和最小值、字符串的最大长度等。例如在图9-7中,可以在对话框的最下面两个文本框中输入变量的最大值和最小值。这时,ClassWizard将根据用户的指定生成相应的有效性验证函数,以确保在使用过程中数据的合法性。,本例中,为各控件添加的成员变量及数据类型见表9-1所示。(4)使用ClassWizard为对话框控件添加消息处理函数。在建立了用户界面、设置好控件属性和连接成员变量后
25、,就要考虑为哪些控件编写什么样的消息处理函数了。本例中,当用户在编辑框中输入两个操作数后,单击“加”或“减”命令按钮对这两个操作数作相应的运算,因此,应为各命令按钮添加鼠标单击的消息处理函数,在函数中作相应的运算并输出结果。,执行“View”“ClassWizard”菜单命令或按“Ctrl+W”快捷键或右击需要关联成员变量的控件,在快捷菜单中选择“ClassWizard”,打开“MFC ClassWizard”对话框。在“Message Maps”标签下,选择Class name为“CEX9_1Dlg”,在“Object IDs”列表框中选定需要添加消息处理函数的控件ID,如IDC_ADD,在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 对话框 应用程序 6868 le 自定义 导航
链接地址:https://www.31ppt.com/p-6262509.html