第18章 对话框和控件_第1页
第18章 对话框和控件_第2页
第18章 对话框和控件_第3页
第18章 对话框和控件_第4页
第18章 对话框和控件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第18章

对话框和控件

控件是一种特殊的窗口,用来将信息传送绘用户或获取用户输入。大多数控件出现在对话框中,但是也可以在非对话框窗口中使用。理解对话框和控件了解Windows传统控件修改控件的行为CDialog类创建模式和无模式对话框对话框的数据交换与校验基于对话框的程序Windows通用对话框WindowsForms控件和对话框

18.1理解对话框和控件

在Windows程序中对话框的使用非常广泛,大多数重要的Windows程序都使用对话框来管理用户数据的输入。在对话框中出现的几乎所有对象都是控件。对话框实际上是一个窗口,而对话框中的每一个控件也都是某种专用的窗口。对话框主要分为两类:模式和无模式对话框。对于模式对话框,在该对话框被关闭前,用户将不能在同一应用程序的其他地方进行工作,如“打开”对话框就是一个模式对话框,而对于无模式的对话框,在它停留在屏幕上的同时,用户仍然可以在其他的地方进行工作,如“查找”对话框。

MFC将模式和无模式对话框的功能都封装在CDialog类中,在我们创建自己需要的对话框时都是以该类为基类。为了方便使用,MFC还提供了“Windows公用对话框”——“打开”对话框、“字体”对话框、“打印”对话框等。

18.2传统控件

由于控件属于特殊的窗口,所以MFC从CWnd基类中派生控件类。从CWnd中派生控件类的一大优点是,在很多情况下,不同控件的相同功能通过同一个成员函数访问。例如,SetWindowText()成员函数即可以设置按钮的标题,也可以设置编辑框内的文本。其他有用的CWnd函数还包括GetWindowText(),它可以从控件中检索文本;EnableWindow()函数可以使控件有效或无效;SetFont()函数可以修改控件的字体。

18.2.1CButton类

按钮分为4种类型:按钮、复选框、单选按钮以及分组框。控件作为一个特殊的窗口,它可以出现在用户界面的任何地方。通常,控件被放置在对话框中,由MFC处理打开控件窗口的繁琐工作。然而,也可以手工打开控件窗口。

首先,通过创建一个MFC控件类的实例(如CButton类的实例),然后通过调用该实例的Create()成员函数打开控件窗口。

18.2.2CListBox类

MFC的CListBox类封装了列表框控件,列表框用于提供列表信息并允许用户从列表中选择项目。当列表框中的项目被单击或双击时,列表框将向父窗口发送WM_COMMAND消息。标准的列表框在垂直列中显示文本字符串,只允许一次选择一个项目。当前选择的项目将用系统颜色加亮显示。Windows支持多种形式的列表框,包括多选列表框、多列列表框以及显示图形而不是文本的自制列表框。18.2.3CStatic类

CStatic是静态控件,它是MFC控件类中最简单的一种,它一般是不会给父窗口发送通知消息的。静态控件有三种类型:文本、矩形和图像。静态文本经常用来标记其他控件。

18.2.4CEdit类

MFC的CEdit类封装了编辑框的功能。编辑框控件用来进行文本输入和编辑,可分为两种类型:单行和多行。单行编辑框用来要求输入简短的文本字符串,例如姓名、密码和产品编号。多行编辑框则用于要求用对文本字符串进行编辑的情况下,例如Windows中的记事本程序,它的编辑框控件就是一个多行编辑控件。编辑框控件中只能输入60KB的文本。对于单行编辑框控件,这种限限并不突出,而对于多行编辑控件,这个限制就显得特别重要。如果需要处理大量的文本,就需要使用丰富编辑控件,它是通用控件库中标准编辑框控件的增强版本。

18.2.5CComboBox类组合框将单行编辑框和列表框组合为一体。组合框有三种类型:简单型、下拉型和下拉列表型。在这三种类型中,简单型组合框最小使用,其列表部分总会被显示。用户从列表中选中一个项目时,该项目会自动复制到编辑框部分。用户也可以直接在编辑框部分输入文本。如果用户输入的文本与列表中某项目匹配,该项目将被自动加亮显示并滚动到可见的地方。下拉型组合框与简单型组合框的不同之处在于它的列表只有被要求时才显示。下拉列表型组合框的工作方式与下拉型组合框相同,但它不允许在编辑部分输入文本,只允许用户在列表中选择项目。

18.2.6CScrollBar类

MFC的CScrollBar类类封装了滚动条控件。滚动条控件与窗口滚动条相似,窗口滚动条是通过在窗口样式中添加WS_VSCROLL和WS_HSCROLL样式创建的,滚动条控件则是通过创建CScrollBar类的对象,并调用其Create()函数创建的。窗口滚动条可以放置在整个窗口客户区的边框,其本质上是属于窗口边框的,而滚动条控件可以放置在窗口的任何地方,也可以设置任意高度和宽度。

18.3高级控件编辑

现在已经了解基本控件的编程函数,如控件的创建和放置,以及不同的控件消息的处理。在许多情况下,控件提供的常备特性就可以满足需要,而在某些情况下,可能需要修改控件的行为,或修改控件的外观。

18.3.1添加键盘接口

当一个对话框中包含多个控件时,可以使用Tab键使输入焦点在几个控件之间来回移动。这一个过程是由对话框负责,一个普通的窗口则设有这一特性。这意味着我们需要编写代码实现输入焦点在控件之间移动。全局函数::IsDialogMessage()用于检查键盘消息并将其转化为相应对话框的选定命令,如按Tab键选中下一个控件或控件组,按向下箭头键选中控件组中下一个控件。为了使::IsDialogMessage()函数能够奏效,需要在MFC转换消息之前调用它。在Windows应用程序中,当一个窗口接收到消息时,在消息循环中将调用TranslateMessage()函数转换键盘消息,然后调用DispatchMessage()把消息发送到适当的控件或子窗口。

18.3.2修改控件行为

使用MFC控件类进行编程有一个优点,可以通过从MFC控件类中派生自己的控件类,从而修改控件的某些行为。例如,创建一个只接收数字输入的编辑控件。普通的编辑控件类可以接收字符、数字以及标点符号。而派生的数字编辑控件只接收数字和连接字符。

18.4对话框

创建对话框一般需要3步:(1)创建对话框模板资源,并在其中添加控件。(2)创建一个从CDialog类派生的自定义对话框类,然后加载该对话框模板资源。(3)创建自定义对话框类的一个对象,并调用CDialog::DoModal()函数显示对话框。对于简单的对话框,有时可以直接创建CDialog类的对象。然而,更常见的方法是从CDialog类派生一个自己的对话框类,这样可以规定它的行为。

18.4.1对话框模板

创建对话框的第一步就是创建对话框的模板资源,模板定义了对话框的基本属性,以及对话框中包含的控件。对话框模板是由应用程序资源(RC)文件中的语句编译过来的,这些资源可以由手工编写,但现在主要使用VisualC++提供的可视化对话框资源编辑器来写入RC文件。

8.4.2CDialog类

创建模式对话框的第2步是从CDialog派生一个类,并用它来定义对话框的行为。Cdialog包含3个关键函数:OnInitDialog()、OnOk()和OnCancel(),通过在派生类中重写这3个函数,可以以修改对话框的默认行为。在对话框创建时,它和其他窗口一样会接收到WM_CREATE消息。但是当WM_CREATE消息到来时,如果对话框模板中指定的控件还没有创建,则控件将无法初始化,这时的对话框实际上是空的。Windows用来处理对话框消息的内部窗口程序会响应WM_CREATE消息,创建对话框控件。创建控件后,对话框会接收到WM_INITDIALOG消息,响应该消息就可以对对话框和控件进行初始化。

18.4.3创建模式对话框

在Addressbook程序中,添加一个顶层菜单项“通信录”,并添加子菜单项“添加联系人”,其ID属性为:ID_ADD_CONTACT,在该菜单的命令响应函数中创建模式对话框添加联系人。创建模式对话框很简单,只需要在CDialog派生类中构造一个对象,并调用该对象的成员函数DoModal()即可。DoModal()函数会直到对话框被关闭时才返回,应用程序应该检测该函数的返回值,如果返回值为IDOK,而说明用户单击“确定”按钮关闭对话框。如果返回值不是IDOK(如IDCANCEL),则应忽略输入对话框中的信息。

18.4.4创建无模式对话框

MFC将模式和无模式对话框封装在同一个类中,创建无模式对话框与模式对话框略有不同。两者之间的主要区别在于:模式对话框的显示需要调用CDialog::DoModal()函数,而无模式对话框则需要调用CDialog::Create()函数。DoModal()函数要等待到对话框被销毁后才返回,而Create()函数在创建对话框后立即返回,也就是说,Create()函数返回时对话框还处于显示状态。无模式对话框的关闭要调用DestroyWindow(),而不是EndDialog()函数。不能对无模式对话框调用OnOk()或OnCancel()函数,这两个函数都会调用EndDialog()函数。模式对话框通常是在栈上创建,当超过其对象作用域后会自动释放;而无模式对话框需要使用new运算符在自由堆上创建,所以该对话框对象还需要手动删除。如果要确保清除对话框时删除无模式对话框对象,一种方法是在派生的对话框类中重写CDialog::PostNcDestroy()函数,在其中删除对话框对象。

18.4.5对话框数据交换与校验

创建了对话框模板,以及基于CDialog的派生类后,下一步就是了解如何从对话框中获取数据,传递给应用程序。反之,在对话框中显示应用程序的数据。18.4.6与对话框控件的交互

有时在程序中不仅需要获取对话框控件中的数值,还需要修改控件的行为。例如,如果想在OnInitDialog()中向组合框添加字符串,这就需要获取指向组合框的CComboBox指针。通过调用CWnd::GetDlgItem()函数可以得到一个指向对话框中任意控件的指针。

18.5基于对话框的程序

如果应用程序的主要用户界面是对话框式的控件的集合,那么可以考虑用对话框作为主空口。在MFC应用程序向导的帮助下,编写基于对话框的应用程序非常容易。在MFC应用程序向导中,选择应用程序类型为“基于对话框”,这样向导将创建一个基于对话框的应用程序,基于对话框的应用程序其主窗口是一个对话框。向导会自动创建对话框资源,并从CDialog派生出对话框类。它还提供了特别的InitInstance(),使对话框类实例化,并在应用程序启动时调用该类的DoModal()函数将对话框显示在屏幕上。我们所要做的就是在资源编辑器中向对话框添加控件,并编写消息处理程序响应控件事件。而其他一切事情则由向导生成的代码完成。

18.5.1计算器程序分析

在创建计算器程序前,首先对计算器程序的运行进行分析。在Calculator应用程序中,用户通过对话框CCalculatorDlg中的按钮输入数值,随后由MyCalculator类负责计算。这样设计有一个优点,CCalculatorDlg类只负责显示和输入用户数值,而具体的运算则由MyCalculator类完成,从则实现了显示与处理的分离,这样对任一个类的修改不会影响到整个程序。右图使用UML的顺序图描述了用户、CCalculatorDlg和MyCalculator类对象之间的交互。

18.5.2设计MyCalculator类

在完成对系统的总体设计后,首先我们设计计算器类MyCalculator。由于用户可能输入整数或浮点数,为了简化起见,在MyCalculator类全部使用浮点数double类型表示。

18.5.3设计对话框类CCalculatorDlg

首先按上图所示向对话框模板中添加控件,并为编辑框添加关联的变量:CStringm_strDisplay;在构造函数中修改其初始值:CCalculatorDlg::CCalculatorDlg(CWnd*pParent/*=NULL*/) :CDialog(CCalculatorDlg::IDD,pParent) ,m_strDisplay(_T("0.")){ m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}

然后,再分别添加按钮执行代码,以及执行计算的核心代码,具体代码可查阅图书第18章内容。

18.6通用对话框

在应用程序设计中,除使用自定义的对话框外,经常还会用到系统定义的通用对话框。通用对话框类用于各种Windows常用应用程序中,执行各种标准操作。它们也是由CDialog类派生而来,表18-14中列出通用对话框类的名称及其作用。

18.6.1文件对话框类

CFileDialog文件对话框的使用方法很简单,首先构造一个CFileDialog对象,然后调用DoModal()函数显示对话框。CFileDialog构造函数的原型如下:CFileDialog::CFileDialog(BOOLbOpenFileDialog,LPCTSTRlpszDefExt=NULL,LPCTSTRlpszFileName=NULL,DWORDdwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,LPCTSTRlpszFilter=NULL,CWnd*pParentWnd=NULL);各参数的意义如下:bOpenFileDialog为TRUE则显示一个打开文件对话框,为FALSE则显示一个保存文件对话框。lpszDefExt指定默认的文件扩展名。lpszFileName指定默认的文件名。dwFlags指明一些特定风格。lpszFilter指定有来限制选择某些文件类型的过滤器。pParentWnd为父窗口指针。

18.6.2字体对话框类

字体对话框类CFontDialog的使用方法与CFileDialog对话框类相同,首先构造CFontDialog类对象,然调用调用DoModal()函数显示。CFontDialog类的构造函数如下:CFontDialog(LPLOGFONTlplfInitial=NULL,DWORDdwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);构造一个对象,其中参数lplfInitial指向一个LOGFONG结构,如果该参数设置为NULL表示不设置初始字体。pdcPrinter指向一个代表打印机设备环境的DC对象,若设置该参数则选择的字体为打印机所用。pParentWnd用于指定父窗口。

18.6.3颜色对话框类

颜色对话框类CColorDialog的使用方法与CFontDialog相同。CcolorDialog类的构造函数如下:CColorDialog(COLORREFclrInit=0,DWORDdwFlags=0,CWnd*pParentWnd=NULL)其中,参数clrInit指定初始颜色。在对话框返回后调用COLORREFCColorDialog::GetColor()可以获得用户选择的颜色值。

18.6.4打印对话框类

打印对话框类CPrintDialog提供了对打印机接口界面的支持,用户可以使用打印对话框进行打印。CPrintDialog构造函数如下:CPrintDialog(BOOLbPrintSetupOnly,DWORDdwFlags=PD_ALLPAGES|PD_USEDEVMODECOPIES|PD_NOPAGENUMS|PD_HIDEPRINTTOFILE|PD_NOSELECTION,CWnd*pParentWnd=NULL);其中,参数bPrintSetupOnly为TRUE,表示创建“打印设置”对话框;为FALSE,表示创建“打印”对话框。dwFlags参数为自定义对话框的一组标记。pParentWnd标识“打印”对话框的父窗口指针。

18.7WindowsForms窗体

在WindowsForms应用程序中,窗体类Form是用户交互的基础载体。从前介绍可知,WindowsForms程序的主窗体都是从Form类派生的,该类提供了窗口的基本功能。基类Form提供了两个关于显示窗体的函数:Show()和ShowDialog()。调用窗体对象的Show()函数显示窗体时,其等效于将Visible属性设置为True。在调用Show()函数后,只要不调用Hide()函数,Visible属性一直为True。与Show()函数类似,窗体类Form的ShowDialog()函数也可以显示窗体。但是,Show()函数显示的窗体为无模式对话框,当Show()函数显示的窗体在单击关闭时,窗体就会在内存中被注销掉。

18.8WindowsForms控件

因为在开发WindowsForms应用程序时,主要的工作就是通过“工具箱”选择控件,并将它们放在窗体上,然后设置控件的属性,双击某个控件为其添加事件处理程序。所以VisualC++2008在“工具箱”中提供了许多控件,这里只介绍最常用到的几个控件。

18.8.1控件类

.NET框架在System::Windows::Forms命名空间中包含一些类,这些类封装了控件的行为。用户界面元素,例如控钮、列表框、复选框等,都可以由一个控件类来表示,所有的这些类都是从一个基类Control继承而来。右图说明控件类的继承关系。

18.8.2Button控件

Button控件表现为Windows窗体中的按钮,用户可以通过单击该按钮,就可以执行某项任务。.NETFramework提供了一个派生于Control控件的类ButtonBase,它实现了按钮控件所需要的基本功能,所以开发人员可以从这个类中派生自己的按钮类,以创建定制的按钮控件。.NETFramework从ButtonBase类派生了三个控件Button、CheckBox和RadioButton。本节主要讨论Button控件(标准按钮)。

18.8.3RadioButton和CheckBox控件

传统上,RadioButton显示单选择钮。当用户选择一个组内的一个单选按钮时,其他的单选按钮将自动清除选中状态。给定容器(如Form)中的所有RadioButton控件构成一个组。若要在一个窗体上创建多个组,可以先在窗体中添加分组容器,如GroupBox或Panel控件,然后再将单选按钮添加到各分组容器中。

18.8.4GroupBox控件

GroupBox控件常用于逻辑地组合一组控件,例如RadioButton及CheckBox控件,显示一个框架,并在其上显示一个标题。组框的用法非常简单,只需要将它拖放在窗体上,然后再把所需的控件拖放到组框中即可。其结果被添加控件的父控件是分组框,而不是窗体这里需要理解父控件和子控件的关系。将一个控件放在窗体上时,窗体就会成为该控件的父控件,与之相对应,控件就是窗体的一个子控件。当将一个GroupBox放在窗体上时它这就成为窗体的一个子控件。而组框本身也可以包含控件,它也就成为这些控件的父控件,这样在移动GroupBox时,其中的所有子控件也会随之移动。

18.8.5Label和LinkLabel控件

Label控件的主要用途就是在窗体中显

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论