标题：对话框
对话框的组成
对话框主要由两部分组成。
对话框资源：可以使用对话框编辑器来配置对话框的界面，如对话框的大小、位置、样式，对话框中控件的类型和位置等。另外，我们还可以在程序的执行过程中动态创建对话框资源。
对话框类：在MFC程序中，可以使用向导帮助用户建立一个与对话框资源相关联的类，通常这个类由CDialog类派生。
对话框的类型
对话框可以分为模式对话框和无模式对话框两种类型。
CDialog
为了能够方便的操作对话框，MFC为用户提供了CDialog类。它是在屏幕上显示对话框的基类，与对话框资源紧密相关，提供了管理对话框的接口，封装了一些对话框的相关操作。
从CDialog的定义代码可以看出，Cdialog提供了两套构建Cdialog对象的系统，分别用于模式对话框和无模式对话框。
无模式对话框对象的构建过程，它首先调用缺省的构造函数生成对话框对象，然后调用Create函数创建和初始化对话框。Cdialog类中的Create函数有两种函数原型：
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
其中，
参数lpszTemplateName是无模式对话框模板资源的标志符；
参数nIDTemplat是对话框模板资源的标志符，它通常以IDD_开头（例如IDD_DIALOG1）;
参数pParentWnd是指向对话框对象所属的父窗口的指针（如果它为NULL，则表示对话框对象的父窗口是应用程序主窗口）。如果希望对话框中它的父窗口创建后马上被显示，就必须把对话框模板设置为WS_VISIBLE形式。否则，需要调用ShowWindow函数来显示对话框。
对于模式对话框，其构造函数如下所示：
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
构造函数的参数说明与无模式对话框的Create函数类似。在模式对话框中，当创建了对话框对象后，可以通过调用DoModal函数来显示对话框。
一般情况下，无论是模式对话框还是无模式对话框，都有两个按钮OK和CANCEL。对话框为它们提供了默认的消息处理函数OnOk和OnCancel。调用这两个函数都将关闭对话框。所不同的是，默认的OnOk函数中关闭对话框前将更新对话框数据，而默认的OnCancel函数不更新对话框数据。
当CDialog类检测到OK或Cancel键时，它将调用::EndDialog函数。EndDialog函数虽然结束了对话框应用程序，但却并没有删除对话框对象，释放内存。这对于模式对话框来说，不是问题，它的生存时间不长，我们一般在栈上创建它们；但无模式对话框则不同，它的生存时间更长，我们通常在栈上创建它们，并且希望它在消失之前能够删除自己。因此，大多数情况下，我们需要在无模式对话框中重载OnOK和OnCancel函数，加入DestroyWindows函数来彻底地删除它。
数据交换和验证机制
在VC中，所有的对话框函数都是使用C++代码实现的，它并没有采用特殊的资源或“奇特”的宏，但却可以很好地实现用户与应用程序之间的交互工作，这里的关键就在于对话框应用程序中广泛采用的对话框数据交换和验证机制。
对话框数据交换（DDX,Dialog Data Exchange）用于初始化对话框中的控件并获取用户的数据输入，而对话框数据验证（DDV,Dialog Data Validation）则用于验证对话框中数据输入的有效性。MFC在每个对话框类中提供了一个用于重载的虚函数——DoDataExchange来实现对话框数据交换和验证工作。对话框数据交换如果使用DDX机制，则通常在OnInitDialog程序或对话框构造函数中设置对话框对象成员变量的初始值。在对话框即将显示前，应用程序框架的DDX机制将成员变量的值传递给对话框的控件，当对话框响应DoModal或Create而被显示时，对话框控件将“显示”这些值。Cdialog类中的OnInitDialog函数默认时将调用CWnd类的UpdateData成员函数初始化对话框中的控件。UpdateData函数的原型如下：
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
函数参数为TRUE，即将对话框及其控件中的数据传递给程序代码中的成员变量；
函数参数为FALSE，即将类中的数据状态传递给对话框及其控件。
当用户重载DoDataExchange函数时，也就为每一个数据成员（控件）指定了一个DDX函数调用。对话框数据验证除了调用DDX参数指定数据交换外，用户还可以使用DDV函数进行对话框数据验证。在调用控件的DDX函数后，必须立即调用该控件的DDV函数。大部分DDV函数的原型如下所示。
DDV_MinMaxCustom(pDX, Data, MinData, MaxData);
其中，参数pDX是一个指向CdataExchange对象的指针，参数Data中存放着即将被验证的数据，后两个参数用于定制数据的范围。
CdataExchange类
如果仅仅需要使用对话框数据，一般没有必要了解数据交换/验证的核心内容。但在了解了数据交换和验证的实质后，用户就可以编写自己的数据交换和验证代码，定制DDX/DDV.
对话框控件
控件是一个可以与其交互以完成输入或操作数据操作的对象，它也是一种特殊的窗口。控件通常出现在对话框或工具栏中。Windows提供了多种多样的控件，在MFC应用程序中，能够使用的控件通常可以分为三种。
1）windows公用控件：包括编辑控件、按钮、列表框、组合框、滑动条控件等，另外也包括所有者描述的控件。
2）ActiveX控件：既可以在对话框中使用，也可以在HTML网页中使用。
3）由MFC提供的其他控件类
我们主要介绍第一种类型的控件——Windows公用控件。
Windows操作系统提供了多种windows公用控件，这些控件对象都是可编程的，Visual C++的对话框编辑器支持将这些控件对象添加到对话框中。用户可以在工具箱的对话框编辑器中看到这些windows公用控件。MFC为了更好的支持windows公用控件，提供了多种控件类，每一个控件类封装一种控件，并提供相应的成员函数来管理操作控件。
消息对话框
我们在使用Windows系统的过程中经常会见到消息对话框，提示我们有异常发生或提出询问等。因为在软件开发中经常用到消息对话框，所以MFC提供了两个函数可以直接生成指定风格的消息对话框，而不需要我们在每次使用的时候都要去创建对话框资源和生成对话框类等。这两个函数就是CWnd类的成员函数MessageBox()和全局函数AfxMessageBox()。
一、CWnd::MessageBox()函数和AfxMessageBox()函数的用法
下面分别讲解两个函数的用法。
1、CWnd::MessageBox()函数
CWnd::MessageBox()的函数原型如下：
int MessageBox(
LPCTSTR lpszText,
LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK 
);
参数说明：
lpszText：需要显示的消息字符串。
lpszCaption：消息对话框的标题字符串。默认值为NULL。取值为NULL时使用默认标题。
nType：消息对话框的风格和属性。默认为MB_OK风格，即只有“确定”按钮。
nType的取值可以是下面两个表中任取一个值，也可以是各取一个值的任意组合。即可以指定一个对话框类型，也可以指定一个对话框图标，还可以两者都设定。
对话框类型表：
nType 取值参数说明
MB_ABORTRETRY 有“终止”、“重试”和“忽略”按钮
MB_OK 有“确定”按钮
MB_OKCANCEL 有“确定”和“取消”按钮
MB_RETRYCANCEL 有“重试”和“取消”按钮
MB_YESNO 有“是”和“否”按钮
MB_YESNOCANCEL 有“是”、“否”和“取消”按钮
对话框图标类型表：
nType 
MB_ICONEXCLAMTION 
MB_ICONWARNING
MB_ICONASTERISK
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
如果想要设置nType的值为类型和图标的组合，可以像这样取值：MB_OKCANCEL | MB_ICONQUESTION。按位取或就可以了。
2、AfxMessageBox()函数
AfxMessageBox()的函数原型为：
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType = MB_OK,
UINT nIDHelp = 0 
);
参数说明：
lpszText：同CWnd::MessageBox()函数
nType：CWnd::MessageBox()函数
nIDHelp：此消息的帮助的上下文ID。默认值为0，取0时表示要使用应用程序的默认帮助上下文。
二、CWnd::MessageBox()和AfxMessageBox()的返回值
我们在调用了上面两个函数后，都可以弹出模态消息对话框。消息对话框关闭后，我们也都可以得到它们的返回值。两者的返回值就是用户在消息对话框上单击的按钮的ID，可以是以下值：
IDABORT：单击“终止”按钮。
IDCANCEL：单击“取消”按钮。
IDIGNORE：单击“忽略”按钮。
IDNO：单击“否”按钮。
IDOK：单击“确定”按钮。
IDRETRY：单击“重试”按钮。
IDYES：单击“是”按钮。[1]