30
第 11 第 第第第 (DIALOG) 11.1 第第第第第第第第第第第 11.2 第第第第第第第 11.3 第第第第第第第第第第第第第 11.4 第第第第第第第第第第第第第 11.5 MFC 第第第第第第第第 11.6 第第第第第第 11.7 第第第 ( 第第 )

第 11 章 对话框 (DIALOG)

Embed Size (px)

DESCRIPTION

第 11 章 对话框 (DIALOG). 11.1 对话框模板资源描述文件 11.2 自定义对话框类 11.3 对话框的数据交换和数据检验 11.4 以对话框为主界面的应用程序 11.5 MFC 预置的通用对话框 11.6 非模态对话框 11.7 属性页 ( 自学 ). CWnd. 对话框 (Dialog) :是用户与应用程序交互的重要的界面 ( 输入数据,显示数据 ) 。. CDialog. 设计一个对话框, 创建对话框的模板资源 派生 CDialog 的子类,使用 1) 步的对话框资源. 11.1 对话框模板资源描述文件. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 11 章 对话框 (DIALOG)

第 11 章 对话框 (DIALOG)

11.1 对话框模板资源描述文件11.2 自定义对话框类11.3 对话框的数据交换和数据检验11.4 以对话框为主界面的应用程序11.5 MFC 预置的通用对话框11.6 非模态对话框11.7 属性页 ( 自学 )

Page 2: 第 11 章 对话框 (DIALOG)

对话框 (Dialog) :是用户与应用程序交互的重要的界面 ( 输入数据,显示数据 ) 。

CWnd

CDialog设计一个对话框,1)创建对话框的模板资源2)派生 CDialog 的子类,使用 1) 步的对话框

资源

Page 3: 第 11 章 对话框 (DIALOG)

11.1 对话框模板资源描述文件

VC++ 中通常在资源视图 (Resource View) 中创建和编辑对话框资源。参见图 1 和图 2 ,创建的对话框资源保存在 .RC 文件。

图 1 图 2

Page 4: 第 11 章 对话框 (DIALOG)

对话框名 DIALOG [ 载入特性选项 ] X, Y, Width, Height[ 设置选项 ]BEGIN [ 对话框上控件的定义 ]END

对话框模板资源描述文件 (.RC)

设置选项:包括 CAPTION( 标题 ) 、 FONT( 字体 ) 和 STYLE( 样式 ) 等。

Page 5: 第 11 章 对话框 (DIALOG)

对话框常用样式

Page 6: 第 11 章 对话框 (DIALOG)

对话框中常用的控件及其说明

Page 7: 第 11 章 对话框 (DIALOG)

11.2 自定义对话框类1. MFC 的对话框类及用户自定义对话框类

CObject

CCmdTarget

CWnd

CDialog

用户自定义对话框类由 CDialog 派生。其构造函数如下:

lpszTemplateName : 不是资源标识的字符串常量形式,而是模板资源的名称。如, CDialog(“IDD_DIALOG1”); // ERROR CDialog(IDD_DIALOG1); // OK 除非 .RC 文件中定义的模板资源名称是双引号括起来的。

此时,CDialog(“MyDialog”); // OK

Page 8: 第 11 章 对话框 (DIALOG)

依据对话框资源模板,创建用户自定义的对话框类(CLASSWIZARD)

Page 9: 第 11 章 对话框 (DIALOG)

2. 模态对话框 (Modal Dialog Box)

对话框分为模态和非模态之分,两者的差别在于对话框是否垄断应用程序的所有消息。 Modal dialog boxes, which require the user to respond before continuing the

program

Modeless dialog boxes, which stay on the screen and are available for use at

any time but permit other user activities

模态对话框的创建:

virtual int CDialog::DoModal();

Remarks

Call this member function to invoke the modal dialog box and return the

dialog-box result when done. This member function handles all interaction

with the user while the dialog box is active. This is what makes the dialog

box modal; that is, the user cannot interact with other windows until the

dialog box is closed.

Page 10: 第 11 章 对话框 (DIALOG)

Example:

CMyDialog dlg;

dlg.DoModal();

载入对话框模板

UpdateData()

OnInitDialog()

消息循环

OnOK()UpdateData()EndDialog()

return IDOK

OnCancel()

EndDialog()

return IDCANCEL

OK 按钮消息 Cancel 按钮消息

DoModal() 执行过程

垄断消息

Page 11: 第 11 章 对话框 (DIALOG)

分析、讲解例 11-1

virtual void CDialog::OnOK();

virtual void CDialog::OnCancel();

void MFCexp11_1:View:OnLButtonDown(….)

{

…..

CMyDialog dlg;

dlg.DoModal();

…..

}

Page 12: 第 11 章 对话框 (DIALOG)

11.3 对话框数据交换和数据检验

1. 数 据 交 换 : DDX( Dialog Data eXchange )

Data Control

显示

保存

Control Memory Variables

Binding

如何实现?

Page 13: 第 11 章 对话框 (DIALOG)

2. 用 Class Wizard 为对话框添加成员变量

Category:1) Control: 与控件绑定的是类对象2) Value :与控件中的数据进行绑定3) 使用 Control 还是 Value 根据需要

设定,可以同时或分别设定

Page 14: 第 11 章 对话框 (DIALOG)

3. 如何交换BOOL CWnd::UpdateData(

BOOL bSaveAndValidate = TRUE );

bSaveAndValidateFlag that indicates whether dialog box is being initialized (FALSE) or data is being retrieved (TRUE).

Control Mem VariableFALSE

TRUE

如何实现?

virtual void CWnd::DoDataExchange ( CDataExchange * pDX );

Page 15: 第 11 章 对话框 (DIALOG)

DDX 函数

MFC 定义了大量的以 DDX_ 为前缀的函数,用来实现 变 量 与 控 件 的 绑 定 以 及 数 据 交 换 。如, DDX_Text() 、 DDX_Radio() 、 DDX_Check() 等。DDX_Text

void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, BYTE& value );void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, short& value );……

Page 16: 第 11 章 对话框 (DIALOG)

UpdateData()

DoDataExchange()

DDX_XXXX()

分析和讲解 例 11-2

4. 数据检验 (DDV, Dialog Data Validation)

MFC 中提供了以 DDV_ 为前缀的函数,用于输入数据的检验。

Page 17: 第 11 章 对话框 (DIALOG)

11.4 以对话框为主界面的应用程序

1. 创建方法

模态对话框拥有自己的消息循环和对应的窗口函数,因此除了可以用作应用程序的一个部件之外,还可以用对话框作为应用程序的主界面。如常见的工具软件,杀毒软件、词典等。

virtual BOOL CDialog::OnInitDialog( );

This member function is called in response to the WM_INITDIALOG message. This message is sent to the dialog box during the Create, CreateIndirect, or DoModal calls, which occur immediately before the dialog box is displayed.

Page 18: 第 11 章 对话框 (DIALOG)

调用了OnInitDialog()

分析和讲解 例 11 - 3

Page 19: 第 11 章 对话框 (DIALOG)

11.5 MFC 预置的通用对话框MFC 专门提供了一些通用的对话框类,如,

颜色选择对话框 (CColorDialog)

文件选择对话框 (CFileDialog)

字体选择对话框 (CFontDialog)

打印和打印设置对话框 (CPrintDialog)

……

1. 文件对话框 (CFileDialog)The CFileDialog class encapsulates the Windows common file dialog box, which provides an easy way to implement the standard File Open and File Save As dialog boxes.

以上对话框类均在afxdlgs.h 中进行了定义。

X:\PROGRAM FILES\...\TEXT.ABC.TXT

PATHFILE NAME

TITLE

EXTEND

Page 20: 第 11 章 对话框 (DIALOG)

CFileDialog( BOOL bOpenFileDialog,

LPCTSTR lpszDefExt = NULL,

LPCTSTR lpszFileName = NULL,

DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

LPCTSTR lpszFilter = NULL,

CWnd* pParentWnd = NULL );

ParametersbOpenFileDialog : TRUE -文件打开对话框; FALSE -保存文件对话框lpszDefExt : 默认的扩展名。 if NULL ,则无默认扩展名lpszFileName :初始的文件名, if NULL ,则显示空文件名dwFlags :不同的组合来自定义对话框lpszFilter :文件名过滤参数,用于筛选指定的文件pParentWnd :父窗口

更多信息参考 MSDN ,或 http://msdn.microsoft.com

Page 21: 第 11 章 对话框 (DIALOG)

lpszFilter parameter

用来指明对话框文件类型框中所使用的过滤参数,每一个参数由两项组成:

第一项:显示的文本第二项:文件的类型 , 即 第一项 | 第二项如果使用多个过滤器,则使用“ |” 连接起来;同种类型文件的扩展名间可以用“ ;” 分割,末尾用 “ ||” 指明。

Example :Word 文档 (*.doc) | *.doc||Word 文档 (*.doc)|*.doc| 位图 (*.bmp)|*.bmp;*.dib| 全部文件(*.*)|*.*||

char * pFilters = “Word 文档 (*.doc)|*.doc| 位图 (*.bmp)|*.bmp| 全部文件 (*.*)|*.*||”;CFileDialog fileDlg(TRUE, NULL, “*.doc”, NULL, pFilters);int result = fileDlg.DoModal();……

Page 22: 第 11 章 对话框 (DIALOG)

常用的成员函数及其功能

CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如: c:\test\test1.txtCString CFileDialog::GetFileName( ) 得到文件名,包括扩展名如: test1.txtCString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如: txtCString CFileDialog::GetFileTitle ( ) 得到文件主名,不包括目录名和扩展名如: test1POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。POSITION CFileDialog::GetStartPosition( )来得到最初的 POSITION 变量。

Page 23: 第 11 章 对话框 (DIALOG)

分析和讲解 例 11 - 4

更正

Page 24: 第 11 章 对话框 (DIALOG)

2. 字体选择对话框 (CFontDialog)

CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS |

CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );

参数说明:lplfInitial :指向一个 LOGFONT 结构;如果该参数设置为 NULL 表示不设置初始字体。pdcPrinter :指向一个代表打印机设备环境的 DC 对象,若设置该参数则选择的字体就为打印机所用。pParentWnd :用于指定父窗口。

Page 25: 第 11 章 对话框 (DIALOG)

通过调用 DoModal() 创建对话框,在返回后通过调用以下函数来得到用户选择: void CFontDialog::GetCurrentFont( LPLOGFONT lplf );用来获得所选字体的属性。该函数有一个参数,该参数是指向 LOGFONT结构的指针,函数将所选字体的各种属性写入这个 LOGFONT 结构中。 CString CFontDialog::GetFaceName( ) :得到所选字体名字。 int CFontDialog::GetSize( ) :得到所选字体的尺寸(以 10 个象素为单位)。 COLORREF CFontDialog::GetColor( ) :得到所选字体的颜色。 BOOL CFontDialog::IsStrikeOut( )BOOL CFontDialog::IsUnderline( )BOOL CFontDialog::IsBold( )BOOL CFontDialog::IsItalic( )得到所选字体的其他属性,是否有删除线,是否有下划线,是否为粗体,是否为斜体

Page 26: 第 11 章 对话框 (DIALOG)

通常,定义字体对话框只使用构造函数的第一个参数。如:LOGFONT m_logFont;

CFontDialog fontDialog(&m_logFont);

分析和讲解 例 11 - 5

Page 27: 第 11 章 对话框 (DIALOG)

11.6 非模态对话框非模态对话框( Modeless Dialog ),1 )没有自己的、独立的消息循环,而是与应用程序使用同

一个消息循环,从而使它不能垄断用户消息。2 )设计非模态对话框的方法和过程与模态对话框( Modal

Dialog )相同,即设计对话框模板资源,然后是创建对话框类。

使用非模态对话框:与模态对话框的使用方法不同,非模态对话框,1 )打开对话框,使用 CDialog::Create() ,因为 Create() 不会启动新

的消息循环。2 )销毁,使用 CWnd::DestroyWindow()销毁,即关闭对话框3 )在动态存储器中创建,即使用 new操作符。关闭之后使用 delete操

作符4 )使用标志性变量跟踪非模态对话框的运行状态,避免多次打开

Page 28: 第 11 章 对话框 (DIALOG)

Example :CNonMdlDlg * m_pNameDlg;

bool m_bActive;

m_pNameDlg = new CNonMdlDlg;

… …

m_bActive = TRUE;

CDialog::Create(CNonMdlDlg::IDD);

… …

m_bActive = FALSE;

DestroyWindow();

… …

m_pNameDlg->SetActiveWindow();

… …

delete m_pNameDlg;

Page 29: 第 11 章 对话框 (DIALOG)

分析和讲解 例 11 - 6

更正:

Page 30: 第 11 章 对话框 (DIALOG)

11.7 属性页

(自学 )