////////////////2015/07/21//////////////
///////////////by xbw/////////////////////
//////////////环境 VS2013///////////
这个数据库的调用是关于登陆界面注册账户的,,,
先上几张图来看一下效果吧,,,,
哈哈,效果还不错吧,下面我就详细说一下怎么调用跟建立数据库,用的是ACCESS数据库;
这个呢想一下先,有哪几部分呢,
首先呢这个账号注册这个用的是哪个控件呢,很明显 SysLink ,这个看着是不是很有感觉呢,然后我们建好了再去编辑哦,我们点一下账号注册,可定会有注册对话框的弹出,这样的话,我们就需要在资源视图中创建新的对话框了,
对话框的规划自己来,怎么好看怎么弄,由于时间原因,这个北背景贴图等没有添加,这样只要具备注册账号跟注册密码就好了,再加上确定跟取消。 弄好了之后,要给这个对话框建一个类,这个类呢,还是因为英语不好,我取名了zhuce,浅显易懂吧;;;
然后呢,我们要在编辑框中添加变量, 在控件中改成value,这样,选择CString我们才可以对字符串的存储;;;;
这两个添加变量分别为,m_regname,m_regpsw。这个名字随便弄,但是后边要用到,为了方便操作,跟着我这样起名字吧,,,我们把注册存储数据库编辑在确定按钮中,下面直接上代码了,,
UpdateData(true);
UpdateData(true);//这一行怎么断开了,你们知道就好了,跟下边连在一起的;;;
CString Filepath = _T("Database.mdb"); CString Sname; CDaoDatabase db; _variant_t varname; CDaoRecordset Dbset(&db); db.Open(Filepath); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0); varname = Dbset.GetFieldValue(_T("Name")); Sname = (LPCSTR)_bstr_t(varname); if (m_regname.IsEmpty() || m_regpsw.IsEmpty()) { MessageBox(_T("信息不能为空!"), _T("温情提示")); } else { if (Sname.Compare(m_regname) != 0)//如果输入框中的名字在数据库里不存在 { Dbset.Edit();//因为表里只允许有一个数据,所以就将新数据代替旧数据 Dbset.SetFieldValue(_T("Name"), _variant_t(m_regname)); Dbset.SetFieldValue(_T("Psw"), _variant_t(m_regpsw)); Dbset.Update(); MessageBox(_T("用户注册成功!"), _T("温情提示")); } else//如果输入的名字和数据库里的一致,则提示存在该用户 { MessageBox(_T("该用户已存在!"), _T("温情提示")); //其实应该添加一个修改密码的功能的,这里就不加了,因为修改密码只要光改变密码就可以,不需要改用户名,比注册还简单一步 } } Dbset.Close(); db.Close();
别忘了最重要的#include "afxdao.h",这是SQL DAO的头文件,具体什么情况请问度娘;;;;
这样的话,注册就好了;;;
下面呢,我们进行登陆界面的账号跟密码与数据库的对比,如果匹配,那就登入成功,否则,失败;;;
在上一篇文章中,我还建了一个类,这个类是登陆界面对话框的类,
请看上一张,这里呢跟上一张有所不同,上一张直接是固定的密码账号,没办法注册,这里呢仍然差不多,只需稍加修改,还是我的loading类,嘿嘿,
这里呢,编辑框内也需要添加变量,变量的名呢,m_logname,m_logpsw;
请看代码
// loading.cpp : 实现文件 // #include "stdafx.h" #include "PlaneGame.h" #include "loading.h" #include "afxdialogex.h" #include "afxdao.h" #include "zhuce.h" // loading 对话框 IMPLEMENT_DYNAMIC(loading, CDialogEx) loading::loading(CWnd* pParent /*=NULL*/) : CDialogEx(loading::IDD, pParent) , open(false) , open1(false) , m_logname(_T("")) , m_logpsw(_T("")) { } loading::~loading() { } void loading::DoDataExchange(CDataExchange* pDX) { DDX_Text(pDX, IDC_EDIT3, m_logname); DDX_Text(pDX, IDC_EDIT4, m_logpsw); } BEGIN_MESSAGE_MAP(loading, CDialogEx) ON_WM_NCHITTEST() ON_WM_CTLCOLOR() ON_BN_CLICKED(IDCANCEL, &loading::OnBnClickedCancel) ON_BN_CLICKED(IDOK, &loading::OnBnClickedOk) ON_BN_CLICKED(IDOK2, &loading::OnBnClickedOk2) ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &loading::OnNMClickSyslink1) ON_NOTIFY(NM_CLICK, IDC_SYSLINK2, &loading::OnNMClickSyslink2) END_MESSAGE_MAP() // loading 消息处理程序 //鼠标拖动窗口移动 CDaoDatabase db; //数据库 CDaoRecordset RecSet(&db); //记录集 LRESULT loading::OnNcHitTest(CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 ScreenToClient(&point); CRect rc; GetClientRect(&rc); if (rc.PtInRect(point)) { return HTCAPTION; } else { return CDialogEx::OnNcHitTest(point); } } HBRUSH loading::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { //HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); //CFont font; //font.CreatePointFont(200, _T("宋体"), NULL); //GetDlgItem(IDC_STATIC)->SetFont(&font); // TODO: 在此更改 DC 的任何特性 //在OnInitDialog()函数中添加: // TODO: 在此添加额外的初始化代 if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetTextColor(RGB(200, 100, 50)); pDC->SetBkMode(RGB(200, 100, 50)); //设置背景透明 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); } // TODO: 如果默认的不是所需画笔,则返回另一个画笔 //return hbr; return 0; } void loading::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 open = FALSE; CDialogEx::OnCancel(); } void loading::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CString Filepath = _T("Database.mdb"); CDaoRecordset Dbset(&db); CFileFind Ffind; BOOL flag = Ffind.FindFile(Filepath); Ffind.Close(); if (!flag) { CString sqlcmd = _T("CREATE TABLE DataTable(Name VARCHAR(20),Psw VARCHAR(20))"); db.Create(Filepath); db.Execute(sqlcmd); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable", 0)); Dbset.AddNew(); Dbset.SetFieldValue(_T("Name"), _variant_t(_T("plucky"))); Dbset.SetFieldValue(_T("Psw"), _variant_t(_T("MFC_py")));//设置初始用户名和密码 Dbset.Update(); Dbset.Close(); db.Close(); }//这样就创建好了数据库文件,而且设置了初始化账号 UpdateData(true); //CDaoRecordset Dbset(&db); //CString Filepath =_T( "Database.mdb"); CString Sname, Spsw; _variant_t varname, varpsw; db.Open(Filepath); Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0); varname = Dbset.GetFieldValue(_T("Name")); varpsw = Dbset.GetFieldValue(_T("Psw")); Sname = (LPCSTR)_bstr_t(varname); Spsw = (LPCSTR)_bstr_t(varpsw); Dbset.Close(); db.Close(); if (Sname.Compare(m_logname) == 0 && Spsw.Compare(m_logpsw) == 0)//如果密码和账户与数据库一致 { MessageBox(_T("登入成功!"), _T("温情提示")); CDialog::OnOK(); } else { MessageBox(_T("用户或密码错误!"), _T("温情提示")); return; } } void loading::OnBnClickedOk2() { open1 = FALSE; // TODO: 在此添加控件通知处理程序代码 } void loading::OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 zhuce dlg; //opening = TRUE; if (dlg.DoModal() == IDOK) { Invalidate(); } *pResult = 0; } void loading::OnNMClickSyslink2(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 MessageBox(_T("暂无此功能,请联系开发者"), _T("温情提示")); *pResult = 0; }
对比一下,与上一张有哪些变化,修改之即可,我们运行一下就会发现很漂亮,当然呢,这个mdb文件要与EXE文件放在一起,否则会找不到mdb文件而发生错误。
与同学共勉,飞机大战心得体会,如果有需要飞机大战完整源码的话请留下邮箱,我会毫无保留的发给您的,与您共同学习,如果有运行不起来的地方也请留言告诉我,我会与您共同解决的。
以上为经验之谈,亲身试验……