MFC连接access制作登录界面

1.创建一个数据库表

user.mdb复制到根目录下面,里面有用户名和密码信息

2.创建一个登录对话框

添加资源,插入一个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;
}

3.添加控件

MFC连接access制作登录界面_第1张图片
添加两个编辑框,ID分别为IDC_USERNAME(Static Edge 为True)、IDC_PASSWORD(Static Edge 和Password为True),登录按钮ID为IDC_LOGIN,同时添加一个位图资源,IDB_BITMAP1

4.具体实现

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")

5.测试效果

MFC连接access制作登录界面_第2张图片
MFC连接access制作登录界面_第3张图片
MFC连接access制作登录界面_第4张图片

你可能感兴趣的:(01MFC/VS2013编程)