首页 > 代码库 > 【mfc】用对话框的切换实现重新登录

【mfc】用对话框的切换实现重新登录

上次《【mfc】用对话框分页实现用户登录》(点击打开链接)是一个实现对话框分页登录的Win32程序,与mfc一点关系都没有,虽然Win32程序是mfc程序的基础,但是在mfc中怎么能够实现对话框的切换呢?同时,这个程序实现重新登录,能够灵活在不同对话框中实现切换。


一、基本目标

1、本程序点退出能够成功退出,这是当然的

技术分享

2、用户在用户名输入admin密码输入123才能够正常登录,否则弹出对话框的提示

技术分享

3、登录之后,点击重新登录按钮能够回到登录框,而且,这个登录框的功能如常,点击“登录”先判断用户名与密码有没有输入出错再登录,点击“退出”再退出整个程序

技术分享


二、制作过程

1、在MFC新建一个如下的对话框,并设置成如下的布局,而且焦点按顺序摆放,也就是对话框默认选项是输入用户名,而不是登录按钮。把原来自带的取消按钮改为退出,把原来自带的确认按钮改成登录。同时把标题改成“用户登录”。密码的编辑框样式是“密码”。这一部分具体怎么操作,在《【mfc】用对话框分页实现用户登录》(点击打开链接)已经讨论过,不再赘述,过程是完全与Win32程序的制作一模一样。

技术分享

2、按Ctrl+W或者点击“查看”->“新建类向导”,为这个对话框建立一个类,新建类向导一开始会弹出一个对话框,点击OK之后弹出如下的界面:

技术分享

在Name输入一栏输入好本对话框的名称,比如上图的CLoginDlg,一般以CxxDlg作为一个对话框的名字,而且xx中首字母要大写,以后在程序要使用到这个对话框,则使用CLoginDlg做类声明。因此,为了你的程序做得复杂的时候,还能够无须通过注释,意识到是这个对话框,请不好把这个对话框命名成a之类。

3、为登录对话框新建了类之后,在左边的FileView视图能够在SourceFiles下面多出了LoginDlg.cpp,而且在HeaderFiles下面多出了LoginDlg.h两个文件,以后如果要使用到登录对话框,除了使用CLoginDlg做类声明,还要在相应的文件处引用#include "LoginDlg.h",否则报错,因为CLoginDlg就在LoginDlg.h里面

技术分享

4、之后切换回ResourceView中的登录对话框,双击登录按钮,为登录按钮新增类映射函数,具体怎么操作,在《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接)中已经提过。

对于登录按钮,函数void CLoingDlg::OnOK()如下:

void CLoginDlg::OnOK() 
{
	// TODO: Add extra validation here
	CString sid,spwd;
	GetDlgItemText(IDC_EDIT1,sid);
	GetDlgItemText(IDC_EDIT2,spwd);
	if(sid=="admin"&&spwd=="123")
		//关闭这个对话框,并且向DoModal()返回IDOK
		CDialog::OnOK();
	else
		AfxMessageBox("用户名或者密码错误!");
}

先取出两个对话框的值进行判断。如果符合条件则关闭这个对话框,并向其他文件的中CLoginDlg的DoModal()方法送出IDOK的返回值

5、取消按钮由于是自带的退出按钮改过来的,因此无需任何操作。之后进入到主对话框的编辑,对于主对话框的操作,不要这么快就删除里面的所有对象,对于里面的确定与取消按钮,我们要先给它添加消息映射函数,以防用户用键盘上的Esc或者点击这个对话框的任何一部分就关闭这个对话框。同时,本对话框的关闭按钮也要删去,关闭按钮的控制在对话框的样式里面的“系统菜单”。

技术分享

6、一开始双击自带的“确定”或者“取消”按钮的任意一个,可能会弹出类向导,这时,在弹出的类向导中点击Cancel,再双击这两个按钮则可以为它们新建消息映射函数,实质上也不是说新建,主要是改写:

技术分享

默认这两个函数是有CDialog::OnCancel();与CDialog::OnOK();两个函数的,如果你不为它们添加相应的消息映射函数,也就是改写他们的消息映射函数的话,它们的默认消息函数也就如此,用户可以用键盘上的Esc或者点击这个对话框的任何一部分就关闭这个对话框。把这两行注释掉或者删去重新回到ResoureView下面布局如下,删去这自带的所有东西,把这个对话框的标题改成“控制面板”,拉出四按钮,这里主要实现的是“重新登录”与“退出”,其它的功能今后开文章再讲,至于怎么拉,实在是太基础了,不会可以看我之前的《【mfc】基本对话框程序——加法器》(点击打开链接):

技术分享

7、这个对话框就是一开始新建项目就有的主对话框,因此无需为此添加类向导,默认就有两个类,在ClassView试图就能够发现了。双击“退出”按钮,为其添加如下函数:

void CIsysDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	//就是一个退出,不用任何的值
	EndDialog(-1);
}
切记这里必须用EndDialog(-1)来结束程序,而不是CDialog::OnCancel();因为这样才能够彻底销毁程序,使用CDialog::OnCancel();有可能对话框不见了,但整个程序依旧留在线程列表中,也就是还没有退出。

8、重新登录按钮的消息映射函数如下:

#include "LoginDlg.h"
void CIsysDlg::OnButton1() 
{
	//先把本对话框隐藏
	ShowWindow(SW_HIDE);
	//再弹出登录对话框
	CLoginDlg dlg;
	//最后重新显示本对话框,如果没有登录成功,用户点了“取消”,那么由于登录对话框返回IDCANCEL,EndDialog(-1);能够退出整个程序
	if(IDCANCEL==dlg.DoModal())
		EndDialog(-1);
	else
		ShowWindow(SW_SHOW);
}
正如上面所说由于使用到那个登录对话框,因此,必须要用CLoginDlg声明一个所谓是这个对话框的“句柄”,并且引入这个对话框的头文件,才能彻底操作这个对话框,如下面的dlg.DoModal()操作。其余的操作你不写是那个对话框,就默认是本对话框。

至此,整个程序做完!


【mfc】用对话框的切换实现重新登录