第 18 章
骤如下:
(1)在如图4-15 所示的对话框的“Control IDs”列表框中选择IDC_LOGINNAME,然
后单击“Add Variable”按钮,打开如图4-16 所示的添加成员变量对话框。
(2)按如下方法设置IDC_LOGINNAME 的成员变量。
? 在“Member variable ncom ”输入框中输入m_szLoginNcom,即将变量命名为
m_szLoginNcom。
枫叶文学网www.fywxw.com
第4 章 对话框
·69·
图4-16 添加成员变量对话框
? 在“Category”下拉列表框中选择“Value”,表明创建的变量是值,而不是控件。
? 在“Variable type”下拉列表框中选择CString,表明变量类型为CString。
单击“OK”按钮,确认并返回ClassWizard 对话框。
(3)添加一个m_szPassword 变量,对话框设置如下。
? 在“Member variable ncom ” 输入框中输入m_szPassword , 即将变量命名为
m_szPassword;
? 在“Category”下拉列表框中选择“Value”,表明创建的变量是值,而不是控件;
? 在“Variable type”下拉列表框中选择“CString”,表明变量类型为CString。
单击“OK”按钮,确认并返回ClassWizard 对话框,如图4-17 所示。
图4-17 完成变量添加的编辑成员变量的界面
(4)此时可以看到,在“Control IDs”列表框中选择“IDC_LOGINNAME”项后,在对
话框的下方将出现该变量的属xìng介绍和说明。对于CString 变量,还有一个“Maximum
Characters”输入框,用于设置C_LOGINNAME 输入框中的输入字符的个数。在本实例中可
以不作这个限定,故此输入框设置为空。
(5)单击“ClassWizard”对话框中的“OK”按钮后,回到IDE 主界面,完成变量的添
加。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·70·
此时在IDE 左侧单击“ClassView”选项卡,可以看到新建了一个类CLoginDialog,展开
CLoginDialog 节点,可以看到该类中添加了m_szLoginNcom 和m_szPassword 两个控件变量。
3.数据jiāo换和检验
程序运行时,用户更改控件属xìng,如在输入框中输入文字或者改变复选框的选中状况后,
MFC 会修改对应控件变量的值。这个过程是通过MFC 为对话框类自动添加的成员函数
DoDataExchange()实现的,称为对话框数据jiāo换和检验机制。该函数在LoginDialog.cpp 中的
代码如下:
void CLoginDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); //处理MFC 默认的数据jiāo换
//下面的代码处理控件与控件变量之间的数据jiāo换,一般由MFC 自动添加
//{{AFX_DATA_MAP(CLoginDialog)
//处理控件IDC_LOGINNAME 和变量m_szLoginNcom 之间的数据jiāo换
//DDX_Text 表明是进行文本数据jiāo换
DDX_Text(pDX, IDC_LOGINNAME, m_szLoginNcom);
//处理控件IDC_PASSWORD 和变量m_szPassword 之间的数据jiāo换
DDX_Text(pDX, IDC_PASSWORD, m_szPassword);
//}}AFX_DATA_MAP
}
MFC 提供了处理控件与控件变量之间的数据jiāo换的机制,因此在代码中访问控件的属
xìng,就可以直接通过访问控件变量进行。如实例Sample4_1 运行时,打开登录对话框,在“用
户名”输入框中输入字符串,通过CLoginDialog::DoDataExchange()函数,m_szLoginNcom
就自动保存所有输入的字符串值,反之如果程序运行时修改了m_szLoginNcom,则通过
CLoginDialog::DoDataExchange()函数,“用户名”输入框就会显示m_szLoginNcom 的值。
这里需要注意,控件和控件变量之间的数据jiāo换并非自动完成的,即DoDataExchange()
函数不是自动被调用的。例如在“用户名”输入框中输入字符串时,m_szLoginNcom 的值并
不随之改变,需要调用CDialog::UpdateData()函数才能做到从控件到控件变量或者从控件变
量到控件的数据传送。
CDialog::UpdateData()函数的原型为:
BOOL UpdateData(
BOOL bSaveAndValidate = TRUE
);
bSaveAndValidate 参数用于指示数据传输的方向,TRUE 表示从控件传给变量,FALSE
表示从变量传给数据。
CDialog::UpdateData()函数的返回值用于确定cāo作是否成功,为FALSE 表示不成功。
在实例Sample4_1 中,如果要通过控件变量访问“用户名”和“密码”两个输入框的输
入值,可以用如下代码:
UpdateData(); //参数默认值为TRUE,用于保存对话框的控件值
//验证用户名和密码
枫叶文学网www.fywxw.com
第4 章 对话框
·71·
if (m_szLoginNcom == "user" && m_szPassword == "test1234")
{
//验证通过,并提示用户
??
}
如果要设置“用户名”和“密码”两个输入框的值,则可以用如下代码:
//清除对话框中的输入
m_szLoginNcom = "";
m_szPassword = "";
//根据控件变量设置对话框的控件的值
UpdateData(FALSE);
4.为对话框类添加控件通知消息的处理函数
MFC 为对话框和控件定义了许多消息,可以通过“ClassWizard”对话框来查看、新建和
删除相应的消息响应函数。下面在实例Sample4_1 的登录对话框中添加单击“确认”和“取
消”两个按钮的消息处理函数,步骤如下:
(1)在IDE 主菜单栏中依次选择菜单“View|ClassWizard”,或者在开发环境的界面下直
接使用快捷键Ctrl+W,打开“ClassWizard”对话框,选择“Message Maps”选项卡,在“Project”
下拉列表框中选择Sample4_1,在“Class ncom”下拉列表框中选择“CLoginDialog”。
图4-18 控件IDOK 的通知消息
(2)在“Object IDs”列表框中选择IDOK,对应的控件是“确认”按钮,按钮一般有两
种通知消息,分别是BN_CLICKED(按钮被单击)和BN_DOUBLECLICKED(按钮被双击)。
(3)要为对话框添加用户单击“确认”按钮后的验证过程,需要添加一个处理IDOK 的
BN_CLICKED 通知消息成员函数。在“Messages”列表框中选择BN_CLICKED,单击“Add
Function”按钮,或直接双击“Messages”列表框中的BN_CLICKED,弹出Addcommber function
对话框,单击“OK”按钮就可以创建一个名称为OnOK 的消息处理函数。单击“Edit Code”
按钮,退出ClassWizard,并自动打开LoginDialog.cpp 文件,且定位在OnOK()函数上。
为OnOK()函数添加如下代码:
void CLoginDialog::OnOK()
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·72·
{
// TODO: Add extra validation here
//以下添加用户名和密码的验证过程
//注意,在对话框的OnOK 函数中自动调用CDialog::UpdateData(TRUE),
//即自动更新控件变量的值
//本例为简单起见,合法的用户名只能是user,对应密码为test1234
if (m_szLoginNcom == "user" && m_szPassword == "test1234")
{
//验证通过,并提示用户
//MessageBox 是Windows 系统的消息对话框,用于提示简单的消息,
//具体内容可以参考本章的最后一节
MessageBox("用户验证通过", "登录提示",MB_OK);
}
else
{
//验证不通过
//提示用户
MessageBox("用户验证失败", "登录提示",MB_OK);
//退出主程序
AfxGetMainWnd()->PostMessage(WM_QUIT);
//返回登录失败
//EndDialog 退出对话框,参数表示对话框的返回值,本例
//用"取消"按钮的ID 作为验证失败返回值
EndDialog(IDCANCEL);
}
//默认的消息处理函数,用于退出对话框,返回值为IDOK
CDialog::OnOK();
}
技巧:一般要退出程序,只需要销毁该程序的主窗口,即向该程序的主窗口发送WM_QUIT 消息,
代码为AfxGetMainWnd()->PostMessage(WM_QUIT);。
(4)按前面所述方法,打开“ClassWizard”对话框,为CLoginDialog 的IDCANCEL 按
钮控件的BN_CLICKED 消息添加消息处理函数OnCancel()。在程序中单击“取消”按钮与
验证失败的处理方法相同,因此修改CLoginDialog::OnCancel()函数,代码如下:
void CLoginDialog::OnCancel()
{
// TODO: Add extra cleanup here
//验证不通过
//提示用户
枫叶文学网www.fywxw.com
第4 章 对话框
·73·
MessageBox("用户验证失败", "登录提示",MB_OK);
//退出主程序
AfxGetMainWnd()->PostMessage(WM_QUIT);
//默认的消息处理函数,用于退出对话框,返回值为IDCANCEL,
//同本例的OnOK 验证失败的返回值
CDialog::OnCancel();
}
添加控件通知消息处理函数后,对话框类的创建任务基本完成,对话框类能基本实现对
话框所需的功能。
4.2 模态对话框
Windows 系统中对话框大致可以分为以下两种:
? 模态对话框。这类对话框弹出后,其他程序会被挂起,只有当前对话框响应用户的输
入。模态对话框一般要求用户做出某种选择。
? 非模态对话框。打开非模态对话框后,程序的其他窗口仍能响应消息,程序仍可以继
续运行。非模态对话框一般用来显示信息,或者实时地进行一些设置。
实例4-2:创建模态对话框实例。源代码在光盘中“\04\实例4-2\Sample4_1”目录下。
本节还以实例Sample4_1 为例,具体讲解模态对话框的创建步骤。
1.创建对话框类
按照4.1 节所述的方法创建对话框类和对话框资源,Sample4_1 的对话框资源和对话框
类在前面已经创建,这里不再详述。
2.创建对话框类的实例并初始化
首先创建对话框类的对象。在Sample4_1 中,为了在程序运行最开始完成登录功能,可
以在主窗口创建时显示登录对话框。创建CLoginDialog 实例的过程如下:
(1)在IDE 左侧工作区,单击“FileView”选项卡,展开Sample4_1 files 节点,然后展
开Source Files 节点,双击其中的MainFrm.cpp 文件,进入MainFrm.cpp 编辑界面,在文件头
部其他#include 语句加入下面的包含语句:
#include "LoginDialog.h"
(2)在IDE 左侧工作区,单击“ClassView”选项卡,展
松语文学免费小说阅读_www.16sy.com
(1)在如图4-15 所示的对话框的“Control IDs”列表框中选择IDC_LOGINNAME,然
后单击“Add Variable”按钮,打开如图4-16 所示的添加成员变量对话框。
(2)按如下方法设置IDC_LOGINNAME 的成员变量。
? 在“Member variable ncom ”输入框中输入m_szLoginNcom,即将变量命名为
m_szLoginNcom。
枫叶文学网www.fywxw.com
第4 章 对话框
·69·
图4-16 添加成员变量对话框
? 在“Category”下拉列表框中选择“Value”,表明创建的变量是值,而不是控件。
? 在“Variable type”下拉列表框中选择CString,表明变量类型为CString。
单击“OK”按钮,确认并返回ClassWizard 对话框。
(3)添加一个m_szPassword 变量,对话框设置如下。
? 在“Member variable ncom ” 输入框中输入m_szPassword , 即将变量命名为
m_szPassword;
? 在“Category”下拉列表框中选择“Value”,表明创建的变量是值,而不是控件;
? 在“Variable type”下拉列表框中选择“CString”,表明变量类型为CString。
单击“OK”按钮,确认并返回ClassWizard 对话框,如图4-17 所示。
图4-17 完成变量添加的编辑成员变量的界面
(4)此时可以看到,在“Control IDs”列表框中选择“IDC_LOGINNAME”项后,在对
话框的下方将出现该变量的属xìng介绍和说明。对于CString 变量,还有一个“Maximum
Characters”输入框,用于设置C_LOGINNAME 输入框中的输入字符的个数。在本实例中可
以不作这个限定,故此输入框设置为空。
(5)单击“ClassWizard”对话框中的“OK”按钮后,回到IDE 主界面,完成变量的添
加。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·70·
此时在IDE 左侧单击“ClassView”选项卡,可以看到新建了一个类CLoginDialog,展开
CLoginDialog 节点,可以看到该类中添加了m_szLoginNcom 和m_szPassword 两个控件变量。
3.数据jiāo换和检验
程序运行时,用户更改控件属xìng,如在输入框中输入文字或者改变复选框的选中状况后,
MFC 会修改对应控件变量的值。这个过程是通过MFC 为对话框类自动添加的成员函数
DoDataExchange()实现的,称为对话框数据jiāo换和检验机制。该函数在LoginDialog.cpp 中的
代码如下:
void CLoginDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); //处理MFC 默认的数据jiāo换
//下面的代码处理控件与控件变量之间的数据jiāo换,一般由MFC 自动添加
//{{AFX_DATA_MAP(CLoginDialog)
//处理控件IDC_LOGINNAME 和变量m_szLoginNcom 之间的数据jiāo换
//DDX_Text 表明是进行文本数据jiāo换
DDX_Text(pDX, IDC_LOGINNAME, m_szLoginNcom);
//处理控件IDC_PASSWORD 和变量m_szPassword 之间的数据jiāo换
DDX_Text(pDX, IDC_PASSWORD, m_szPassword);
//}}AFX_DATA_MAP
}
MFC 提供了处理控件与控件变量之间的数据jiāo换的机制,因此在代码中访问控件的属
xìng,就可以直接通过访问控件变量进行。如实例Sample4_1 运行时,打开登录对话框,在“用
户名”输入框中输入字符串,通过CLoginDialog::DoDataExchange()函数,m_szLoginNcom
就自动保存所有输入的字符串值,反之如果程序运行时修改了m_szLoginNcom,则通过
CLoginDialog::DoDataExchange()函数,“用户名”输入框就会显示m_szLoginNcom 的值。
这里需要注意,控件和控件变量之间的数据jiāo换并非自动完成的,即DoDataExchange()
函数不是自动被调用的。例如在“用户名”输入框中输入字符串时,m_szLoginNcom 的值并
不随之改变,需要调用CDialog::UpdateData()函数才能做到从控件到控件变量或者从控件变
量到控件的数据传送。
CDialog::UpdateData()函数的原型为:
BOOL UpdateData(
BOOL bSaveAndValidate = TRUE
);
bSaveAndValidate 参数用于指示数据传输的方向,TRUE 表示从控件传给变量,FALSE
表示从变量传给数据。
CDialog::UpdateData()函数的返回值用于确定cāo作是否成功,为FALSE 表示不成功。
在实例Sample4_1 中,如果要通过控件变量访问“用户名”和“密码”两个输入框的输
入值,可以用如下代码:
UpdateData(); //参数默认值为TRUE,用于保存对话框的控件值
//验证用户名和密码
枫叶文学网www.fywxw.com
第4 章 对话框
·71·
if (m_szLoginNcom == "user" && m_szPassword == "test1234")
{
//验证通过,并提示用户
??
}
如果要设置“用户名”和“密码”两个输入框的值,则可以用如下代码:
//清除对话框中的输入
m_szLoginNcom = "";
m_szPassword = "";
//根据控件变量设置对话框的控件的值
UpdateData(FALSE);
4.为对话框类添加控件通知消息的处理函数
MFC 为对话框和控件定义了许多消息,可以通过“ClassWizard”对话框来查看、新建和
删除相应的消息响应函数。下面在实例Sample4_1 的登录对话框中添加单击“确认”和“取
消”两个按钮的消息处理函数,步骤如下:
(1)在IDE 主菜单栏中依次选择菜单“View|ClassWizard”,或者在开发环境的界面下直
接使用快捷键Ctrl+W,打开“ClassWizard”对话框,选择“Message Maps”选项卡,在“Project”
下拉列表框中选择Sample4_1,在“Class ncom”下拉列表框中选择“CLoginDialog”。
图4-18 控件IDOK 的通知消息
(2)在“Object IDs”列表框中选择IDOK,对应的控件是“确认”按钮,按钮一般有两
种通知消息,分别是BN_CLICKED(按钮被单击)和BN_DOUBLECLICKED(按钮被双击)。
(3)要为对话框添加用户单击“确认”按钮后的验证过程,需要添加一个处理IDOK 的
BN_CLICKED 通知消息成员函数。在“Messages”列表框中选择BN_CLICKED,单击“Add
Function”按钮,或直接双击“Messages”列表框中的BN_CLICKED,弹出Addcommber function
对话框,单击“OK”按钮就可以创建一个名称为OnOK 的消息处理函数。单击“Edit Code”
按钮,退出ClassWizard,并自动打开LoginDialog.cpp 文件,且定位在OnOK()函数上。
为OnOK()函数添加如下代码:
void CLoginDialog::OnOK()
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·72·
{
// TODO: Add extra validation here
//以下添加用户名和密码的验证过程
//注意,在对话框的OnOK 函数中自动调用CDialog::UpdateData(TRUE),
//即自动更新控件变量的值
//本例为简单起见,合法的用户名只能是user,对应密码为test1234
if (m_szLoginNcom == "user" && m_szPassword == "test1234")
{
//验证通过,并提示用户
//MessageBox 是Windows 系统的消息对话框,用于提示简单的消息,
//具体内容可以参考本章的最后一节
MessageBox("用户验证通过", "登录提示",MB_OK);
}
else
{
//验证不通过
//提示用户
MessageBox("用户验证失败", "登录提示",MB_OK);
//退出主程序
AfxGetMainWnd()->PostMessage(WM_QUIT);
//返回登录失败
//EndDialog 退出对话框,参数表示对话框的返回值,本例
//用"取消"按钮的ID 作为验证失败返回值
EndDialog(IDCANCEL);
}
//默认的消息处理函数,用于退出对话框,返回值为IDOK
CDialog::OnOK();
}
技巧:一般要退出程序,只需要销毁该程序的主窗口,即向该程序的主窗口发送WM_QUIT 消息,
代码为AfxGetMainWnd()->PostMessage(WM_QUIT);。
(4)按前面所述方法,打开“ClassWizard”对话框,为CLoginDialog 的IDCANCEL 按
钮控件的BN_CLICKED 消息添加消息处理函数OnCancel()。在程序中单击“取消”按钮与
验证失败的处理方法相同,因此修改CLoginDialog::OnCancel()函数,代码如下:
void CLoginDialog::OnCancel()
{
// TODO: Add extra cleanup here
//验证不通过
//提示用户
枫叶文学网www.fywxw.com
第4 章 对话框
·73·
MessageBox("用户验证失败", "登录提示",MB_OK);
//退出主程序
AfxGetMainWnd()->PostMessage(WM_QUIT);
//默认的消息处理函数,用于退出对话框,返回值为IDCANCEL,
//同本例的OnOK 验证失败的返回值
CDialog::OnCancel();
}
添加控件通知消息处理函数后,对话框类的创建任务基本完成,对话框类能基本实现对
话框所需的功能。
4.2 模态对话框
Windows 系统中对话框大致可以分为以下两种:
? 模态对话框。这类对话框弹出后,其他程序会被挂起,只有当前对话框响应用户的输
入。模态对话框一般要求用户做出某种选择。
? 非模态对话框。打开非模态对话框后,程序的其他窗口仍能响应消息,程序仍可以继
续运行。非模态对话框一般用来显示信息,或者实时地进行一些设置。
实例4-2:创建模态对话框实例。源代码在光盘中“\04\实例4-2\Sample4_1”目录下。
本节还以实例Sample4_1 为例,具体讲解模态对话框的创建步骤。
1.创建对话框类
按照4.1 节所述的方法创建对话框类和对话框资源,Sample4_1 的对话框资源和对话框
类在前面已经创建,这里不再详述。
2.创建对话框类的实例并初始化
首先创建对话框类的对象。在Sample4_1 中,为了在程序运行最开始完成登录功能,可
以在主窗口创建时显示登录对话框。创建CLoginDialog 实例的过程如下:
(1)在IDE 左侧工作区,单击“FileView”选项卡,展开Sample4_1 files 节点,然后展
开Source Files 节点,双击其中的MainFrm.cpp 文件,进入MainFrm.cpp 编辑界面,在文件头
部其他#include 语句加入下面的包含语句:
#include "LoginDialog.h"
(2)在IDE 左侧工作区,单击“ClassView”选项卡,展
松语文学免费小说阅读_www.16sy.com