《第7章 对话框和控件》由会员分享,可在线阅读,更多相关《第7章 对话框和控件(105页珍藏版)》请在金锄头文库上搜索。
1、第7章 对话框和控件,版权所有 复制必究,对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。 对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。本章主要介绍对话框的工作原理和编程方法,并通过实例学习一些标准控件和公共控件的使用方法。,7.1 对话框概述,就用户交互输入功能而言,菜单和工具栏的功能是极其有限的。而对话框除了用来显示提示信息(如程序启动时显示版权和运行进度信息),一个主要功能是用于接收用户的输入数据。 在MFC中,
2、对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。 对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框,当然,对话框也可以作为一个程序的主界面。,7.1.1 基于对话框的应用程序,可以直接利用MFC AppWizard向导创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择Dialog Based项。此时,应用程序向导将出现与单文档和多文档程序向导不同的操作步骤,因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。 按照对话框应用程序向导提示的步骤进行操作就得到一个对
3、话框应用程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化工作方式。利用向导创建应用程序的框架后,程序员可根据程序具体功能要求添加代码。,例 编写一个对话框应用程序MyDialog,程序运行后显示一个对话框,并在对话框上显示文本串。,1执行File|New命令出现New对话框,选择MFC AppWizardexe项,输入程序名MyDialog,单击OK按钮。在随后出现的MFC AppWizard-Step 1对话框窗口中选择Dialog Based选项,单击Finish按钮就创建了应用程序项目,并在Developer Studio中打开了对话框编辑器和控件工具栏
4、。 2去掉对话框中标题为“TODO: 在这里设置对话控制”的静态文本控件,调整对话框大小,在成员函数CMyDialogDlg:OnPaint()中添加代码。,void CMyDialogDlg:OnPaint() . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSPARENT); dc.TextOut(20, 50, “这是一个对话框应用程序!“); CDialog:OnPaint(); ,7.1.2 对话框类CDialog,MFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序
5、中创建的对话框类一般都是CDialog类的派生类。CDialog类还是其它所有对话框类的基类,其派生关系如下所示: CObject CCmdTarget CWnd CDialog,对话框类为程序员提供了管理对话框的编程接口。 CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。在你的CDialog类的派生类中可以直接调用CDialog类的成员函数。大部分的成员函数是虚函数,可以在你的派生类中重载,以实现特定的目的。除了CDialog类成员函数,类CWnd和CWi
6、nApp也提供了一些成员函数用于对话框的管理。,有关对话框的常用处理函数 CDialog:CDialog() 通过调用派生类构造函数,根据对话框资源模板定义一个对话框。 CDialog:DoModal() 激活模态对话框,显示对话框窗口。 CDialog:Create() 根据对话框资源模板创建非模态对话框窗口。如果对话框不是Visible属性,还需通过调用CWnd:ShowWindow()函数显示非模态对话框窗口。 CDialog:OnOk() 单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。 CDialog:OnCancel() 单击Cancel按钮或按Esc键时调用该函数,不接
7、收对话框输入数据,关闭对话框。,CDialog:OnInitDialog() WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。 CDialog:EndDialog() 用于关闭模态对话框窗口。 CWnd:ShowWindow() 显示或隐藏对话框窗口 CWnd:DestroyWindow() 关闭并销毁非模态对话框 CWnd:UpdateData() 通过调用DoDataExchange()设置或获取对话框控件的数据 CWnd:DoDataExchange() 被UpdateData()
8、调用以实现对话框数据交换,不能直接调用。,CWnd:GetWindowText() 获取对话框窗口的标题 CWnd:SetWindowText() 修改对话框窗口的标题 CWnd:GetDlgItemText() 获取对话框中控件的文本内容 CWnd:SetDlgItemText() 设置对话框中控件的文本内容 CWnd:GetDlgItem() 获取控件或子窗口的指针 CWnd:MoveWindow() 用于移动对话框窗口 CWnd:EnableWindow() 使窗口处于禁用或可用状态,7.1.3 对话框数据交换DDX和验证DDV,在对话框中实现用户数据输入和输出的一般方法是通过Class
9、Wizard类向导将对话框控件与成员变量相关联,利用对话框数据交换DDX(Dialog Data Exchange)和验证DDV(Dialog Data Validation)机制实现数据的输入和输出。 当利用ClassWizard类向导添加成员变量时,用户如果在窗口的左下角输入数据的范围,ClassWizard将自动加入函数DDV的调用代码。,例如,当添加一个UINT型的成员变量m_nInput时指定它的最小值和最大值分别为0和100,则ClassWizard类向导将在成员函数DoDataExchange()中添加以下DDV函数的调用语句: DDV_MinMaxUInt(pDX, m_nIn
10、put, 0, 100); 程序运行后,如果用户的输入数据超出0100的范围,DDV将显示一个提示信息对话框(例7-2c),提示用户有效的输入范围。,UpdateData()的用法:,当调用UpdateData(TRUE)时,MFC通过调用DDX函数将数据从控件传递到关联的成员变量;当调用UpdateData(FALSE)时,MFC通过调用DDX函数将数据从成员变量传递到关联的的控件。利用UpdateData()函数实现了在刷新后重新获取成员变量。,注意: 表面上看程序并没有调用UpdateData(),但是,当程序调用CDialog:DoModal()创建并显示对话框时,将自动调用CDial
11、og:OnInitDialog()完成初始化的工作。在OnInitDialog()中调用了UpdateData(FALSE),将数据从成员变量传递到关联的控件,从而显示在控件中。而单击OK按钮将调用CDialog:OnOk()函数,在OnOK()中调用了UpdateData(TRUE),将数据从控件传递到关联的成员变量。 由此看来,不管MFC将DDX技术如何复杂化,我们只需知道,DDX就如同一条双向通道,而方向控制开关就是UpdateData()函数中的BOOL类型参数是TRUE还是FALSE。,7.1.4 提示信息对话框,提示信息对话框也称消息对话框,用来显示有关的提示信息。提示信息对话框是
12、一种最简单的对话框,不需要用户自己创建它就可以直接使用,Visual C+提供了相应的函数实现这样的功能。: int AfxMessageBox(LPCTSTR lpText, UINT nType=MB_OK, UINT nlDHelp=0); int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT nType); int CWnd:MessageBox(LPCTSTR lpText, LPCTSTR lpCaption=NULL, UINT nType=MB_OK);,这三个函数分别是MFC全局函数、API函数和C
13、Wnd类的成员函数,它们的功能基本相同,但适用范围有所不同。AfxMessageBox()和:MessageBox()可以在程序中任何地方使用,而CWnd:MessageBox()只能用于控件、对话框、窗口等一些窗口类中。,例如,在软件安装过程中为了弹出如下图所示的警告提示信息对话框并进行相应的处理:,编写的代码如下: int nChoice=MessageBox(“文件复制失败!“, “错误“, MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) case IDABORT: / 用户按下“终止“按钮 . . . . . . case
14、 IDRETRY: / 用户按下“重试“按钮 . . . . . . case IDIGNORE: / 用户按下“忽略“按钮 . . . . . . ,7.2 使用对话框,为了在屏幕上显示对话框: (1)首先需要建立对话框资源及其与资源相关的对话框类; (2)然后添加控件、与控件关联的成员变量和消息处理函数; (3)最后在程序中显示对话框并访问与控件关联的成员变量。 在Visual C+中可以利用集成工具如对话框编辑器和ClassWizard类向导很方便地创建对话框,不需要程序员手工编写太多的源代码。,7.2.1 一般对话框工作流程,当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框
15、对象,即一个能够在屏幕上显示的对话框。 声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。例如,假设定义了一个名为CMyDialog的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码: CMyDialog myDlg; myDlg.DoModal();,函数OnOK()、 OnCancel()与DoModal()的关系: 对话框中一般都有OK和Cancel按钮,单击OK按钮时调用CDialog:OnOK()函数,单击Cancel按钮时调用CDialog:OnCancel()函数。OnOK()函数和OnCancal()函数都将结束DoModal
16、()函数调用,但令DoModal()返回不同的值。OnOK()函数令DoModal()返回IDOK,OnCancel()函数令DoModal()返回IDCANCAL。用户可以根据DoModal()的返回值做出不同的选择。如: if (myDlg.DoModal() = = IDOK ) ,对话框的初始化可以在三个不同的阶段所调用的函数中进行: (1)对话框类构造函数; (2)WM_CREATE消息处理函数; (3)WM_INITDIALOG消息处理函数。 通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INIT- DIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal