基于MFC的人事管理系统 VC++
这里使用的是VS2012,新建一个MFC项目,名称为ThkPersoneelManager,选择基于对话框,不使用Unicode字符集,在主对话框界面设置如下
上面是两个Group Box,里面放置相应的控件,ID可自行设置,编辑框添加变量,变量名称随意,这里添加的变量分别为 m_ed_dept 和m_ed_name。
左下为树控件,为其添加变量,变量名为m_tree_dept,右下为列表控件,添加变量,名为m_list_staf,也可自己设置。
鼠标右击解决方案名称,添加 选择新建项,选择头文件(.h),名称为ThkManagerDef .h
打开该头文件,设置枚举变量和结构体,代码如下:
在这里插入代码片
#pragma once
typedef enum STF_SEX
{
E_MAN = 0,
E_WOMAN = 1,
E_UNDEF = -1
}sSex;
typedef struct S_STAFF
{
CString s_strNum;
CString s_strName;
sSex s_Sex;
CString s_strDept;
int unsigned s_nAge;
CString s_strTel;
CString s_strdatebirth;
}sStaff;
右键点击解决方案,添加类,类名为ThkManger,在ThkManger.h头文件中编写函数和成员变量,代码如下:
在这里插入代码片
#pragma once
#include "ThkMangerDef.h"
class Thkmanager
{
public:
ThkManager(void);
~ThkManager(void);
public:
CArray <sStaff> m_arrStaff;//员工数组,信息保存在数组中,通过数组将数据写入文件
CArray <CString> m_arrDept;//部门数组,作用同上
public:
void Read(CString strStaffPath);//从文件中读取员工数据
void Write(CString strPath);//将员工数据写入文件
void AddStaff(sStaff &info);//添加员工
void Delete(int nIndex);//删除员工
void ResetStaff(int nIndex, sStaff &info);//修改员工信息
int SearchName(CString strName);//按名字查找员工,返回员工在数组的索引号
int SearchDept(CString strDept);//按部门名称查找部门,返回部门在数组的索引号
public:
bool AddDept(CString strDept);//添加部门
void ReadDept(CString strDeptPath);//从文件读取部门数据
void WriteDept(CString strDeptPath);//将部门数据写入文件
}
然后在其对应的ThkManger.cpp文件中对这些函数进行定义
在这里插入代码片
#include "stdafx.h"
#include "ThkManger.h"
#include "ThkPersoneelManager.h"
ThkManager::ThkManager(void)
{}
ThkManager::~ThkManager(void)
{}
void ThkManager::Read(CString strStaffPath)
{
BOOL bResult;
CStdioFile file;
DWORD readPos = 0;
bResult = file.Open((LPCTSTR)strStaffPath,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
if(bResult)
{
file.Seek(readPos,CFile::begin);
CString strLine;
while (file.ReadString(strLine) != FALSE)
{
char *pBuf = NULL;
readPos = (DWORD)file.GetPosition();
file.Seek(readPos, CFile::begin);
sStaff staffInfo;
CString strSex,strAge,strDateBirth;
staffInfo.s_strNum = strtok_s(strLine.GetBuffer(0)," ",&pBuf);//工号信息
staffInfo.s_strName = strtok_s(NULL, " ", &pBuf);//姓名
strSex = strtok_s(NULL, " ", &pBuf); //性别
if (!strSex.Compare(_T("男")))
{
staffInfo.s_Sex = E_MAN;
}
else
{
staffInfo.s_Sex = E_WOMAN;
}
staffInfo.s_strDept = strtok_s(NULL, " ", &pBuf);//部门
strAge = strtok_s(NULL, " ", &pBuf);
staffInfo.s_nAge = _ttoi(strAge);//年龄
staffInfo.s_strTel = strtok_s(NULL, " ", &pBuf);//电话
staffInfo.s_strdatebirth = strtok_s(NULL, " ", &pBuf);//出生日期
m_arrStaff.Add(staffInfo);
}
file.Close();
}
else
AfxMessageBox(_T("员工数据读取失败!"));
}
由于函数比较多,这里就不把全部函数的定义写出来了,后面会有源码。
由于对话框较多,并且需要互相传递数据,这里使用全局变量。打开系统生成的ThkPersoneelManager.h文件,在class CThkPersoneelManagerApp : public CWinApp中添加这样几行代码
class CThkPersoneelManagerApp : public CWinApp
{
public:
CThkPersoneelManagerApp();
CString g_Company;
CString g_strStaffName;
int g_nNum;
ThkManager manager;
}
5、6、7、8行为自己添加的,后面还有系统自己生成的,这些不用管。
继续右击解决方案,添加资源,选择Dialog
对话框ID设为IDD_DLG_ADDSTAFF,标题设为 添加员工,界面设置如下
姓名、年龄、电话对应的为Edit_Control,性别、部门为Combo_box Control,性别的那个控件在属性设置里找到Data,添加内容 男;女,部门的列表框不用设置。出生日期用的是DateTimePicker控件,分别为以上控件添加变量,变量名依次为 m_ed_name,m_combo_sex,m_combo_dept,m_edage,m_ed_tel,m_datetime_birth
然后添加按钮。然后对这个对话框添加类,类名为ThkADDSTAFF,双击按钮,然后写按钮的触发事件
选中该对话框,右击,选择类向导,在虚函数里找到OnInitDialog()函数,然后添加,在该函数中添加代码如下:
for (int nIndex = 0; nIndex < theApp.manager.m_arrDept.GetSize(); nIndex++)
{
m_combo_dept.AddString(theApp.manager.m_arrDept[nIndex]);
}
再添加一个对话框,ID为IDD_DIALOG_STAFFALTER,
界面设置如图,其中工号对应的编辑框设置为只读,然后为各控件添加变量,变量名同上
为对话框添加类,类名为ThkAlterStaff,编写按钮触发事件,添加OnInitDialog()函数,函数中代码同上一个对话框。
添加第三个对话框 ID为IDD_DIALOG_COMPANY,然后添加类,类名为ThkCompany
双击按钮编写触发事件。
至此所需对话框已全部建好。
然后在主界面即文章开头那张显示图片,进行一些设置首先点击树控件,在属性栏,选择控件事件
图中黄色闪电按钮,
选择TVN_SELCHANGED 然后添加即可。
在对话框的头文件ThkPersoneelManagerDlg.h中声明一些函数,这些函数在其对应的.cpp文件中实现,
添加的函数如下
public:
void UpdateTree();
void InsertListItem(sStaff &staff,int nIndex = 0);
void StaffInfoList(sStaff &staff,int nIndex);
void ReadCompanyInfo();
void InsertStaffInTree(HTREEITEM hItem,CString strStaffName);
void DeleteChildNode(HTREEITEM hItem);
CString GetTreeText(HTREEITEM hItem);
cpp文件有实现方法,在此不再写了。至此,整个项目建立完成,把函数实现就完成了。
这是项目建立完成后的解决方案。