在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、至此按已完成基本的用户管理操作。

 

posted on 2019-03-22 12:46  tobyte  阅读(121)  评论(0编辑  收藏  举报