第4章对话框设计和编程.ppt
第4章 对话框设计和编程构建人机交互界面,提升系统交互能力,教学内容4.1 对话框基础知识4.2 对话框设计EX04A示例程序4.3 滚动条、旋转按钮和滑动条控件4.4 无模式对话框4.5 公用对话框4.6 综合实例宾馆管理系统的界面设计4.7 小结 思考与练习,4.1 对话框基础知识,4.1.1 对话框的分类 按照运行机制来划分,对话框可分为模式对话框和无模式对话框。1、对于模式对话框,如打开文件对话框,在该对话框被关闭之前,用户将无法在同一程序的其他地方进行工作。2、对于无模式对话框,在它仍然保留在屏幕上的同时,用户还可以在应用程序的其它窗口中进行工作。Microsoft Word中的“查找与替换”对话框就是无模式对话框的一个很好的例子,在该对话框打开的同时,我们仍然可以对文档进行编辑。,4.1 对话框基础知识,4.1.2 对话框的组成1、对话框资源模板 对话框资源模板不但指定了对话框本身的位置、大小、风格等特征,还确定了它所包含的各种控件的位置、大小分割、排列和其他特征,实际上模板中储存了Windows用于创建或显示对话框的所有信息。2、对话框类 在Visual C+.NET中,每个对话框都必须有一个类与之对应。由于不同的对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类以完成特定功能。CDialog中提供了多个与对话框编程密切相关的函数供程序员调用,从而大大简化了编程代码,提高效率。,4.1 对话框基础知识,4.1.3 对话框的创建,4.2 对话框设计EX04A示例程序,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源创建对话框资源的步骤如下:1、运行应用程序向导来产生名为EX04A的单文档的应用程序,并取消“打印和打印预览”选项,其它所有选项选择默认值。2、插入对话框资源。在应用程序的设计环境中换至“资源视图”框,右击Dialog图标,在弹出的快捷菜单中单击“插入Dialog.”命令,将会在Dialog节点下增加一项ID号为IDD_DIALOG1的对话框模板资源,单击Dialog节点将其展开即可看到。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源创建对话框资源的步骤如下:1、运行应用程序向导来产生名为EX04A的单文档的应用程序,并取消“打印和打印预览”选项,其它所有选项选择默认值。2、插入对话框资源。在应用程序的设计环境中换至“资源视图”框,右击Dialog图标,在弹出的快捷菜单中单击“插入Dialog.”命令,将会在Dialog节点下增加一项ID号为IDD_DIALOG1的对话框模板资源,单击Dialog节点将其展开即可看到。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源3、设置对话框的属性。选中对话框,在“属性”框中设置对话框的标题:“对话框示例”、对话框ID:IDD_MYDIALOG和其他的一些属性,并扩大对话框的边界到合适的大小。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源4、向对话框模板中添加控件。利用控件工具箱加入每一个控件,具体方法如下:用鼠标将控件从工具箱中拖到对话框中合适的位置,释放鼠标,并设置其大小。说明:在对话框编辑界面下,可以选定一个或通过按住Ctrl键不妨用鼠标左键单击选定多个控件,在对话框中复制并粘贴,可以添加如与原来控件外观一样的新控件。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源5、设置对换框中控件的风格。具体方法如下:用鼠标选定控件,在“属性”对话框中按要求输入控件属性,如在ID框中输入标识控件的唯一ID值,在Caption中输入控件上显示的字符(Edit控件没有这一属性),Visible表示该控件在对话框创建时是否显示,Group用来控制控件分组,Disabled使控件不可用,Tab stop表示是否用Tab键选择控件。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源6、检查对话框的Tab键顺序。从对话框编辑器的【格式】菜单中选择【Tab键顺序】命令,或者同时按下Ctrl+D键,此时每个控件的左上方都有一个数字,表明了当前Tab键次序。然后按图4-5所示用鼠标依次单击各个控件来设置新的Tab键顺序,最后单击对话框或者按下Enter键结束Tab键顺序设置。,4.2 对话框设计EX04A示例程序,4.2.1 创建对话框资源,4.2 对话框设计EX04A示例程序,4.2.2 定义对话框类,4.2 对话框设计EX04A示例程序,4.2.3 对话框的实现1、在视图类中添加菜单“【对话框】|【学生问卷调查】”,并利用“添加事件向导”为该菜单添加消息响应函数。2、向菜单的消息响应函数中添加如下代码:CStuDlg dlg;dlg.DoModal();/显示对话框3、在视图类的实现文件(.cpp)中加入对话框类的包含文件:#include“StuDlg.h”4、编译和测试该应用程序。当单击菜单【对话框】的【学生问卷调查】命令将弹出学生问卷调查对话框。,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善1、为对话框类加入与控件相对应的成员变量对话框的主要功能是通过所包含的控件进行数据的输入和输出,要使对话框能与程序通讯,还需给对话框类增加数据成员,以保存各控件的初始值,并从控件读取数据。与控件对应的成员变量既可以是一个数据变量,也可以是一个控件对象,这将由具体需要来确定。如果是需要交换的控件,则定义对应的数据变量。如果需要在程序中对控件进行控制,则定义对应的对象。例如,编辑框指定一个CEdit对象,通过CEdit对象,程序员可以控制控件的行为。,4.2 对话框设计EX04A示例程序,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善2、数据交换和检验对话框程序运行时,用户更改控件属性,如在编辑框中输入文字或改变复选框的选中状态时,MFC会修改对应控件变量的值。这个过程是通过MFC为对话框类自动添加的成员函数DoDataExchange()实现的,称为对话框数据交换和检验机制。控件和控件变量之间的数据交换并非自动完成的,而是需要调用CDialog:UpdateData()函数才能实现从控件到控件变量或者从控件变量到控件的数据传送。CDialog:UpdateData()函数的原型为:BOOL UpdateData(BOOL bSaveAndValidate=TRUE);bSaveAndValidate参数用于指定数据的传输方向,TRUE表示将数据从控件传送给变量,FALSE则表示将数据从变量传给控件。,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善3、为对话框类添加控件通知消息的处理函数(1)对CDialog的OnInitDialog函数进行重写,以实现对话框控件的初始化。具体方法如下:将工作区视图切换到“类视图”,并选中对话框类CStuDlg,在该类的属性对话框中用鼠标单击“重写”图标,添加OnInitDialog函数,如图4-8所示。,4.2 对话框设计EX04A示例程序,4.2.4 对话框程序的完善3、为对话框类添加控件通知消息的处理函数(2)利用属性对话框为省份组合框添加事件CBN_SELCHANGE的控制函数OnChangeProvice(),以便能够根据选定省份向城市列表框中添加该省份所在的城市。(3)添加判定复选框是否选中的成员函数GetCheck()实现兴趣和爱好字符串。(4)利用添加事件处理程序向导为“确定”按钮添加鼠标单击事件BN_CLICKED的事件处理程序OnSubmission()。,4.2 对话框设计EX04A示例程序,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 无模式对话框,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.1 颜色选择对话框,4.5 公用对话框,4.5.2 字体选择对话框,4.5 公用对话框,4.5.3 文件对话框,4.6 综合实例宾馆管理系统的界面设计,4.6.1 登陆界面设计4.6.2 业务管理界面设计4.6.3 数据管理界面设计4.6.4 菜单与设计界面的关联,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、为某公司设计一个人事管理系统,其基本功能为输入、编辑、查看和保存公司的人事档案。职工人事档案包括姓名、性别、出生日期、婚姻状况、所在部门、职务和工资。,