1、第二章 对话框应用程序 几种基本对话框的原理和实现方法,以及实用对话框程序的设计技巧对话框的两种形式v示例v1、模态对话框v2、非模态对话框 创建模态对话框后,应用程序只会响应该对话框的消息,创建模态对话框后,应用程序只会响应该对话框的消息,直到收到结束模态对话框消息后,才会把控制权交还给应用直到收到结束模态对话框消息后,才会把控制权交还给应用程序,转而执行其它的消息。程序,转而执行其它的消息。 创建非模态对话框后,应用程序不会垄断用户的输入,创建非模态对话框后,应用程序不会垄断用户的输入,仍然可以响应其它窗口的消息。仍然可以响应其它窗口的消息。2.1 模态对话框v1、windows是基于消息
2、驱动机制的;v2、模态对话框产生后会屏蔽其它窗体消息;v3、应用程序只会响应当前模态对话框的消息,直至被关闭;v4、大多数窗口都属于该类型。v示例(1)新建项目(2)创建基于对话框的应用程序(3)通过资源视图打开主界面编辑(4)添加按钮,ID号为:IDC_CREATE_DIALOG(5)添加新对话框,ID号为:IDD_MODAL_DIALOG(6)为新对话框添加类(7)新类名:CMyModalDialog(8)回到主界面,添加按钮的消息响应(9)消息类型、类列表(10)添加代码(11)编译结果(12)解决方案:添加头文件包含(13) 再次编译:正确(14)执行结果:点击按钮,出现新对话框(为模
3、态对话框)(15)结果及分析v左对话框无法接受用户输入,直到关闭右边模态对话框v原因:CMyModalDialog dlg;dlg.DoModal();/创建模态对话框创建模态对话框本节小结v模态对话框的特性v创建一个简单模态对话框的步骤2.2 非模态对话框v非模态对话框窗口打开时,可以接受其它窗口消息v此类对话框较少v示例1、创建一个基于对话框的应用程序,并在主界面上添加一个按钮2、添加一个新对话框,并添加新类:CMyNoModalDialog3、为主界面上的按钮添加消息响应4、执行结果:焦点可回到父窗口,从而创建多个非模态对话框5、结果及分析v焦点没有停留在子窗口上,说明创建了一个非模态对
4、话框窗口v代码分析/定义对话框对象指针CMyNoModalDialog* pDlg=new CMyNoModalDialog();/创建非模态对话框pDlg-Create(IDD_DIALOG1,this);/显示对话框pDlg-ShowWindow(SW_SHOW);vCDialog类的成员函数:Create;原型BOOl Create(LPCTSTR lpszTemplateName,CWnd* pParentWnd=NULL);BOOL Create(UINT nIDTemplate,CWnd* pParentWnd=NULL);/指定对话框模板的名称指定对话框模板的名称/也可以是对话框
5、的也可以是对话框的ID号号/第二个第二个 参数指定了对话框的父窗口参数指定了对话框的父窗口此后,还要调用此后,还要调用ShowWindow来显示对话框来显示对话框5、结果及分析(续)/定义对话框对象指针CMyNoModalDialog* pDlg=new CMyNoModalDialog();/创建非模态对话框pDlg-Create(IDD_DIALOG1,this);/显示对话框pDlg-ShowWindow(SW_SHOW); 定义为指针:在堆上分配内存,与整个程定义为指针:在堆上分配内存,与整个程序的生命周期是一致的,在程序结束时才会被序的生命周期是一致的,在程序结束时才会被释放;或者定
6、义一个类的全局变量来控制无模释放;或者定义一个类的全局变量来控制无模式对话框的打开;式对话框的打开; 若定义为局部变量,则无法创建。若定义为局部变量,则无法创建。示例示例 5、结果及分析(续)5、结果及分析(续)v修改后的代码CMyNoModalDialog dlg;dlg.Create(IDD_DIALOG1,this);dlg.ShowWindow(SW_SHOW);5、结果及分析(续)修改后的结果5、结果及分析(续)修改后的结果结果:点击按钮创建非模态对话框结果:点击按钮创建非模态对话框窗口后闪烁一下后就立即关闭了窗口后闪烁一下后就立即关闭了本节小结v非模态对话框的特性v创建一个非模态对
7、话框的步骤及注意事项2.3 属性对话框v属性对话框是一种比较特殊的对话框模式,它可以把多个独立的对话框有效合理地组织起来v示例实例效果图及实现步骤1、创建一个基于对话框的项目2、解决方案资源管理器-添加-资源3、添加资源 对话框4、属性页资源(大、中、小)/出现在对话框中,因此属出现在对话框中,因此属性页是对话框的一种形式,性页是对话框的一种形式,可当做对话框来处理。可当做对话框来处理。5、添加三个属性页资源6、添加基于CPropertyPage类的新类7、添加基于CPropertySheet类的CMySheet类7、添加基于CPropertySheet类的CMySheet类(续)7、添加基于
8、CPropertySheet类的CMySheet类(续)8、在CMySheet中定义3个属性页/MySheet.h文件中添加文件中添加9、在CMySheet构造函数中添加3个属性页/在在MySheet.cpp文件中文件中,构构造函数是与类同名的函数造函数是与类同名的函数10、显示属性对话框/在应用程序实现文件的在应用程序实现文件的InitInstance()函数中添加函数中添加11、运行效果本节小结v属性对话框的创建v注意事项:添加资源的方法设置资源ID的方法为资源添加类的方法添加新类的方法在头文件中定义变量和在实现文件的构造函数中初始化变量的方法2.4 对话框设计技巧v1、网格和参考线v2、
9、对齐和排列v3、设置控件逻辑顺序1、网格设置(默认情况下无网格)1、网格设置(续)1、网格设置(续)1、网格设置(续:设置后的结果)2、对齐和排列(ctrl键选中)2、对齐和排列(续)3、设置控件逻辑顺序v控件的逻辑顺序决定着软件中需要使用TAB键进行焦点切换时的顺序排列。v例如3、设置控件逻辑顺序(续)3、设置控件逻辑顺序(续)/按照添加的顺序按照添加的顺序3、设置控件逻辑顺序(续):改变顺序的方法/原始顺序原始顺序/鼠标在某个需要改变顺序的控件上鼠标在某个需要改变顺序的控件上单击,即可。此图为改变后的顺序单击,即可。此图为改变后的顺序本节小结v1、参考线和网格的设置v2、控件对齐和排列v3
10、、设置控件逻辑顺序2.5 通用对话框v通用对话框是系统提供的一组比较常见的对话框模板,例如“打开”、“另存为”等;v编写代码实现通用对话框v示例1、创建一个基于对话框的应用程序,添加控件如图所示1、(续)v为第一个编辑框定义变量CString szSigOpenPathv为第二个编辑框定义变量CString vszSigSavePathv为列表框定义变量CListBox PathList2、打开对话框“单选”对应代码/ 定义“打开”对话框CFileDialog dlg ( TRUE ) ;if ( dlg.DoModal() = IDOK )/ 取得文件路径全名/ szSigOpenPath是
11、CString类型,跟第一个编辑框相关联 this-szSigOpenPath = dlg.GetPathName() ;/ 更新界面显示this-UpdateData( FALSE ) ;3、另存为代码/ 定义“另存为”对话框CFileDialog dlg ( FALSE ) ;if ( dlg.DoModal() = IDOK )/ 取得文件路径全名/ szSigSavePath是CString型,与第二个编辑框关联this-szSigSavePath = dlg.GetPathName() ;/ 更新界面显示this-UpdateData( FALSE ) ;4、过滤器+多选代码/ 设置
12、过滤器,只能选择*.exe或者*.txt类型的文件static WCHAR szFilter = L可执行文件(*.exe)|*.exe|文本文件(*.txt)|*.txt| ;/ 设置OFN_ALLOWMULTISELECT标记,支持多选CFileDialog dlg ( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFilter ) ;if ( dlg.DoModal() = IDOK )/ 清空列表框this-PathList.ResetContent() ;/ 取得所选择的第一个文件定位信息。POSITION pos = dlg.GetStartP
13、osition() ;while ( pos )/ 取得路径全名并添加到列表框this-PathList.AddString ( dlg.GetNextPathName(pos) ) ;5、运行效果图2.5.2 通用“字体”对话框v通过“字体”对话框可用来设置字体的大小、粗细、正斜、颜色、类型等v例如v编写代码设计自己的“字体”对话框1、创建一个基于对话框的应用程序添加两个控件:添加两个控件:(1)组框,标题)组框,标题为为“预览预览”(2)按钮,)按钮,“设设置置”2、在对应的dlg.h文件中添加如下两个变量/保存设置的字体保存设置的字体颜色和字体属性颜色和字体属性3、添加“设置”按钮的响应
14、3、(续)消息类型、类列表4、添加代码(p23)5、在OnPaint函数中定义重绘代码/在在dlg.cpp文件中找到文件中找到OnPaint函数,函数,在对应的位置添加代码在对应的位置添加代码6、运行效果(1)6、运行效果(2)6、运行效果(3)2.5.3 通用“颜色”对话框v可提供简单的调色面板,供用户选择v在很多应用程序中都可见v编写代码实现之1、创建对话框应用程序,并添加控件2、定义成员变量2、定义成员变量(续)2、(续)同样的方法设置第二个编辑框的成员变量2、(续)同样的方法设置第三个编辑框的成员变量3、直接在dlg.h文件中定义变量/定义绘制指定颜色的区域定义绘制指定颜色的区域4、“
15、设置”按钮的消息响应5、OnPaint函数中定义重绘代码6、 OnInitDialog函数中添加额外代码BOOL Cex253Dlg:OnInitDialog()/ TODO: 在此添加额外的初始化代码this-r = this-g = this-b = 255 ;this-UpdateData ( FALSE ) ;this-ColorShowRect.left = 147 ;this-ColorShowRect.top = 30 ;this-ColorShowRect.right = 245 ;this-ColorShowRect.bottom = 114 ;return TRUE;7、对
16、每个编辑框添加事件void Cex253Dlg:OnEnChangeEdit1()this-UpdateData () ;this-Invalidate () ;void Cex253Dlg:OnEnChangeEdit2()void Cex253Dlg:OnEnChangeEdit3()8、运行初始界面9、点击“设置”后出现颜色对话框10、设置后的结果本节小结v1、关联控件和变量v2、MFC定义的常见类的使用本章总结v1、两种基本对话框的类型、原理、实现方法v2、属性对话框的实现v3、对话框设计技巧v4、通用对话框的设计v课外练习:编程理解模态、非模态对话框的区别;编程实现属性对话框和通用对话框,注意使用对话框的设计技巧。