码迷,mamicode.com
首页 > 编程语言 > 详细

【mfc】用对话框分页实现用户登录

时间:2015-01-03 23:57:35      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:c++   mfc   win32   登录程序   对话框   

所谓的对话框分页就是点击完一个对话框的按钮,切换到另一个对话框,

这样的对话框多用于一些需要用户登录才能够进行操作的软件,

下面就用对话框分页来实现用户登录系统


一、基本目标

有如下的程序,输入用户名与密码,如果用户名为admin,密码为123456,那么则成功登录,切换到一个有“欢迎登录”与“关闭”按钮的对话框

技术分享

如果用户名或者密码输入错误则弹出提示,

技术分享

点击关闭能够关闭这个程序,不弹出用户登录的对话框。


二、制作过程

1、首先如同之前的《【mfc】对于对话框程序的优化与为程序创建图标》(点击打开链接)一文那样,创建简单的WIN32程序与资源脚本,则如同《【mfc】基本对话框程序——加法器》(点击打开链接)一文在创建的资源脚本中插入两个对话框IDD_DIALOG1、IDD_DIALOG2,都是系统默认的名称


2、其中IDD_DIALOG1如下图所示:

技术分享

放好两个“用户名”与“密码”的静态文本,把对话框标题改成“用户登录”,并且勾选”居中”属性,让这个对话框一打开就居中,自带的“确定”与“取消”按钮,分别改为“登录”与“关闭”,并利用下方的控件对齐工具把控件的布局放好。

其中”密码“旁边的编辑框,要改成密码项:

技术分享

双击这个编辑框,在”样式“标签页勾选”密码“

并且,为了一打开程序,光标就放在“用户名”旁边的编辑框,在放好控件位置之后,按CTRL+D,会出现如下的界面:

技术分享

图上的数字表示,默认是放在“登录”按钮上面的,键盘按一次TAB而切到“关闭”按钮,

此时,依然点击“用户名”的静态文本及其旁边的编辑框,“密码“的静态文本及其旁边的编辑框,”登录“按钮,”关闭“按钮,把数字改成如下所示:

技术分享


3、在于资源脚本处插入第二个对话框IDD_DIALOG2,改好标题,拖入静态文本,去掉自带的”确定“按钮,把”取消“改为”关闭“,如下图所示,就可以切换WinMain函数处写代码了。

技术分享


4、WinMain函数的代码如下所示:

// dialogbox.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
//一开始记得要引入resource.h,因为我们的对话框就创建在资源脚本中
#include "resource.h"

//这是登录对话框的回调函数
BOOL CALLBACK Dlg1(
HWND hwndDlg, // handle of dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
	//如果点击了按钮
	if(uMsg==WM_COMMAND){
		//如果点击的是IDCANCEL按钮,也就是“关闭”按钮,就返回一个IDCANCEL值,也就是2,并且关闭这个对话框
		if(LOWORD(wParam)==IDCANCEL){
			EndDialog(hwndDlg,IDCANCEL);
		}
		//如果点击的是IDOK按钮,也就是“确定”按钮
		if(LOWORD(wParam)==IDOK){
			//与String username;没有区别,只是char username[20]限定这个字符串长20
			char username[20];
			char pwd[20];
			//取出IDC_EDIT1的值,放到username字符串中,且仅截取前20个字符
			GetDlgItemText(hwndDlg,IDC_EDIT1,username,sizeof(username));
			//取出IDC_EDIT2的值,放到pwd字符串中,且仅截取前20个字符
			GetDlgItemText(hwndDlg,IDC_EDIT2,pwd,sizeof(pwd));
			//对比字符串请用strcmp(a,b)是否等于0的函数,直接==是不行的,不要犯C语言中常犯的错误
			if( strcmp("admin",username)==0 && strcmp("123456",pwd)==0 ){
				//如果输入的用户名与密码同时等于admin与123456,那么关闭这个对话框,并返回一个IDOK值,也就是1
				EndDialog(hwndDlg,IDOK);
			}
			else{
				//如果输入用户名与密码不是这两个值,那么则弹MB_OK类型的窗。这里不关闭这个窗口。
				MessageBox(hwndDlg,"用户名或者密码错误!","用户登录",MB_OK);
			}
		}
	}
	return 0;
};

//这是欢迎登录对话框的回调函数
BOOL CALLBACK Dlg2(
HWND hwndDlg, // handle of dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
	//逻辑很简单,如果用户点击了“关闭”按钮,那么关闭这个对话框
	if(uMsg==WM_COMMAND){
		if(LOWORD(wParam)==IDCANCEL){
			EndDialog(hwndDlg,IDCANCEL);
		}
	}
	return 0;
};

//这是程序的主要入口
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	//DialogBox调出IDD_DIALOG1,并且其处理函数为Dlg1回调函数,调用完Dlg1回调函数之后,会产生返回值
	int dRet = DialogBox(hInstance,(LPCSTR)IDD_DIALOG1,NULL,Dlg1);
	//如果这个返回值是IDCANCEL,也就是用户点击了“关闭”按钮,可以直接在WinMain中返回-1,不执行下面的所有代码
	if(dRet==IDCANCEL){
		return -1;
	}
	//弹出IDD_DIALOG2,并且其处理函数为Dlg2回调函数
	DialogBox(hInstance,(LPCSTR)IDD_DIALOG2,NULL,Dlg2);
	return 0;
}

(1)这次由于是两个对话框,因此会有两个回调函数,也就是对话框的处理函数,同时注意WinMain中会有两条第四个参数分别不同的DialogBox调用语句。

(2)对比与《【mfc】基本对话框程序——加法器》(点击打开链接)一文的代码,改进了:EndDialog(hwndDlg,IDCANCEL);之后无需return任何东西,这个return也没有任何意义,EndDialog的第二个参数就是给DialogBox调用语句的值,IDCANCEL是一个值为2的整形int的全局宏#define。

(3)if(uMsg==WM_COMMAND){}中多个if条件结构可以改写成switch-case-break;条件结构,这个看个人编程习惯。

(4)这次取编辑框的值,用到了GetDlgItemText而不是《【mfc】基本对话框程序——加法器》(点击打开链接)一文的GetDlgItemInt,因为这次输入的不是数字。

(5)MessageBox函数已经在《【mfc】Helloworld》(点击打开链接)一文与《【mfc】对于对话框程序的优化与为程序创建图标》(点击打开链接)一文中叙述,这里不再赘述

【mfc】用对话框分页实现用户登录

标签:c++   mfc   win32   登录程序   对话框   

原文地址:http://blog.csdn.net/yongh701/article/details/42373263

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!