您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 第8章对话框和控件.
第八章对话框和控件对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。本章主要介绍对话框的工作原理和编程方法,并通过实例学习一些标准控件和公共控件的使用方法。8.1对话框概述对话框的主要功能是用于接收用户的输入数据。在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框。当然,对话框也可以作为一个程序的主界面。8.1.1基于对话框的应用程序可以直接利用MFCAppWizard向导创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择DialogBased项。此时,应用程序向导将出现与单文档和多文档程序向导不同的操作步骤,因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化工作方式。示例:demo8_18.1.2对话框类CDialogMFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是CDialog类的派生类。CDialog类还是其它所有对话框类的基类,其派生关系如下所示:CObjectCCmdTargetCWndCDialog对话框类为程序员提供了管理对话框的编程接口。CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。在CDialog类的派生类中可以直接调用CDialog类的成员函数。大部分的成员函数是虚函数,可以在派生类中重载,以实现特定的目的。除了CDialog类成员函数,类CWnd和CWinApp也提供了一些成员函数用于对话框的管理。对话框的常用处理函数CDialog::CDialog(),通过调用派生类构造函数,根据对话框资源模板定义一个对话框。CDialog::DoModal(),激活模态对话框,显示对话框窗口。CDialog::Create(),根据对话框资源模板创建非模态对话框窗口。CDialog::OnOk(),单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。CDialog::OnCancel(),单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,直接关闭对话框。CDialog::OnInitDialog(),WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。CDialog::EndDialog(),用于关闭模态对话框窗口。CWnd::ShowWindow(),显示或隐藏对话框窗口。CWnd::DestroyWindow(),关闭并销毁非模态对话框。CWnd::UpdateData(),通过调用DoDataExchange()设置或获取对话框控件的数据。CWnd::DoDataExchange(),被UpdateData()调用以实现对话框数据交换,不能直接调用。CWnd::GetWindowText(),获取对话框窗口的标题。CWnd::SetWindowText(),修改对话框窗口的标题。CWnd::GetDlgItemText(),获取对话框中控件的文本内容。CWnd::SetDlgItemText(),设置对话框中控件的文本内容。CWnd::GetDlgItem(),获取控件或子窗口的指针。CWnd::MoveWindow(),用于移动对话框窗口。CWnd::EnableWindow(),使窗口处于禁用或可用状态。8.1.3对话框数据交换DDX和验证DDV在对话框中实现用户数据输入和输出的一般方法是通过“添加变量”向导将对话框控件与成员变量相关联,利用对话框数据交换DDX(DialogDataExchange)和验证DDV(DialogDataValidation)机制实现数据的输入和输出。当利用向导添加成员变量时,用户如果输入了数据的范围,则向导将自动加入函数DDV的调用代码。示例:demo8_2UpdateData()的用法当调用UpdateData(TRUE)时,MFC通过调用DDX函数将数据从控件传递到关联的成员变量;当调用UpdateData(FALSE)时,MFC通过调用DDX函数将数据从成员变量传递到关联的控件。对话框程序确定取消请输入数据:成员变量对话框对象UpdateData(FALSE)UpdateData(TRUE)更新后重新获取成员变量初始化成员变量8.1.4提示信息对话框提示信息对话框也称消息对话框,用来显示有关的提示信息。提示信息对话框是一种最简单的对话框,不需要用户自己创建它就可以直接使用。VisualC++提供了相应的函数实现这样的功能。intAfxMessageBox(LPCTSTRlpText,UINTnType=MB_OK,UINTnIDHelp=0);IntMessageBox(HWNDhWnd,LPCTSTRlpText,LPCTSTRlpCaption,UINTnType);IntCWnd::MessageBox(LPCTSTRlpText,LPCTSTRlpCaption=NULL,UINTnType=MB_OK);这三个函数分别是MFC全局函数、API函数和CWnd类的成员函数,他们的功能基本相同,但适用范围有所不同。AfxMessageBox()和::MessageBox()可以在程序中任何地方使用,而CWnd::MessageBox()只能用于控件、对话框、窗口等一些窗口类中。示例:demo8_38.2使用对话框为了在屏幕上显示对话框,要进行以下步骤:1.建立对话框资源及其与资源相关的对话框类;2.添加控件、与控件关联的成员变量和消息处理函数;3.在程序中显示对话框并访问与控件关联的成员变量;8.2.1一般对话框工作流程当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。对话框中一般都有OK和Cancel按钮,单击OK按钮时调用CDialog::OnOK()函数,单击Cancel按钮时调用CDialog::OnCancel()函数。OnOK()函数和OnCancel()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值。对话框的初始化可以在三个不同的阶段所调用的函数中进行:对话框类构造函数WM_CREATE消息处理函数WM_INITDIALOG消息处理函数通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INITDIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。对话框初始化8.2.2创建对话框在Windows中对话框是作为一种资源被使用,在程序中要创建一个对话框,首先要创建一个对话框模板资源,然后创建一个基于该对话框模板资源的对话框类。对话框模板资源指定了对话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性,而对话框类规定了对话框和对话框中每个控件的行为。通过对话框模板资源才能创建对话框类和对象。示例:demo8_48.2.3添加控件如果没有控件,对话框完成不了什么具体功能,对话框与控件有着密不可分的关系。结合对话框编辑器,利用Controls控件工具栏可给当前正在编辑的对话框模板资源添加控件。控件工具栏上的每一个图标都代表了一种控件,如果不能确定控件的类型,只要将光标在该控件图标上停留片刻,就会显示该控件类型的提示。8.2.4关联成员变量给一个控件添加成员变量在之前已有说明,这里主要讲解添加成员变量的种类(Category):Value和Control。如果选择了Value项,表示要为该控件的某项属性定义一个变量,这意味着程序关心的是控件中的值,而不是控件对象本身。这时,还可以为变量选择不同的类型(Type),可以选择一般的C++数据类型(int、float、long等)或VisualC++自定义的数据类型(UINT、CString等)。如果选择了Control项,则表示定义的变量代表控件对象本身,Control类别的变量实质是一个控件对象,其类型是MFC控件类。可以为一个控件同时定义一个Control和一个Value类别的变量。8.2.5非模态对话框模态对话框在关闭之前,不允许用户切换到程序的其它窗口。因为当弹出模态对话框时,它就获得了程序的控制权。并且,模态对话框拥有自己的消息循环,因此其窗口中所有产生的消息都不会送到主窗口的消息循环。非模态对话框弹出后,用户不需要关闭它就可以在非模态对话框和应用程序其它窗口之间进行切换。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。对于非模态对话框,使用对话框编辑器创建对话框资源和使用ClassWizard类向导添加对话框类、成员变量和消息处理函数的方法与模态对话框一样,但创建和退出对话框的方式有所不同。创建模态对话框时是由系统自动分配内存空间,因此在退出对话框时,系统自动调用CDialog::EndDialog()函数来删除对话框。而创建非模态对话框则需要用户来分配内存,退出时还需用户自己删除非模态对话框。创建非模态对话框非模态对话框的实例应声明为全局变量或成员变量,不能像模态对话框那样作为局部变量。一般用new操作符生成,使用结束时用delete操作符将其删除。区别于模态对话框,非模态对话框用new生成对象后,不是调用CDialog::DoModal()函数,而是调用CDialog::Create()函数装入对话框资源,并创建和显示对话框。Create()函数在显示非模态对话框后就立即返回,而DoModal()函数是在模态对话框被关闭之后才返回。并且,由于Create()函数不会启动新的消息循环,非模态对话框与应用程序共用一个消息循环。这样,非模态对话框就不会垄断用户的输入。示例:demo8_58.2.6公用对话框Windows将一些常用的对话框集成到操作系统中,作为Windows公用对话框库Commdlg.dll的一部分。用户在程序中可以直接使用这些公用对话框,不必再创建对话框资源和对话框类,减少了大量的编程工作。并且,用户还可以定制公用对话框的外观和性能。为了在MFC应用程序中使用公用对话框,MFC提供了封装这些公用对话框的类。这些公用对话框类都是从CCommonDialog类派生而来,而CCommonDialog类又是CDialog类的派生类。MFC公用对话框类说明CColorDialog颜色设定对话框,选择不同的颜色CFileDialog文件存取对话框,打开或保存文件CFindReplaceDialog查找和替换对话框,查找和替换文本串CFontDialog字体设定对话框,选择不同的字体CPageSetupDialog页面设置对话框,设置页码、页眉等CPrintDialog标准的打印对话框,用于打印和打印设置COleDialog该类及其派生类用于生成OLE对话框示例:demo8_68.3标准控件Windows提供的控件分为两类:标准
本文标题:第8章对话框和控件.
链接地址:https://www.777doc.com/doc-2112687 .html