在CSDN上用VC 6.0做过一次详细的讲述, 链接地址: https://blog.csdn.net/weixin_38982184/article/details/88641272
因平台不同,以及CSDN使用体验上不如博客园,故重新在此用VS2008进行编写。
在实现登录界面之后,需要对登录用户进行管理,管理员有所有可执行权限,非管理员只能查看自己的账号和密码,以及修改密码操作。实现结果如下:
1、新增一个对话框并创建类CUserManage,并将界面设置为如下所示,增加相应的控件及变量
2、在CXXXView中创建数据库指针和记录集对象(与数据库交互时必须配置此两项),并在其cpp文件中增加UserManage.h头文件,并绑定数据库。之前设置登录界面时需单独使用因为还未创建主窗口。
1 #include "UserManage.h" 2 class CstaffmanageView : public CRecordView 3 { 4 ...... 5 public: 6 CDatabase m_Database; 7 CstaffmanageSet *m_pUserSet; 8 ...... 9 } 10 11 CstaffmanageView::CstaffmanageView() 12 : CRecordView(CstaffmanageView::IDD) 13 { 14 m_pSet = NULL; 15 // TODO: 在此处添加构造代码 16 //将系统的数据库与内容绑定在此 17 CString strcon= "DSN=staffmanage"; 18 if(!m_Database.IsOpen()) 19 { 20 if (!m_Database.OpenEx(strcon)) //缺省值0表示以共享方式打开数据库,带有写访问,不装入ODBC游标库DLL 21 { 22 AfxMessageBox("打开数据源失败"); 23 return; 24 } 25 m_pUserSet = new CstaffmanageSet(&m_Database); 26 } 27 }
3、在Menu菜单中增加按钮“打开员工管理”,并设置ID号IDD_USERMANAGE,并在CXXXView中进行增加该ID的事件响应函数。此操作其实与在主窗口对话框中增加按钮功能一样。创建一个实例对象 ,并将该对象的指针绑定到View中的数据源与记录集。
1 void CstaffmanageView::OnUsermanage() 2 { 3 // TODO: 在此添加命令处理程序代码 4 CUserManage user; 5 user.m_pdatabase = &m_Database;//数据库绑定 6 user.m_UserSet.m_pDatabase=&m_Database; //记录集绑定 7 user.m_logined_user=theApp.m_logined_user; //传递登录者信息 8 user.DoModal(); //激活用户管理窗口 9 }
4、为“员工管理”初始化界面,初始化用户清单界面。
1 BOOL CUserManage::OnInitDialog() 2 { 3 CDialog::OnInitDialog(); 4 // TODO: 在此添加额外的初始化 5 m_edit_username.EnableWindow(FALSE); 6 m_edit_password.EnableWindow(FALSE); 7 8 if(m_logined_user =="admin") m_edit_adduser.EnableWindow(TRUE); 9 else 10 { 11 m_edit_adduser.EnableWindow(FALSE); 12 m_edit_deluser.EnableWindow(FALSE); 13 } 14 HeadSet(); 15 16 return TRUE; // return TRUE unless you set the focus to a control 17 // 异常: OCX 属性页应返回 FALSE 18 } 19 20 void CUserManage::HeadSet() 21 { 22 m_listbox.InsertColumn(0,"username"); //插入列名 23 m_listbox.InsertColumn(1,"password"); 24 25 RECT rectlist; //获取列表宽度 26 m_listbox.GetWindowRect(&rectlist); 27 int wid=rectlist.right-rectlist.left-4; 28 for(int i=0;i<2;i++) 29 { 30 m_listbox.SetColumnWidth(i,wid/2); //二分 31 } 32 m_listbox.SetExtendedStyle(LVS_EX_FULLROWSELECT); //设置为全行选择 33 if("admin" == m_logined_user) //如果是管理员 34 { 35 CString sql="select * from account"; //显示全部用户信息 36 UserList(sql); //读取数据库用户信息 37 } 38 else 39 { 40 CString sql; 41 sql.Format("select * from account where name = '%s'",m_logined_user); //只显示当前用户 42 UserList(sql); //读取数据库 43 } 44 }
此时已经有了表格信息,但还没有记录查询返回的数据。
1 void CUserManage::UserList(CString sql) 2 { 3 m_listbox.DeleteAllItems(); 4 if (!m_UserSet.IsOpen()) 5 { 6 m_UserSet.Open(CRecordset::dynaset, sql); //指定查询语句打开 7 } 8 m_UserSet.Requery(); //再次查询 9 10 CString temp; 11 for(int i=0;i<m_UserSet.GetRecordCount();i++) // 获取相应列的信息 12 { 13 m_UserSet.GetFieldValue("name",temp); 14 m_listbox.InsertItem(i,temp); //新行插入 15 m_UserSet.GetFieldValue("password",temp); 16 m_listbox.SetItemText(i,1,temp); 17 m_UserSet.MoveNext(); //滚动向下一条执行 18 } 19 //用完之后关闭记录库,不用关闭数据库 20 if (m_UserSet.IsOpen()) 21 { 22 m_UserSet.Close(); 23 } 24 }
5、当选中时用户名与密码会有相应的显示,为列表框增加命令响应函数。
1 void CUserManage::OnNMClickListbox(NMHDR *pNMHDR, LRESULT *pResult) 2 { 3 4 // TODO: 在此添加控件通知处理程序代码 5 int row=-1; //行号初始化,当点击后更新行号值 6 row=m_listbox.GetSelectionMark(); 7 8 if(row==-1) 9 { 10 AfxMessageBox("请选择一条记录"); 11 return ; 12 } 13 14 m_str_username=m_listbox.GetItemText(row,0); //将选中列的信息更新到控件值中,也可以配合使用Control变量设置,则无需UpdateData 15 m_str_password=m_listbox.GetItemText(row,1); 16 UpdateData(FALSE); //注意是FALSE,将控件变量的值更新到控件框中;TRUE是将输入信息更新到变量中。 17 18 *pResult = 0; 19 } 20
6、要实现增删按钮操作,需先增加一个用于增删信息界面,并且管理员与非管理员的用户框信息不同。
新增一个编辑用户信息框,定义新类CEditUser,并创建相应的控件与变量(必须创建新类,否则无法生成变量)。此时也可以按登录界面一样设置密码可见或不可见。
如想在界面创建时属性生效,则必须在该类的InitDialog中进行初始化变量设置。创建一个bool 变量m_editFlag用于在创建界面时设置控件的属性。该值可在其他类中实例化对象后进行赋值。
1 class CEditUser : public CDialog 2 { 3 bool m_editFlag; 4 } 5 6 7 cpp中 8 BOOL CEditUser::OnInitDialog() 9 { 10 CDialog::OnInitDialog(); 11 12 // TODO: 在此添加额外的初始化 13 if(m_editFlag==0) m_edit_adduser.EnableWindow(); //增加窗口时可用 14 else m_edit_adduser.EnableWindow(FALSE); //编辑窗口时不可用 15 return TRUE; // return TRUE unless you set the focus to a control 16 // 异常: OCX 属性页应返回 FALSE 17 }
实现“确定”按钮的事件函数,如果信息不全/两次密码不一致则提示并退出。
void CEditUser::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 UpdateData(); //将输入信息更新到控件变量中 if(m_str_adduser.IsEmpty()||m_str_password.IsEmpty()||m_str_confirm.IsEmpty()) { AfxMessageBox("请填写空白处"); return ; } if(m_str_password != m_str_confirm) { AfxMessageBox("前后密码不一致,请重新输入"); m_str_password.Empty(); m_str_confirm.Empty(); return ; } else { OnOK(); } }
7、实现增删改按钮操作,并实时更新列表框。
1 void CUserManage::OnBnClickedAdduser() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 CEditUser adduser; //每次都需新生成一个对象 5 adduser.m_editFlag=0; //是增加操作,需设置用户框状态可用 6 if(IDOK == adduser.DoModal()) //调用界面 7 { 8 CString username,password,sql; //传入数值 9 username=adduser.m_str_adduser; 10 password=adduser.m_str_password; 11 12 sql.Format("INSERT INTO account (name,password) VALUES ('%s','%s')",username,password); //更新插入语句,并在数据库中执行 13 m_pdatabase->ExecuteSQL(sql); 14 15 sql="select * from account"; //因为只有管理员有权限,所以可以全部调用 16 UserList(sql); 17 m_edit_username.SetWindowText(username); //设置管理用户界面的对话框更新为新增的用户信息 18 m_edit_password.SetWindowText(password); 19 } 20 } 21 22 void CUserManage::OnBnClickedEdituser() 23 { 24 // TODO: 在此添加控件通知处理程序代码 25 CEditUser edituser; 26 int row=-1; 27 row=m_listbox.GetSelectionMark(); 28 29 if(row==-1) 30 { 31 AfxMessageBox("请选择一条记录"); 32 return ; 33 } 34 35 edituser.m_editFlag=1; 36 edituser.m_str_adduser=m_str_username; 37 38 if(IDOK == edituser.DoModal()) 39 { 40 m_str_password=edituser.m_str_password; 41 CString sql; 42 sql.Format("UPDATE account SET password ='%s' where name ='%s'",m_str_password,m_str_username); 43 m_pdatabase->ExecuteSQL(sql); 44 45 if(m_logined_user=="admin") 46 { 47 sql="select * from account"; 48 UserList(sql); 49 m_edit_username.SetWindowText(m_str_username); 50 m_edit_password.SetWindowText(m_str_password); 51 } 52 else 53 { 54 sql.Format("select * from account where name='%s'",m_str_username); 55 UserList(sql); 56 m_edit_username.SetWindowText(m_str_username); 57 m_edit_password.SetWindowText(m_str_password); 58 } 59 } 60 } 61 62 void CUserManage::OnBnClickedDeluser() 63 { 64 // TODO: 在此添加控件通知处理程序代码 65 int row=-1; 66 row=m_listbox.GetSelectionMark(); 67 68 if(row==-1) 69 { 70 AfxMessageBox("请选择一条记录"); 71 return ; 72 } 73 74 if(m_str_username=="admin") 75 { 76 AfxMessageBox("操作错误,不能删除管理员"); 77 return ; 78 } 79 80 if(IDYES == AfxMessageBox("确认要删除该用户吗?",MB_YESNO)) //注意对话框时IDYES 81 { 82 83 CString sql; 84 sql.Format("DELETE from account where name = '%s'", m_str_username); 85 m_pdatabase->ExecuteSQL(sql); 86 87 sql="select * from account"; 88 UserList(sql); 89 90 m_edit_username.SetWindowText(""); 91 m_edit_password.SetWindowText(""); 92 } 93 }
8、至此按已完成基本的用户管理操作。