第七章 对话框和控件

43
面面面面面面面面 第第第 第第第第第第 第第第 第第第第第第

Upload: jerry

Post on 14-Jan-2016

84 views

Category:

Documents


5 download

DESCRIPTION

第七章 对话框和控件. 面向对象程序设计. 本章主要内容 1. 对话框的工作原理和编程方法 2. 标准控件和公共控件的使用方法。. 对话框 : 是 Windows 应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。 控件 : 是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。. 对话框概述. 对话框的作用 :一个主要功能是用于接收用户的输入数据,还可用来显示提示信息 ( 如程序启动时显示版权和运行进度信息 ) 。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第七章 对话框和控件

面向对象程序设计第七章 对话框和控第七章 对话框和控

件件

Page 2: 第七章 对话框和控件

本章主要内容本章主要内容

1. 对话框的工作原理和编程方法

2. 标准控件和公共控件的使用方法。

Page 3: 第七章 对话框和控件

对话框 : 是 Windows 应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。

控件 : 是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。

Page 4: 第七章 对话框和控件

对话框概述对话框概述► 对话框的作用:一个主要功能是用于接收用户的输

入数据,还可用来显示提示信息 ( 如程序启动时显示版权和运行进度信息 ) 。

► 在 MFC 中,对话框的功能被封装在 CDialog 类中,而 CDialog 类是 CWnd 类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。

► 对话框的典型应用:通过菜单命令或工具栏按钮打开一个对话框,当然,对话框也可以作为一个程序的主界面。

Page 5: 第七章 对话框和控件

基于对话框的应用程序基于对话框的应用程序► 可以直接利用 MFC AppWizard 向导创建一个基于

对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择 Dialog Based 项。因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。

► 按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化工作方式。利用向导创建应用程序的框架后,程序员可根据程序具体功能要求添加代码。

Page 6: 第七章 对话框和控件

例 编写一个对话框应用程序 MyDialog ,程序运行后显示一个对话框,并在对话框上显示文本串。

方案 1 :利用 OnPaint() 和 TextOut() 实现

方案 2 :利用添加控件(如 label ),修改控件的 caption 属性

注意:了解 CDialog 的属性设置

Page 7: 第七章 对话框和控件

对话框类对话框类 CDialogCDialog

► MFC 提供了一系列对话框类,并实现了对话框消息响应和处理机制。

► CDialog 类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是 CDialog 类的派生类。

► CDialog 类还是其它所有对话框类的基类,其派生关系如下所示:

CObject

CCmdTarget

CWnd

CDialog

Page 8: 第七章 对话框和控件

►对话框类为程序员提供了管理对话框的编程接口。►CDialog 类从 CWnd 类派生而来,所以它继承了 C

Wnd 类的成员函数,具有 CWnd 类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。►在 CDialog 类的派生类中可以直接调用 CDialog 类的成员函数。大部分的成员函数是虚函数,可以在你的派生类中重载,以实现特定的目的。►除了 CDialog 类成员函数,类 CWnd 和 CWinApp

也提供了一些成员函数用于对话框的管理。

Page 9: 第七章 对话框和控件

有关对话框的常用处理函数CDialog::CDialog()

通过调用派生类构造函数,根据对话框资源模板定义一个对话框。

CDialog::DoModal()

激活模态对话框,显示对话框窗口。

CDialog::Create()

根据对话框资源模板创建非模态对话框窗口。如果对话框不是 Visible 属性,还需通过调用 CWnd::ShowWindow() 函数显示非模态对话框窗口。

Page 10: 第七章 对话框和控件

CDialog::OnOk()

单击 OK 按钮时调用该函数,接收对话框输入数据,关闭对话框。CDialog::OnCancel()

单击 Cancel 按钮或按 Esc 键时调用该函数,不接收对话框输入数据,关闭对话框。CDialog::OnInitDialog()

WM_INITDIALOG 消息处理函数,在调用 DoModal 或 Create 函数时系统发送 WM_INITDIALOG 消息,在显示对话框前调用该函数进行初始化。CDialog::EndDialog()

用于关闭模态对话框窗口。

Page 11: 第七章 对话框和控件

CWnd::ShowWindow()

显示或隐藏对话框窗口CWnd::DestroyWindow()

关闭并销毁非模态对话框CWnd::UpdateData()

通过调用 DoDataExchange() 设置或获取对话框控件的数据CWnd::DoDataExchange()

被 UpdateData() 调用以实现对话框数据交换,不不能直接调用能直接调用。

Page 12: 第七章 对话框和控件

CWnd::GetWindowText() 获取对话框窗口的标题CWnd::SetWindowText() 修改对话框窗口的标题CWnd::GetDlgItemText() 获取对话框中控件的文本内容CWnd::SetDlgItemText() 设置对话框中控件的文本内容CWnd::GetDlgItem() 获取控件或子窗口的指针CWnd::MoveWindow() 用于移动对话框窗口CWnd::EnableWindow() 使窗口处于禁用或可用状态

Page 13: 第七章 对话框和控件

对话框数据交换对话框数据交换 DDXDDX 和验证和验证 DDVDDV

► 在对话框中实现用户数据输入和输出的一般方法是通过 Class

Wizard 类向导将对话框控件与成员变量相关联,利用对话框数据交换 DDX ( Dialog Data Exchange )和验证DDV ( Dia

log Data Validation )机制实现数据的输入和输出。 DDXDDX 是将成员变量与对话框控件相连接,完成数据在成员变量与控

件之间的交换。 DDVDDV 用于数据的校验,它能自动校验输入的数据是否符合设计要求。

► 对话框数据交换与验证都是通过 DoDataExchange()完成。

Page 14: 第七章 对话框和控件

当利用 ClassWizard 类向导添加成员变量时,用户如果在窗口的左下角输入数据的范围, ClassWizard将自动加入函数 DDV 的调用代码。

例如,当添加一个 UINT 型的成员变量 m_nInput 时指定它的最小值和最大值分别为 0 和 100 ,则 ClassWizard 类向导将在成员函数 DoDataExchange() 中添加以下DDV 函数的调用语句:

DDV_MinMaxUInt(pDX, m_nInput, 0, 100);

程序运行后,如果用户的输入数据超出 0~100 的范围,DDV将显示一个提示信息对话框,提示用户有效的输入范围。

Page 15: 第七章 对话框和控件

UpdateData() 的用法

►当调用 UpdateData(TRUE) 时, MFC 通过调用DDX 函数将数据从控件传递到关联的成员变量;►当调用 UpdateData(FALSE) 时, MFC 通过调用 DDX 函数将数据从成员变量传递到关联的的控件。►利用 UpdateData() 函数实现了在刷新后重新获取成员变量。

Page 16: 第七章 对话框和控件

对话框中的对话框中的成员变量成员变量

UpdateData(TRUE)

UpdateData(FALSE)

初始化成员变量

更新后重新获取成员变量

Page 17: 第七章 对话框和控件

注 意注 意►当程序调用 CDialog::DoModal() 创建并显示对话框时,将自动调用 CDialog::OnInitDialog()完成初始化的工作。在函数 OnInitDialog() 中,程序会自动调用 UpdateData(FALSE) ,将数据从成员变量传递到关联的控件,从而显示在控件中。►单击 OK 按钮将调用 CDialog::OnOk() 函数,在 OnOK() 中程序会自动调用 UpdateData(TRUE) ,将数据从控件传递到关联的成员变量。►DDX 就如同一条双向通道,而方向控制开关就是 UpdateData() 函数中的 BOOL 类型参数是 TRUE 还是 FALSE 。

Page 18: 第七章 对话框和控件

提示信息对话框提示信息对话框

►提示信息对话框也称消息对话框,用来显示有关的提示信息。►提示信息对话框是一种最简单的对话框,不需要用户自己创建它就可以直接使用, Visual C++ 提供了相应的函数实现这样的功能。

Page 19: 第七章 对话框和控件

►MFC全局函数:int AfxMessageBox(LPCTSTR lpText,

UINT nType=MB_OK, UINT nlDHelp=0);

►API 函数:int MessageBox(HWND hWnd, LPCTSTR lpText,

LPCTSTR lpCaption, UINT nType);

►CWnd 类的成员函数:int CWnd::MessageBox(LPCTSTR lpText,

LPCTSTR lpCaption=NULL, UINT nType=MB_OK);

►注意:注意:它们的功能基本相同,但适用范围有所不同: AfxMessageBox() 和 MessageBox() 可以在程序中任何地方使用,而 CWnd::MessageBox()只能用于控件、对话框、窗口等一些窗口类中。

Page 20: 第七章 对话框和控件

例如,在软件安装过程中为了弹出如下图所示的警告提示信息对话框并进行相应的处理:

Page 21: 第七章 对话框和控件

编写的代码如下: int nChoice=MessageBox(" 文件复制失败! ", "错误 ",

MB_ICONWARNING | MB_ABORTRETRYIGNORE );

switch(nChoice)

{

case IDABORT: // 用户按下 "终止 " 按钮. . . . . . // 处理功能

case IDRETRY: // 用户按下 " 重试 " 按钮. . . . . . // 处理功能

case IDIGNORE: // 用户按下 "忽略 " 按钮. . . . . . // 处理功能

}

Page 22: 第七章 对话框和控件

使用对话框使用对话框 为了在屏幕上显示对话框: ( 1 )首先需要建立对话框资源及其与资源相关的对话框类; ( 2 )然后添加控件、与控件关联的成员变量和消息处理函数; ( 3 )最后在程序中显示对话框并访问与控件关联的成员变量。 在 Visual C++ 中可以利用集成工具如对话框编辑器和 ClassWizard 类向导很方便地创建对话框,不需要程序员手工编写太多的源代码。

Page 23: 第七章 对话框和控件

► 模态对话框:在关闭之前,用户将无法在同一个应用程序(准确地说,是在同一用户接口线程里 )的其他地方进行工作。比如 ,OpenFile对话框。

► 非模态对话框:在它仍保留在屏幕上的同时,用户还可以在应用程序的其他窗口进行工作。常用的 Find查找和 Replace替换对话框就是非模态对话框。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。

模态对话框与非模态对话框 模态对话框与非模态对话框

Page 24: 第七章 对话框和控件

模态对话框工作流程模态对话框工作流程 ► 定义对话框类;► 利用对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框;

► 通过对话框对象调用对话框类的成员函数 DoModal() 建立对话框窗口并显示对话框。例如,假设定义了一个名为 CMyDialog 的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码:

CMyDialog myDlg;

myDlg.DoModal();

Page 25: 第七章 对话框和控件

OnOK()OnOK() 、、 OnCancel()OnCancel() 与与 DoModal()DoModal() 的关系:的关系:►对话框中一般都有 OK 和 Cancel 按钮,单击 OK 按钮时调用 CDialog::OnOK() 函数,单击 Cancel 按钮时调用 CDialog::OnCancel() 函数。►OnOK() 函数和 OnCancal() 函数都将结束 DoModal()函数调用,但令 DoModal()返回不同的值,用户可以根据 DoModal() 的返回值做出不同的选择。

OnOK() 函数令 DoModal()返回 IDOK; OnCancel() 函数令 DoModal()返回 IDCANCAL 。

►例如: if (myDlg.DoModal() = = IDOK ) { …… }

Page 26: 第七章 对话框和控件

可以在三个不同阶段所调用的函数中进行: ( 1 )对话框类构造函数; ( 2 ) WM_CREATE 消息处理函数; ( 3 ) WM_INITDIALOG 消息处理函数。►注意:对话框的初始化通常是在消息 WM_INITDIALOG 的消息处理函数 OnInitDialog() 中进行。在收到 WM_INIT- DIALO

G 消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。►函数 OnInitDialog()将被成员函数 DoModal() 调用。

对话框的初始化对话框的初始化

Page 27: 第七章 对话框和控件

创建一般的模态对话框的基本步骤创建一般的模态对话框的基本步骤►用对话框编辑器创建包含各种控件的对话框资源,指定对话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性。对话框编辑器会对工程的资源文件进行更新,使之包含新的对话框资源,并且该工程的 resource.h 也会被更新。►用 ClassWizard 创建 CDialog 类的派生类,并将它与第一步创建的资源文件相连接。 ClassWizard会自动在工程中加入相应的代码和头文件。►利用 ClassWizard 向对话框类添加数据成员、交换函数和确认函数。►利用 ClassWizard 对对话框中的按钮好其他可以产生事件的控件加入相应的消息处理函数。►对一些特殊的控件初始化函数以及消息控制函数进行编辑。►对视图代码进行编辑,以激活对话框。

Page 28: 第七章 对话框和控件

例 通过对话框输入一个圆的半径,根据输入值在屏幕上画圆。

方案 1 :建一个 SDI 类型的项目,利用菜单打开一个对话框,获得输入的半径后在视图里重画。(见课本例子)

方案 2 :直接用对话框输入数据和显示图形

在程序中使用创建的模态对话框在程序中使用创建的模态对话框

Page 29: 第七章 对话框和控件

添加控件添加控件

►结合对话框编辑器,利用 Controls 控件工具栏可给当前正在编辑的对话框模板资源添加控件。

►若 Visual C++ 窗口中没有出现 Controls 工具栏,只需将光标指向菜单栏并单击鼠标右键,从弹出式菜单中选择 Controls 项。

► 控件工具栏上的每一个图标都代表了一种控件,如果不能确定控件的类型,只要将光标在该控件图标上停留片刻,就会显示该控件类型的提示。

Page 30: 第七章 对话框和控件

向对话框添加控件时,先在 Controls 工具栏单击要添加的控件,再将光标指向对话框空白区域并单击鼠标。

Page 31: 第七章 对话框和控件

添加与控件关联的成员变量添加与控件关联的成员变量►在生成自己的对话框类并添加需要的控件后,可以利用 ClassWizard 类向导在对话框类的定义中为对话框资源上的每一个控件添加一个或多个对应的成员变量。►ClassWizard 类向导的 Member Variables 页面主要用来为对话框类添加和删除与对话框控件关联的成员变量,我们在编写对话框程序时经常同该页面打交道。

Page 32: 第七章 对话框和控件
Page 33: 第七章 对话框和控件

► Class name 下拉框:选择要添加成员变量的对话 框类;

► Add Variable 按钮:添加与控件关联的成员变量;► Delete Variable 按钮:删除控件的某个成员变量。► Control IDs 栏:列出对话框资源上已有的控件,

第 1 列 Control IDs表示控件的 ID ,第 2 列 Type

表示变量的类型,第 3 列 Member表示成员变量名。

Member VariablesMember Variables 页面:页面:

Page 34: 第七章 对话框和控件

Add Member VariableAdd Member Variable 对话框对话框

输入成员输入成员变量名变量名

选择成员变选择成员变量的类型量的类型

选择成员变量的类选择成员变量的类别,可为别,可为 ::ControlControl或或 ValueValue

Page 35: 第七章 对话框和控件

► 选择 Value 项:表示要为该控件的某项属性定义一个变量,这意味着程序关心的是控件中的值,而不是控件对象本身。可以通过 Variable type 下拉框为变量选择不同的类型。

► 选择 Control 项:表示定义的变量代表控件对象本身, Control 类别的变量实质是一个控件对象,其类型是 MFC 控件类。可以通过添加的控件对象访问控件类的成员变量和调用控件类的成员函数,实现对控件行为的控制和管理。

► 可以为一个控件同时定义一个 Control 类别的变量和一个 Value 类别的变量。这些变量都是作为对话框派生类的成员变量,为了在程序其它地方能够直接访问添加的成员变量,它们都被声明为 public 属性。

CategoryCategory 下拉框下拉框

Page 36: 第七章 对话框和控件

► 对于非模态对话框,使用对话框编辑器创建对话框资源和使用 ClassWizard 类向导添加对话框类、成员变量和消息处理函数的方法与模态对话框一样,但创建和退出对话框的方式有所不同。

► 创建模态对话框时是由系统自动分配内存空间,因此在退出对话框时,系统自动调用 CDialog::E

ndDialog() 函数来删除对话框。而创建非模态对话框则需要用户来分配内存,退出时还需用户自己删除非模态对话框。

非模态对话框的创建非模态对话框的创建

Page 37: 第七章 对话框和控件

► 非模态对话框的实例应声明为全局对象,不能象模态对话框那样作为局部对象。一般用 new 操作符生成,使用结束时用 delete 操作符将其删除。

►区别于模态对话框,非模态对话框用 new 生成对象后,不是调用 CDialog::DoModal() 函数,而是调用CDialog::Create() 函数装入对话框资源,并创建和显示对话框。

► Create() 函数在显示非模态对话框后就立即返回,而 DoModal() 函数是在模态对话框被关闭之后才返回。并且,由于 Create() 函数不会启动新的消息循环,非模态对话框与应用程序共用一个消息循环,这样,非模态对话框就不会垄断用户的输入。

Page 38: 第七章 对话框和控件

► 利用对话框编辑器创建对话框资源,并向对话框中加入所需控件。

► 用 Class Wizard创建非模态对话框类。►给新创建的对话框加入成员变量。► 定义非模态对话框的构造函数和对话框窗口的创

建函数。► 定义要传送的消息。► 非模态对话框对象的创建和删除。

非模态对话框创建的基本步骤非模态对话框创建的基本步骤

Page 39: 第七章 对话框和控件

► Windows将一些常用的对话框集成到操作系统中,作为 Windows公用对话框库 Commdlg.dll 的一部分。用户在程序中可以直接使用这些公用对话框,不必再创建对话框资源和对话框类,并且,用户还可以定制公用对话框的外观和性能。

► 为了在 MFC 应用程序中使用公用对话框, MFC

提供了封装这些公用对话框的类。这些公用对话框类都是从 CCommonDialog 类派生而来,而 CCom

monDialog 类又是 CDialog 类的派生类。

公用对话框公用对话框

Page 40: 第七章 对话框和控件

公用对话框公用对话框

MFC公用对话框类CColorDialog

CFileDialog CFindR

eplaceDialog

CFontDialog

CPagesSetupDialog

CPrintDialog

COleDialog

说 明颜色设定对话框,选择不同的颜色文件存取对话框,打开或保存文件查找和替换对话框,查找和替换文本串字体设定对话框,选择不同的字体。页面设置对话框,设置页码、页眉等标准的打印对话框,用于打印和打印设置该类及其派生类用于生成 OLE 对话框

Page 41: 第七章 对话框和控件

课程小结课程小结► 基于对话框的应用程序创建► 对话框的常用处理函数,以及数据交换 DDX 和

数据验证 DDV (※)► 创建模式对话框和非模式对话框(※)► 使用信息提示对话框(※)►公用对话框► 在程序中使用对话框(※)► 控件的创建和使用(※)

Page 42: 第七章 对话框和控件

作业作业7- 32: 编写一个对话框应用程序,在对话框中显示“ Hello MFC Dialog!”, 并画出一个椭圆。

7- 33 :编写一个 SDI 应用程序,按照以下要求编程:⑴执行“编辑 | 输入数据 (I)……” 菜单命令打开标题为“输入数据”的对话框,通过该对话框输入 X 和 Y坐标值,要求输入值在 100- 400 的范围内;⑵ 在视图类中定义两个成员变量,单击对话框的“确定”按钮时接收输入数据,并赋值给视图对象的两个成员变量,调用 Invalidate() 函数刷新窗口;⑶在视图类 OnDraw ()函数中添加代码,画出一条从当前位置到输入坐标的直线。

7- 35 : 编写一个 SDI 应用程序,执行某菜单命令时打开一个对话框,通过该对话框输入要显示的字符串和坐标值,并单击 OK 在视图区指定位置显示输入的字符串。

7- 37 :编写一个 SDI 应用程序,程序中有一个“对话框”主菜单,并有“显示”、“隐藏”和“退出” 3 个菜单项,当执行“显示”命令时显示一个对话框,对话框中显示一行文本串“这是一个对话框!”。当执行其他菜单命令时完成相应的功能。

7- 42 : 编写一个对话框应用程序,程序启动后首先弹出一个用户身份确认对话框,当用户键入正确的口令后才能进入程序的主对话框界面。

7- 45 :编写一个 SDI 应用程序,为程序添加一个工具栏按钮,当单击按钮时弹出一个对话框。对话框中有 3 个标题为红、绿、蓝的复选框,当用户单击“确定”按钮 , 程序根据选择的组合颜色在用户区显示一行文本。

Page 43: 第七章 对话框和控件

例 7- 2c :假设已利用 MFC AppWizard 应用程序向导建立了一个名为 Mysdi 的单文档应用程序,在应用程序中添加标题为“输入半径”的对话框资源和对应的对话框类,在对话框资源中添加内容为“请输入半径”的静态文本框控件和用于接收输入的编辑框控件,并添加与控件关联的成员变量。通过“编辑”菜单中的“输入半径( I )”打开标题为“输入半径对话框”,并根据输入的半径画一个圆。

例 7- 2d :假设已利用 MFC AppWizard 应用程序向导建立了一个名为 Mysdi 的单文档应用程序,在应用程序中添加标题为“输入半径”的对话框资源和对应的对话框类,在对话框资源中添加内容为“请输入半径”的静态文本框控件和用于接收输入的编辑框控件。通过“编辑”菜单中的“输入半径( I )”打开标题为“输入半径对话框”,并根据输入的半径画一个圆。要求只向对话框添加控件,当不能添加与控件有关联的成员变量。

例 7- 3 :假设已利用 MFC AppWizard 应用程序向导建立了一个名为 Mysdi的单文档应用程序,在应用程序中添加标题为“输入半径”的对话框资源和对应的对话框类,在对话框资源中添加内容为“请输入半径”的静态文本框控件和用于接收输入的编辑框控件,并添加与控件关联的成员变量。通过“编辑”菜单中的“输入半径( I )”打开标题为“输入半径对话框”,并根据输入的半径画一个圆。要求以非模态对话框形式实现绘图功能。

例 7- 4 :编写一个基于对话框的程序 StatText ,单击“统计文本行”打开一个公共文件对话框,并统计在文件对话框中所选择文本文件的行数。

例 7- 6 :编写一个 SDI 应用程序 Password ,程序启动后首先弹出一个用户身份确认对话框,当用户键入正确口令后才能进入程序的主界面。

例 7- 7 :编写一个对话框应用程序 CorButn, 对话框中有两个用于选择颜色模式的单选按钮和 3 个用于选择颜色的复选框,只有在彩色模式下才能选择 3 中不同的颜色的组合。对话框运行效果如图,当用户单击“应用”按钮,对话框右边的按键按钮根据选择的颜色实现按钮的自画。