第第4 4章章 对话框设计和编程对话框设计和编程————构建人机交互界面,提升系统交互能力构建人机交互界面,提升系统交互能力教学内容教学内容§4.1 §4.1 对话框基础知识对话框基础知识§4.2 §4.2 对话框设计对话框设计——EX04A——EX04A示例程序示例程序§4.3 §4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件§4.4 §4.4 无模式对话框无模式对话框§4.5 §4.5 公用对话框公用对话框§4.6 §4.6 综合实例综合实例————宾馆管理系统的界面设计宾馆管理系统的界面设计§§4.7 4.7 小结小结 思考与练习思考与练习§§4.1 4.1 对话框基础知识对话框基础知识4.1.1 4.1.1 对话框的分类对话框的分类 按照运行机制来划分,对话框可分为模式对话框和无模式对按照运行机制来划分,对话框可分为模式对话框和无模式对话框 1 1、对于模式对话框,如打开文件对话框,在该对话框被关、对于模式对话框,如打开文件对话框,在该对话框被关闭之前,用户将无法在同一程序的其他地方进行工作闭之前,用户将无法在同一程序的其他地方进行工作。
2 2、对于无模式对话框,在它仍然保留在屏幕上的同时,用、对于无模式对话框,在它仍然保留在屏幕上的同时,用户还可以在应用程序的其它窗口中进行工作户还可以在应用程序的其它窗口中进行工作Microsoft WordMicrosoft Word中的中的““查找与替换查找与替换””对话框就是无模式对话框的一个很好的例对话框就是无模式对话框的一个很好的例子,在该对话框打开的同时,我们仍然可以对文档进行编辑子,在该对话框打开的同时,我们仍然可以对文档进行编辑§§4.1 4.1 对话框基础知识对话框基础知识4.1.2 4.1.2 对话框的组成对话框的组成1 1、对话框资源模板、对话框资源模板 对话框资源模板不但指定了对话框本身的位置、大小、风格对话框资源模板不但指定了对话框本身的位置、大小、风格等特征,还确定了它所包含的各种控件的位置、大小分割、排等特征,还确定了它所包含的各种控件的位置、大小分割、排列和其他特征,实际上模板中储存了列和其他特征,实际上模板中储存了WindowsWindows用于创建或显示对用于创建或显示对话框的所有信息话框的所有信息2 2、对话框类、对话框类 在在Visual C++.NETVisual C++.NET中,每个对话框都必须有一个类与之对中,每个对话框都必须有一个类与之对应。
由于不同的对话框行使的功能各不相同,因此一般需要从应由于不同的对话框行使的功能各不相同,因此一般需要从CDialogCDialog类派生一个新类以完成特定功能类派生一个新类以完成特定功能CDialogCDialog中提供了多中提供了多个与对话框编程密切相关的函数供程序员调用,从而大大简化个与对话框编程密切相关的函数供程序员调用,从而大大简化了编程代码,提高效率了编程代码,提高效率§§4.1 4.1 对话框基础知识对话框基础知识4.1.3 对话框的创建对话框的创建§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源创建对话框资源的步骤如下:创建对话框资源的步骤如下:1 1、运行应用程序向导来产生名为、运行应用程序向导来产生名为EX04AEX04A的单文档的应用程序,的单文档的应用程序,并取消并取消““打印和打印预览打印和打印预览””选项,其它所有选项选择默认值选项,其它所有选项选择默认值2 2、插入对话框资源。
在应用程序的设计环境中换至、插入对话框资源在应用程序的设计环境中换至““资源视资源视图图””框,右击框,右击DialogDialog图标,在弹出的快捷菜单中单击图标,在弹出的快捷菜单中单击““插入插入Dialog...Dialog...””命令,将会在命令,将会在DialogDialog节点下增加一项节点下增加一项IDID号为号为IDD_DIALOG1IDD_DIALOG1的对话框模板资源,单击的对话框模板资源,单击DialogDialog节点将其展开即节点将其展开即可看到§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源创建对话框资源的步骤如下:创建对话框资源的步骤如下:1 1、运行应用程序向导来产生名为、运行应用程序向导来产生名为EX04AEX04A的单文档的应用程序,的单文档的应用程序,并取消并取消““打印和打印预览打印和打印预览””选项,其它所有选项选择默认值选项,其它所有选项选择默认值2 2、插入对话框资源在应用程序的设计环境中换至、插入对话框资源在应用程序的设计环境中换至““资源视资源视图图””框,右击框,右击DialogDialog图标,在弹出的快捷菜单中单击图标,在弹出的快捷菜单中单击““插入插入Dialog...Dialog...””命令,将会在命令,将会在DialogDialog节点下增加一项节点下增加一项IDID号为号为IDD_DIALOG1IDD_DIALOG1的对话框模板资源,单击的对话框模板资源,单击DialogDialog节点将其展开即节点将其展开即可看到。
可看到§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源3、设置对话框的属性选中对话框,在、设置对话框的属性选中对话框,在“属性属性”框中设置对框中设置对话框的标题:话框的标题:“对话框示例对话框示例”、对话框、对话框ID :IDD_MYDIALOG和其他的一些属性,并扩大对话框和其他的一些属性,并扩大对话框的边界到合适的大小的边界到合适的大小§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源4、向对话框模板中添加控件利用控件工具箱加入每一个控、向对话框模板中添加控件利用控件工具箱加入每一个控件,具体方法如下:用鼠标将控件从工具箱中拖到对话框中合件,具体方法如下:用鼠标将控件从工具箱中拖到对话框中合适的位置,释放鼠标,并设置其大小适的位置,释放鼠标,并设置其大小说明:在对话框编辑界面下,可以选定一个或通过按住说明:在对话框编辑界面下,可以选定一个或通过按住Ctrl键键不妨用鼠标左键单击选定多个控件,在对话框中复制并粘贴,不妨用鼠标左键单击选定多个控件,在对话框中复制并粘贴,可以添加如与原来控件外观一样的新控件。
可以添加如与原来控件外观一样的新控件§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源5、设置对换框中控件的风格具体方法如下:用鼠标选定控、设置对换框中控件的风格具体方法如下:用鼠标选定控件,在件,在“属性属性”对话框中按要求输入控件属性,如在对话框中按要求输入控件属性,如在ID框中框中输入标识控件的唯一输入标识控件的唯一ID值,在值,在Caption中输入控件上显示的中输入控件上显示的字符字符(Edit控件没有这一属性控件没有这一属性),,Visible表示该控件在对话框表示该控件在对话框创建时是否显示,创建时是否显示,Group用来控制控件分组,用来控制控件分组,Disabled使使控件不可用,控件不可用,Tab stop表示是否用表示是否用Tab键选择控件键选择控件 §§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源6、检查对话框的、检查对话框的Tab键顺序从对话框编辑器的键顺序从对话框编辑器的【【格式格式】】菜菜单中选择单中选择【【Tab键顺序键顺序】】命令,或者同时按下命令,或者同时按下Ctrl+D键,此键,此时每个控件的左上方都有一个数字,表明了当前时每个控件的左上方都有一个数字,表明了当前Tab键次序。
键次序然后按图然后按图4-5所示用鼠标依次单击各个控件来设置新的所示用鼠标依次单击各个控件来设置新的Tab键键顺序,最后单击对话框或者按下顺序,最后单击对话框或者按下Enter键结束键结束Tab键顺序设置键顺序设置§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.1 4.2.1 创建对话框资源创建对话框资源§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.2 定义对话框类定义对话框类§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.3 4.2.3 对话框的实现对话框的实现1、在视图类中添加菜单、在视图类中添加菜单“【【对话框对话框】】|【【学生问卷调查学生问卷调查】】”,并利用,并利用“添加事件向导添加事件向导…”为该菜单添加消息响应函数为该菜单添加消息响应函数2、向菜单的消息响应函数中添加如下代码:、向菜单的消息响应函数中添加如下代码: CStuDlg dlg; dlg.DoModal(); //显示对话框显示对话框3、在视图类的实现文件(、在视图类的实现文件(.cpp)中加入对话框类的包含文件:)中加入对话框类的包含文件: #include “StuDlg.h”4、编译和测试该应用程序。
当单击菜单、编译和测试该应用程序当单击菜单【【对话框对话框】】的的【【学生学生问卷调查问卷调查】】命令将弹出学生问卷调查对话框命令将弹出学生问卷调查对话框§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.4 对话框程序的完善对话框程序的完善1、为对话框类加入与控件相对应的成员变量、为对话框类加入与控件相对应的成员变量p对话框的主要功能是通过所包含的控件进行数据的输入和输对话框的主要功能是通过所包含的控件进行数据的输入和输出,要使对话框能与程序通讯,还需给对话框类增加数据成员,出,要使对话框能与程序通讯,还需给对话框类增加数据成员,以保存各控件的初始值,并从控件读取数据以保存各控件的初始值,并从控件读取数据p与控件对应的成员变量既可以是一个数据变量,也可以是一与控件对应的成员变量既可以是一个数据变量,也可以是一个控件对象,这将由具体需要来确定如果是需要交换的控件,个控件对象,这将由具体需要来确定如果是需要交换的控件,则定义对应的数据变量则定义对应的数据变量p如果需要在程序中对控件进行控制,则定义对应的对象例如果需要在程序中对控件进行控制,则定义对应的对象。
例如,编辑框指定一个如,编辑框指定一个CEdit对象,通过对象,通过CEdit对象,程序员可对象,程序员可以控制控件的行为以控制控件的行为§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.4 对话框程序的完善对话框程序的完善2、数据交换和检验、数据交换和检验p对话框程序运行时,用户更改控件属性,如在编辑框中输入文字或改变对话框程序运行时,用户更改控件属性,如在编辑框中输入文字或改变复选框的选中状态时,复选框的选中状态时,MFC会修改对应控件变量的值这个过程是通过会修改对应控件变量的值这个过程是通过MFC为对话框类自动添加的成员函数为对话框类自动添加的成员函数DoDataExchange()实现的,称实现的,称为对话框数据交换和检验机制为对话框数据交换和检验机制 p控件和控件变量之间的数据交换并非自动完成的,而是需要调用控件和控件变量之间的数据交换并非自动完成的,而是需要调用CDialog::UpdateData()函数才能实现从控件到控件变量或者从控件变量到控件的数据传送。
函数才能实现从控件到控件变量或者从控件变量到控件的数据传送pCDialog::UpdateData()函数的原型为:函数的原型为: BOOL UpdateData(BOOL bSaveAndValidate=TRUE));; bSaveAndValidate参数用于指定数据的传输方向,参数用于指定数据的传输方向,TRUE表示将数表示将数据从控件传送给变量,据从控件传送给变量,FALSE则表示将数据从变量传给控件则表示将数据从变量传给控件§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.4 对话框程序的完善对话框程序的完善3、为对话框类添加控件通知消息的处理函数、为对话框类添加控件通知消息的处理函数((1))对对CDialog的的OnInitDialog函函数数进进行行重重写写,,以以实实现现对对话话框框控控件件的的初初始始化化具具体体方方法法如如下下::将将工工作作区区视视图图切切换换到到“类类视视图图”,,并并选选中中对对话话框框类类CStuDlg,,在在该该类类的的属属性性对对话话框框中中用用鼠鼠标标单单击击“重重写写”图图标标,,添添加加OnInitDialog函数,如图函数,如图4-8所示。
所示 重写OnInitDialog函数§§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.4 对话框程序的完善对话框程序的完善3、为对话框类添加控件通知消息的处理函数、为对话框类添加控件通知消息的处理函数(( 2)) 利利 用用 属属 性性 对对 话话 框框 为为 省省 份份 组组 合合 框框 添添 加加 事事 件件CBN_SELCHANGE的的控控制制函函数数OnChangeProvice(()),,以便能够根据选定省份向城市列表框中添加该省份所在的城市以便能够根据选定省份向城市列表框中添加该省份所在的城市3))添添加加判判定定复复选选框框是是否否选选中中的的成成员员函函数数GetCheck(())实实现兴趣和爱好字符串现兴趣和爱好字符串 ((4 4))利利用用添添加加事事件件处处理理程程序序向向导导为为““确确定定””按按钮钮添添加加鼠鼠标标单单击事件击事件BN_CLICKEDBN_CLICKED的事件处理程序的事件处理程序OnSubmissionOnSubmission() () §§4.2 4.2 对话框设计对话框设计————EX04AEX04A示例程序示例程序4.2.5 对控件进行操作的一般方法对控件进行操作的一般方法1、获取被操作控件的指针,通过指针调用其成员函数,例如:、获取被操作控件的指针,通过指针调用其成员函数,例如:CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);pEdit->Undo();2、将被操作控件设置成控件型成员变量,通过该变量名调用控件的成员、将被操作控件设置成控件型成员变量,通过该变量名调用控件的成员函数。
如将函数如将IDC_EDIT1设置成设置成CEdit类型的成员变量类型的成员变量m_cEdit,然后,然后就可以执行诸如就可以执行诸如“m_cEdit.Undo();”这样的语句这样的语句3、可以调用基类、可以调用基类CWnd成员函数在调用被操作控件的成员函数时,除成员函数在调用被操作控件的成员函数时,除了调用它自己类中定义的成员函数外,千万别忘记它的基类了调用它自己类中定义的成员函数外,千万别忘记它的基类CWnd中定义中定义的成员函数的成员函数CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);pEdit->SetWindowText(“本函数可以用来设置窗口的标题或控件的本函数可以用来设置窗口的标题或控件的正文正文”);;§4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件 4.3.1 滚动条控件滚动条控件§4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件 4.3.1 滚动条控件滚动条控件1、滚动条的基本操作、滚动条的基本操作 在在MFC的的CScrollBar类中,函数类中,函数SetScrollRange是用来设置滚动条是用来设置滚动条的滚动范围的,其原型如下:的滚动范围的,其原型如下: SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE ); 在在CScrollBar类中,设置滚动块位置操作是由类中,设置滚动块位置操作是由SetScrollPos函数来完函数来完成的,其原型如下:成的,其原型如下: int SetScrollPos( int nPos, BOOL bRedraw = TRUE ); 与与SetScrollRange 和和SetScrollPos相对应的两个函数是分别用来获相对应的两个函数是分别用来获取滚动条的当前范围以及当前滚动位置:取滚动条的当前范围以及当前滚动位置: void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) ; int GetScrollPos(); §4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件 4.3.1 滚动条控件滚动条控件2、、 WM_HSCROLL或或WM_VSCROLL消息消息 滚动条进行操作时,会向父窗口发送滚动条进行操作时,会向父窗口发送WM_HSCROLL或或WM_VSCROLL消息。
消息消息映射函数消息映射函数OnHScroll和和OnVScroll原型:原型: afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar ); afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar ); §4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件 4.3.2 旋转按钮控件旋转按钮控件“旋转按钮控件旋转按钮控件”是一对箭头按钮,用户点击它们来增加或减是一对箭头按钮,用户点击它们来增加或减少某个值少某个值 一个旋转按钮控件通常是与一个相伴的控件一起使用的,一个旋转按钮控件通常是与一个相伴的控件一起使用的,这个控件称为这个控件称为“伙伴窗口伙伴窗口”。
通常将一个旋转按钮控件与一个通常将一个旋转按钮控件与一个编辑控件一起使用,以提示用户进行数据输入编辑控件一起使用,以提示用户进行数据输入 缺省时,旋转按钮的最小值是缺省时,旋转按钮的最小值是100,最大值是,最大值是0,当用户单,当用户单击向上箭头减少数值,而点击向下的箭头则增加它击向上箭头减少数值,而点击向下的箭头则增加它 旋转按钮 伙伴窗口§4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件 4.3.3 滑动条滑动条滑动条控件是由滑动块和可选的刻度线组成的当用户用鼠标滑动条控件是由滑动块和可选的刻度线组成的当用户用鼠标或方向键移动滑动块时,该控件发送通知消息来表明这些改变或方向键移动滑动块时,该控件发送通知消息来表明这些改变§4.3 滚动条、旋转按钮和滑动条控件滚动条、旋转按钮和滑动条控件 4.3.4 示例程序示例程序EX04B §§4.4 4.4 无模式对话框无模式对话框1.非模态对话框的模板资源必须具有.非模态对话框的模板资源必须具有Visible风格,否则对话框将不可见,风格,否则对话框将不可见,而模态对话框则无需设置该项风格;而模态对话框则无需设置该项风格;2.非模态对话框对象是用.非模态对话框对象是用new操作符动态创建的,而不象模态对话框那操作符动态创建的,而不象模态对话框那样以对象变量的形式出现。
对于非模态对话框,应在对话框的拥有者窗口样以对象变量的形式出现对于非模态对话框,应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问非模态对类内声明一个指向对话框类的指针成员变量,通过该指针可访问非模态对话框对象;话框对象;3.通过调用.通过调用CDialog::Create()函数来启动非模态对话框,而不是象()函数来启动非模态对话框,而不是象模态对话框那样使用模态对话框那样使用CDialog::DoModal()来启动,这是应用非模态()来启动,这是应用非模态对话框的关键之处由于对话框的关键之处由于Create()函数不会启动新的消息循环,非模()函数不会启动新的消息循环,非模态对话框与应用程序共用同一个消息循环,这样非模态对话框就不会垄断态对话框与应用程序共用同一个消息循环,这样非模态对话框就不会垄断用户的输入用户的输入Create()函数在显示了非模态对话框后就立即返回,而()函数在显示了非模态对话框后就立即返回,而DoModal()是在模态对话框被关闭后才返回的是在模态对话框被关闭后才返回的4.必须重载并重新编写对话框的.必须重载并重新编写对话框的OnOK()和()和OnCancel()函数,并()函数,并在在OnCancel()函数中调用()函数中调用DestroyWindow()函数来关闭非模态()函数来关闭非模态对话框。
对话框DestoryWindow()是()是CWnd类的成员函数,用于关闭窗口;类的成员函数,用于关闭窗口;5.因为非模态对话框对象是用.因为非模态对话框对象是用new操作符构建的,因此必须在对话框关操作符构建的,因此必须在对话框关闭后,用闭后,用delete操作符删除之;操作符删除之;§§4.5 4.5 公用对话框公用对话框4.5.1 颜色选择对话框颜色选择对话框§§4.5 4.5 公用对话框公用对话框4.5.2 字体选择对话框字体选择对话框§§4.5 4.5 公用对话框公用对话框4.5.3 文件对话框文件对话框§§4.6 4.6 综合实例综合实例————宾馆管理系统的界面设计宾馆管理系统的界面设计4.6.1 登陆界面设计登陆界面设计4.6.2 业务管理界面设计业务管理界面设计4.6.3 数据管理界面设计数据管理界面设计4.6.4 菜单与设计界面的关联菜单与设计界面的关联§§4.7 4.7 小结小结 在Windows应用程序中,对话框是一种常用的输入和输出界面,它由一些控件组成,因此,设计一个对话框通常包括两个步骤:对话框模版设计和对话框类的定义对话框模版的设计是通过模版编辑器来实现,而对话框类的定义则可以由添加类向导来实现。
我们也可借助Visual Studio.NET的工具为对话框类增加成员函数、成员变量以及增加空间通知消息,以实现更多丰富的功能 对话框的数据成员的初始化工作一般在其构造函数中完成,而对话框和控件的初始化在OnInitDialog函数中完成 对话框按照运行机制可分为模式对话框和无模式对话框模式对话框拥有自己的消息循环,它垄断了用户的输入模式对话框对象是以变量形式构建的,CDialog::DoModel()用来启动一个模式对话框,在对话框关闭后该函数才返回无模式对话框与它所在的应用程序公用消息循环,它不垄断输入无模式对话框应该用new操作符创建,调用CDialog:: Create()而不是CDialog::DoModel()来显示对话框,调用CWnd::DestoryWindow()而不是CDialog::EndDialog()来关闭无模式对话框思考与练习思考与练习1、什么是对话框?它分为哪两类?这两类对话框有哪些不同?2、什么是对话框模版、对话框资源和对话框类?3、对一个对话框编程一般经过几个步骤?4、什么是控件的通知消息?它在编程中起哪些作用?5、什么是按钮控件?它有哪几种类型?6、什么是列表框和组合框?它们的通知消息有何不同? 7、编写一个具有加法、减法、乘法和除法的计算器程序。
8、签名留念簿程序该程序模仿签名簿,用户使用鼠标左键点击窗口客户区后会弹出一个对话框,输入姓名后可在鼠标点击位置显示出该签名签名的颜色、字体大小和方向随机确定9、设计一个登陆对话框,当用户输入正确的用户名和密码后显示一个欢迎消息框,否则,关闭对话框10、为某公司设计一个人事管理系统,其基本功能为输入、编辑、查看和保存公司的人事档案职工人事档案包括姓名、性别、出生日期、婚姻状况、所在部门、职务和工资。