1. 程式人生 > >【MFC-10】VS2010/MFC基於對話方塊程式的登入視窗實現

【MFC-10】VS2010/MFC基於對話方塊程式的登入視窗實現

一、開發環境

1、VS2010;

2、C++ / MFC;

二、登入視窗設計示例

1、新建基於對話方塊的MFC專案,命名為“UserLogin”;

2、資源檢視中插入一個Dialog,修改ID為:IDD_LOGIN_DIALOG,標題修改為登入對話方塊,並新增控制元件,結果如圖1所示;


圖1

3、建立登入對話方塊類:CLoginDlg,新增控制元件變數如圖2所示;


圖2

4、將對話方塊類標頭檔案新增到UserLogin.cpp;

// UserLogin.cpp : 定義應用程式的類行為。
//

#include "stdafx.h"
#include "UserLogin.h"
#include "UserLoginDlg.h"
#include "LoginDlg.h"

5、修改UserLogin.cpp函式BOOL CUserLoginApp::InitInstance()如下:

BOOL CUserLoginApp::InitInstance()
{
	// 如果一個執行在 Windows XP 上的應用程式清單指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本來啟用視覺化方式,
	//則需要 InitCommonControlsEx()。否則,將無法建立視窗。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 將它設定為包括所有要在應用程式中使用的
	// 公共控制元件類。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	AfxEnableControlContainer();

	// 建立 shell 管理器,以防對話方塊包含
	// 任何 shell 樹檢視控制元件或 shell 列表檢視控制元件。
	CShellManager *pShellManager = new CShellManager;

	// 標準初始化
	// 如果未使用這些功能並希望減小
	// 最終可執行檔案的大小,則應移除下列
	// 不需要的特定初始化例程
	// 更改用於儲存設定的登錄檔項
	// TODO: 應適當修改該字串,
	// 例如修改為公司或組織名
	SetRegistryKey(_T("應用程式嚮導生成的本地應用程式"));

	<span style="color:#ff0000;">// 登入對話方塊,系統登入
	CLoginDlg loginDlg;
	if(loginDlg.DoModal() == IDOK)
	{
		CUserLoginDlg dlg;
		m_pMainWnd = &dlg;
		INT_PTR nResponse = dlg.DoModal();
		if (nResponse == IDOK)
		{
			// TODO: 在此放置處理何時用
			//  “確定”來關閉對話方塊的程式碼
		}
		else if (nResponse == IDCANCEL)
		{
			// TODO: 在此放置處理何時用
			//  “取消”來關閉對話方塊的程式碼
		}
	}
	else
	{
		return FALSE;
	}</span>

	//CUserLoginDlg dlg;
	//m_pMainWnd = &dlg;
	//INT_PTR nResponse = dlg.DoModal();
	//if (nResponse == IDOK)
	//{
	//	// TODO: 在此放置處理何時用
	//	//  “確定”來關閉對話方塊的程式碼
	//}
	//else if (nResponse == IDCANCEL)
	//{
	//	// TODO: 在此放置處理何時用
	//	//  “取消”來關閉對話方塊的程式碼
	//}

	// 刪除上面建立的 shell 管理器。
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// 由於對話方塊已關閉,所以將返回 FALSE 以便退出應用程式,
	//  而不是啟動應用程式的訊息泵。
	return FALSE;
}

6、登入對話方塊新增“登入按鈕”訊息響應;

void CLoginDlg::OnBnClickedOk()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	this->UpdateData(true);
	if(this->m_UserName.IsEmpty() || this->m_UserPassword.IsEmpty())
	{
		MessageBox(_T("使用者名稱或密碼不能為空,請重新輸入!"),_T("使用者登入資訊"),MB_ICONINFORMATION);
		return;
	}
	else if(this->m_UserName == "Admin" && this->m_UserPassword == "12345")
	{
		CDialogEx::OnOK();
	}
	else
	{
		MessageBox(_T("使用者名稱或密碼不正確,請重新輸入!"),_T("登入失敗"),MB_ICONERROR);
		return;
	}
}

7、生成 ---> 生成解決方案,執行即可測試。

備註:

1)輸入密碼處的編輯框修改屬性:“Password”為“True”;

2)實現登出登入:在主對話方塊中新增“登出”按鈕及其訊息響應;

void CUserLoginDlg::OnBnClickedButtonLogout()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	ShowWindow(SW_HIDE);

	CLoginDlg loginDlg;
	loginDlg.m_LoginType = 3;
	if (IDOK == loginDlg.DoModal())
	{
		Sleep(100);
		ShowWindow(SW_SHOW);
	}
	else
	{
		PostQuitMessage(0);
	}
}

3)使用者名稱和密碼登入資訊可以採用資料庫形式儲存,具體可參考本人其他微博文章內容。