user.mdb复制到根目录下面,里面有用户名和密码信息
添加资源,插入一个dialog,ID为IDD_LOGIN,添加类CLOGIN,自动生成头文件和源文件,将两个文件内容进行更改如下:
LOGIN.h:
#pragma once
// CLOGIN 对话框
class CLOGIN : public CDialog
{
DECLARE_DYNAMIC(CLOGIN)
public:
CLOGIN(CWnd* pParent = NULL); // 标准构造函数
virtual ~CLOGIN();
// 对话框数据
enum { IDD = IDD_LOGIN };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnClickedLogin();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
CString m_password;
CString m_username;
};
LOGIN.cpp:
// LOGIN.cpp : 实现文件
//
#include "stdafx.h"
#include "ChatClient.h"
#include "LOGIN.h"
#include "afxdialogex.h"
// CLOGIN 对话框
IMPLEMENT_DYNAMIC(CLOGIN, CDialog)
CLOGIN::CLOGIN(CWnd* pParent /*=NULL*/)
: CDialog(CLOGIN::IDD, pParent)
//, m_password(_T(""))
{
m_username = _T("");
m_password = _T("");
}
CLOGIN::~CLOGIN()
{
}
void CLOGIN::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_USERNAME, m_username);
DDX_Text(pDX, IDC_PASSWORD, m_password);
}
BEGIN_MESSAGE_MAP(CLOGIN, CDialog)
ON_BN_CLICKED(IDC_LOGIN, &CLOGIN::OnClickedLogin)
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CLOGIN 消息处理程序
void CLOGIN::OnClickedLogin()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
_ConnectionPtr pConn;
_RecordsetPtr pRst;
try{
CoInitialize(NULL);
//CoUninitialize();
pConn.CreateInstance("ADODB.Connection");
//pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=E:\\2010\\SQL\\db\\Diary.mdb";
pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=.\\db\\user.mdb";
//pConn->ConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.\\db\\Diary.accdb;Persist Security Info=False";
pConn->Open("","","",adConnectUnspecified);
}catch(_com_error e)
{
AfxMessageBox(e.Description());
}
pRst.CreateInstance(__uuidof(Recordset));
pRst=pConn->Execute("select * from user_info",NULL,adCmdText);
_bstr_t username;
_bstr_t password;
int i=0;
while(!pRst->adoEOF)
{
username=pRst->GetCollect("username");
password=pRst->GetCollect("password");//GetCollect里面的password表示数据库中的password项
//username=(_bstr_t)pRst->GetCollect("username");
if(strcmp(username,m_username)==0 &&strcmp(password , m_password)==0)
{
this->OnOK();
//this->OnClose();
i=1;
// CSMDlg dlg;
// dlg.DoModal();
//CSMDlg main=new CSMDlg main;
// main.DoModal();
/*CLOGIN::DestroyWindow();*/
break;
}
pRst->MoveNext();
}
if(i==0)
{
MessageBox("用户名或密码错误");
}
/*******************关闭数据库*****************/
if(pRst!=NULL)
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
CoUninitialize();
}
BOOL CLOGIN::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bitmap; //创建位图
bitmap.LoadBitmap(IDB_BITMAP1); //载入位图
BITMAP bmp; //构造结构体
bitmap.GetBitmap(&bmp); //用位图信息填充结构体
CDC dcCompatible; //CDC类的兼容dc
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap); //将位图选入设备描述表
CRect rect;
GetClientRect(&rect);
//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,.0,0,SRCCOPY);//1:1显示
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);//放缩全屏显示
return TRUE;//这一步不能忘记,不是默认的return
//return CDialog::OnEraseBkgnd(pDC);
}
HBRUSH CLOGIN::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC)//设置窗口背景透明效果,字体颜色
{
pDC->SetBkMode(TRANSPARENT); //透明
pDC->SetTextColor(RGB(0,0,0));//静态文本框字体颜色
// CFont * cFont=new CFont;
// cFont->CreateFont(8,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS,"Arial");
// pWnd->SetFont(cFont);
}
// TODO: Return a different brush if the default is not desired
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
//return hbr;
}
添加两个编辑框,ID分别为IDC_USERNAME(Static Edge 为True)、IDC_PASSWORD(Static Edge 和Password为True),登录按钮ID为IDC_LOGIN,同时添加一个位图资源,IDB_BITMAP1
1、在ChatClient.cpp中,更改BOOL CChatClientApp::InitInstance()
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CLOGIN logindlg;
if (logindlg.DoModal() == IDOK)
{
CChatClientDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
};
//CChatClientDlg dlg;
//m_pMainWnd = &dlg;
//INT_PTR nResponse = dlg.DoModal();
//if (nResponse == IDOK)
//{
// // TODO: 在此放置处理何时用
// // “确定”来关闭对话框的代码
//}
//else if (nResponse == IDCANCEL)
//{
// // TODO: 在此放置处理何时用
// // “取消”来关闭对话框的代码
//}
//else if (nResponse == -1)
//{
// TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
// TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
//}
//// 删除上面创建的 shell 管理器。
//if (pShellManager != NULL)
//{
// delete pShellManager;
//}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
2、更改stdafx.h
在末尾加上这段语句
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")