MFC中对话框类(Dialog)的应用

转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85

Windows应用程序通常是通过对话框接收用户输入、向用户输出信息,本节介绍应用程序中对话框的创建和应用,首先介绍对话框的工作方式、种类及创建方法,然后介绍如何将对话框与程序联系在一起。

3.4.1 对话框的工作方式、种类和创建方法

1. 对话框在应用程序中的工作方式

  前已述及,文档类是应用程序存储数据的地方,而对话框是用户与应用程序之间信息交互的桥梁,那么,文档数据是怎样传递到对话框中,用户输入到对话框中的数据又是怎样反映到文档的呢?

  实际上,用户看到的对话框是一个读入或写出数据的图形界面对象,这一对象由集成开发环境中的对话框模板提供。可以向模板添加各种控件 (controls,如按钮,编辑框,单选复选按钮等),构成程序的 对话框资源 ;应用程序要使用对话框还需定义一个CDialog派生类的 对话框类 与 资源相连接,并在这个对话框类中定义一些成员变量与对话框中的控件相对应,提供对话框控件的缺省数据值 ,对话框类的函数成员负责对话框的打开与关闭、数据的传递等 ;程序运行时需要用到对话框时依据对话框资源激活对话框,接收用户输入后通过 对话框类的 成员函数更新文档类数据成员,如图3.17示。

MFC中,各  种控件都有相应的类,如CEdit,CStatic,CButton,CListBox,CComboBox,它们都派生自CWnd类,因此,都继承了窗口类的所有函数;在对话框中,它们是对话框的子窗口。

2. 对话框的种类

  Windows中有两种对话框,模态对话框和非模态对话框,构造两种对话框的大多数工作都相同,只是两者的显示和数据处理有些不同。

   模态对话框 (Modal Dialog Boxes)工作时使其父类窗口无效,直到对话框结束,也就是说,该对话框打开后,程序等待用户输入并关闭对话框后才执行其它任务。例如Windows中 常见的File|Open对话框,需用户选择一个文件打开或按取消按钮关闭对话框后程序才继续执行。对系统而言,打开一个模态对话框相当于函数调用,只有 当函数运行结束,从被调函数返回时,主调函数才能执行下一步。调用DoModal函数可以显示模态对话框。如:

CMyDialog dlg ; dlg.DoModal(); DoModal返回用户按下的按钮ID值(如IDOK或IDCANCEL),按下OK或CANCEL按钮后,自动调用CDialog::EndDialog关闭对话框。

  非模态对话框 ( Modeless Dialog Boxes) 与模态对话框相反,对话框打开期间,允许用户切换到程序其它部分,不一定要关闭对话框。 WinWord中的Find and Replace对话框就是一个典型的非模态对话框。对系统而言,一个非模态对话框相当于另一个需要支持的线程,可以说是执行中的另外一个程序。调用Create函数创建并显示非模态对话框:  CMyDialog dlg; dlg.Create();

  用户按下 OK或CANCEL按钮不会关闭对话框,可重定义OnOK和OnCancel函数,调用DestroyWindow关闭对话框:

void CMyDialog::OnOK() { …  DestroyWindow(); }  void CMyDialog::OnCancel() {  DestroyWindow(); }

3. 对话框的创建与编辑

3.4.2 将对话框与程序连结

1. 对话框类及数据成员的定义

a)创建对话框类
对话框资源创建后,在对话框中右击鼠标,选择 ClassWizard菜单项,会出现如图3.22的提示框,说明新建的对话框资源是新资源,是否需要建立一个新类或选择一个已存在的类。 
若选择新类,出现图3.23示的New class对话框,按照VC命名规则为新类取名,取CStudentDlg,Base class选CDialog,Dialog ID选新建的对话框资源ID,按OK在WorkSpace中可看到新增加的类,自动生成的StudentDlg.h头文件和StudentDlg.cpp源文件。
b)增加数据成员

  要使对话框能与程序通讯,还需给对话框类增加数据成员,以保存各控件的初始值,并从控件读取数据。 与控件对应的数据成员可以是变量或控件类型,如表 3.10所示。 表 3.10  对话框与控件对应的变量或控件数据成员

分类

变量成员

控件成员

用途

用于控件初始化或保存控件值,成员变量可以是任何数据类型如编辑框的值可以是整型或字符串,复选框的值是 BOOL类型

控件成员变量是相应控件类的对象,可以调用控件类的成员函数,如列表框,定义一个 CListBox类型变量,可以通过控件使用类的成员函数以初始化列表框

说明

一个控件可以定义其中一种也可定义两种

   在 ClassWizard的Member Variables页面,选择对话框类,在Control IDs中列出了对话框中所有控件ID,如图3.24,选择某个ID,按Add Variable…按钮,弹出Add Member Variable对话框,可输入成员名,在Category中选择值(value)变量或控件(controls)类型,在Variable type列表框中,若是Value类,选择变量数据类型,若是Controls,选择控件类,按OK,成员添加成功。

针对上例,定义了如图 3.25示的数据成员变量表。

数据成员定义后,在对话框第一次显示时需对其初始化。有两种方法初始化成员变量:一是在对话框类的构造函数中初始化,由 ClassWizard自动生成;二是构造对话框对象后进行初始化。为使用方便,对话框变量成员一般定义成public访问权限,因此可以在使用对话框的地方初始化。
图 3.24  为对话框添加数据成员

图 3.25  对话框的变量和控件数据成员

例如: CStudentDlg::CStudentDlg(CWnd* pParent /*=NULL*/) : CDialog(CStudentDlg::IDD, pParent) {  //{{AFX_DATA_INIT(CStudentDlg)  m_sDepart = _T("");  m_dComputer = 0.0;  m_dEnglish = 0.0;  m_nID = 0; m_dMath = 0.0; m_sName = _T("");  m_dPhysics = 0.0;  m_nSex = -1;  //}}AFX_DATA_INIT  }

  ClassWizard自动在构造函数中初始化变量,代码放在//{{AFX_ 和//}}AFX_括号中间,一般不需要对其改动。 ClassWizard还为对话框生成了DDX(Dialog Data Exchange)函数成员DataExchange,此函数不应被显式调用,而由UpdateData函数调用 ,可以实现在对话框控件与对话框数据成员之间的双向数据交换 。  UpdateData(FALSE),将对话框对象的成员变量值拷至对话框控件 ,用于向用户显示数据。 UpdateData(TRUE)将对话框控件中数据拷贝至对话框对象成员变量,缺省值是TRUE。 如果选择对话框的 OK按钮关闭对话框,会自动调用UpdateData()。  对分组的单选按钮,在 ClassWizard中只出现组内第一个控件的ID,增加一个成员变量,类型只能是int,选中第一个,其值为0,第二个值为1,依此类推。 
2. 对话框的显示

  对于模态对话框,调用其 DoModal函数显示,按OK或Cancel按钮关闭对话框,并作相应数据处理。对于非模态对话框,调用Create函数创建并显示对话框,用DestroyWindow关闭对话框。 例 如设在文档类中有 CStudent对象stu,其成员函数SetName为姓名赋值;视图类响应输入命令(如增加一个菜单命令Input,响应函数为OnInput),为 输入学生信息打开对话框,则下面代码为对话框按OK按钮后,用对话框成员变量更新文档数据。

void CEx3_1View::OnInput() {  // TODO: Add your command handler code here  CEx3_1Doc* pDoc = GetDocument();  CStudentDlg dlg; // 构造对话框对象 if(dlg.DoModal()==IDOK) { // 显示对话框并选择 OK 按钮后  pDoc->stu.SetName(dlg.m_sName); // 将对话框数据赋给文档数据成员  … }  }  又如,可以通过菜单命令,调用函数 ShowData ,用对话框显示文档数据。先构造对话框变量,然后用文档数据为对话框数据成员赋值,再显示对话框,代码如下:

void CEx3_1View::ShowData() {  // TODO: Add your command handler code here  CEx3_1Doc* pDoc = GetDocument();  CStudentDlg dlg; // 构造对话框对象  strcpy(dlg.m_sName,Doc->stu.GetName); // 将文档数据成员赋给对话框数据成员 dlg.m_iNum = Doc->stu.Num;  …  dlg.DoModal() // 显示对话框 , 控件显示文档数据  }

3. 为控件添加或修改消息响应函数

   打开 ClassWizard ,在 Message Map 页面,可以为控件添加响应函数。如图 3.26 ,选择 CStudentDlg 类,在 Object IDs 中选择 IDOK ;在 Message 框中选择 BN_CLICKED( 单击 ) 消息,按 Add Function… 按钮,弹出 Add Member Function 对话框,接受缺省的函数名 OnOK ,或为成员函数修改名称,按下 OK 按钮,就为 CStudentDlg 类添加了 OK 按钮的响应函数,同样方法可为其它按钮添加响应函数。 Class Wizard 在类的声明中添加函数原型,并在类的 cpp 文件中添加空的函数体,由程序设计人员完成函数代码。

选择 OK 按钮后,调用 OnOK 函数。 
void CStudentDlg::OnOK() { 
// TODO: Add extra validation here 
UpdateData(); // 首先使数据传送至对话框成员变量  CDialog::OnOK(); // 调用基类 OnOK 并关闭对话框 }

上一篇:诊断SQLSERVER问题常用的日志


下一篇:关于css选择器中有小数点的标签获取