对话框是实现人机交互的重要工具,Visual C++的对话框类似于VB或Delphi的form,对话框和各种控件的结合使用,可以建立形形色色的功能十分强大的应用程序窗口界面,这就是所谓的对话框编程技术。
应用程序中需要各种各样的对话框,例如:消息对话框、口令对话框、进度条对话框,属性页对话框,表单对话框以及各种通用对话框(文件对话框、字体对话框、颜色对话框等)。
从执行方式又可将对话框分为模态和非模态两大类,模态对话框执行期间独占系统资源,只有在关闭之后,才可以执行程序的其它部分;非模态对话框执行期间,允许程序的其它部分同时执行。
一、口令对话框
要求:创建一个多文档工程项目,在该项目中添加一个口令对话框,以防止非法用户侵入。
1.建立多文档应用程序框架(工程)
操作过程略
2.编辑对话框资源
(1)在IDE的工作区中选择Resource View标签,可以在该标签页中查阅、编辑项目的各种资源;
(2)选择Dialog条目,单击鼠标右键,弹出快捷菜单,执行Insert Dialog命令,此时在Dialog条目下自动增加一个标识号(id)为IDD_DIALOG1 的条目,同时在客户区中显示对话框资源的框架。
(3)移动鼠标到对话框资源上,单击鼠标右键,在弹出的快捷菜单上执行“Properties”命令,弹出“Dialog Properties”对话框。
(4)利用“Dialog Properties”对话框进行对话框属性、风格等的设置:
a. 将默认的对话框资源标识号IDD_DIALOG1改为IDD_PASSWORD_DIALOG;
b. 将对话框的标题改为口令。
(5)调整对话框上各个控件的布局并编辑各个控件的属性
a. 利用鼠标拖动操作将两个按纽控件移动到对话框的底部。
b. 在“Push Button Properties”对话框的“General”标签页中将两个按纽的Caption属性分别改为确认和取消。(在选中的按纽上单击右键并所弹出的快捷菜单上执行“Properties”命令即可进入该对话框)。
(6)在对话框资源上增加新的控件
需要增加的控件有:显示“请输入口令”的Static Text控件,对口令内容作简要说明的Static Text控件,口令输入框—Edit Box控件。
增加控件的操作:
在Control工具栏中对应的控件上单击左键,表示选中该控件;
在对话框的对应位置上拖动鼠标以确定控件放置位置和控件大小;
修改Static Text控件的Caption属性值,例如改为请输入口令;
将作为口令输入框的Edit Box控件的ID标识改为IDC_PASSWORD_EDIT,并在Styles标签中选中Password属性,以将输入风格设置为口令风格(用*代替所输入的字符)。
注意:进入控件属性对话框的“Extended Styles“标签页,可以进一步设置控件的风格,例如对Static Text Clientedge、Static edge和Modal frame等属性,达到如下图所示的效果:
(7)执行Layout菜单上的Tab Order命令以调整对话框上各个控件的激活顺序。调整时只须按需要的顺序单击对话框上的各个控件即可,控件左上角所显示的数字即表示激活顺序。
(8)单击“Dialog工具栏(在IDE窗口的下方)中的Test按纽进行对话框效果测试。
3.创建对话框类并添加代码
1)创建对话框类cPasswordDialog
操作步骤如下:
(1)在对话框资源上单击右键,在弹出的快捷菜单上选择并执行“Class Wizard”命令(也可直接View| Class Wizard),弹出“MFC Class Wizard”对话框,并紧接着弹出“Adding Class”对话框(仅当系统检测到有新建的对话框资源、菜单资源等,并且该资源尚未与相应的类建立关联,系统就会自动弹出时“Adding Class”对话框,询问是否建立新类)。
(2)在“Adding Class”对话框中直接单击“OK”按钮(确认默认选择Create anew class),进入“New Class”对话框,在New编辑框中输入类名:cPasswordDialog,其它设置均为默认值。单击“OK”按钮后进入“MFC Class Wizard”对话框(该对话框中Projects项的值为Diaolg、Class name项的值为cPasswordDialog均无须改变)。
(3)进入“MFC Class Wizard”对话框的“Member Variablee”标签页,选中Control IDs框中的IDC_PASSWORD_EDIT条目,单击“Add Variable”按钮,弹出“Add Variable”对话框。
(4)在“Add Variable”对话框中添加cPasswordDialog类的数据成员m_Password,并将该成员与Edit box控件(用作口令输入框)建立关联,该变量用来保存用户输入的口令,所以数据类型int。
(5)单击“OK”按钮,返回“MFC Class Wizard”对话框,在“Member Variablee”标签页下部新增的Minimum value、和Maximun value两个项目中分别设置口令的最小值(0)和最大值(9999),单击“OK”按钮。至此,cPasswordDialog类创建完毕,一旦创建了该类的对象后,就可以使用口令对话框了。
2)添加代码
该段代码用来创建口令对话框对象并处理用户的各种交互(例如单击“确认”按钮或“取消”按钮,输入正确的口令或输入不正确的口令,对话框对象所必须进行的处理)。
由于口令输入和验证一般都程序开始时执行,也即该对话框必须在程序窗口出现之前就提前出现,所以必须在应用程序类(CDialogApp)的InitInstance()函数中添加完成上述处理的代码:
BOOL CDialogApp::InitInstance()
{
……
pMainFrame->UpdateWindow();
cPasswordDialog cDlg;//声明CPasswordDialog类的一个对象
if (cDlg.DoModal ()==IDOK) //用户按下确认按钮
{
if (cDlg.m_Password!=1925 ) //口令为整数1925
{ //如果口令不对,则显示出错信息,然后程序结束
AfxMessageBox("口令错误,确定后将退出程序。");
return FALSE;
}
}
else //如果按下取消按钮,程序也将结束
return FALSE;
return TRUE;
}
具体操作步骤如下:
(1) 在工作区的Class View标签中选中Dialog|CDiaologApp|InitInstance()函数并双击左键,客户区中显示InitInstance()函数的代码;
(2) 在InitInstance()函数中增加新的代码;
(3) 在文件Dialog.cpp的头部加入下面的命令行:
#include “cPasswordDialog.h”
可以直接打开Dialog.cpp文件进行添加,也可以双击Globals中的The App,即可打开Dialog.cpp文件。
4. 编译、链接Dialog项目(Build Dialog)。
5. 运行Dialog项目。
二、消息对话框
1.消息对话框的作用
消息对话框用来向用户显示一些询问和选择、警告和错误提示等信息,也可以在程序调试时,显示变量的值。
消息对话框上的主要控件:欲显示的信息内容(字符串)、图标、按纽。
2.创建消息对话框的函数
通过调用AfxMessageBox()函数或MessageBox()函数都可以创建消息对话框。
例如函数:
AfxMessageBox("您确实要取消吗?",MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2)
被调用后,将显示如下的对话框:
CDialogApp::InitInstance()函数加入该对话框的显示和处理后的代码如下:
BOOL CDialogApp::InitInstance()
{
……
pMainFrame->UpdateWindow();
cPasswordDialog cDlg;//声明CPasswordDialog类的一个对象
while (1)
{
if (cDlg.DoModal ()==IDOK) //用户按下确认按钮
{
if (cDlg.m_Password!=1925 ) //口令为整数1925
{ //如果口令不对,则显示出错信息,然后程序结束
AfxMessageBox("口令错误,确定后将退出程序。");
return FALSE;
}
else
break;
}
else //如果按下取消按钮,程序也将结束
{
if(AfxMessageBox("您确实要取消吗?",MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2)==IDYES)
return FALSE;
}
}
return TRUE;
}
3.AfxMessageBox函数简介
1)原型
int_cdecl AfxMessageBox (
unsigned short *, //指向显示信息字符串的指针(可以直接给出字符串常量)
unsigned int,//消息对话框风格
unsigned int
}
消息对话框风格是指其上的图标类型和按钮类型的组合。各种图标类型和按钮类型都用整型符号常量表示,可以使用加法运算符(+)或位或运算符(|)实现组合。例如:
MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2
2)图标类型
3)按钮类型
4)函数返回值
如下表所示: