人事考勤管理系统
目录
第一部分:开发背景……………………………………………………………..3 第二部分:系统分析………………………………………………………………3 第三部分:系统设计………………………………………………………… …..9 第四部分:公共类设计………………………………………………………….15 第五部分:主题窗设计…………………………………………………………。16 第六部分:用户登录模块设计……………………………………………..。17 第七部分:用户管理模块设计………………………………………………20 第八部分:部门管理模块设计………………………………………………23 第九部分:人员信息管理模块设计…………………………………….。.32 第十部分:考勤模块设计………………………………………………………40 第十一部分:考勤汇总模块设计……………………………………………45 第十二部分:后续补充部分: 一些过程的具体实现方法总结
及图片解释:………………………………………………………………….。。。51
第十三部分:心得…………………………………………………………………。。51
人事考勤管理系统
➢ 开发背景
随着公司业务不断发展,员工数量不断增加,人事考勤方
1
面的管理已成为公司管理中的重要部分,但传统的人事考勤制度已不能有效地管理员工的出勤状况,急需一套人事考勤管理的有效工具——人事考勤管理系统。
➢ 二、系统分析
1) 需求分析
通过对人事考勤管理过程的研究和分析,要求本系统应该具有
以下功能。
a) 用户登录.
b) 部门信息录入 c) 人员信息管理 d) 考勤信息录入 e) 考勤信息汇总.
2) 系统功能描述
用户需要输入用户名和密码进入人事考勤管理系统,对各部门、员工的基本信息进行维护和管理。在考勤管理模块中录入员工当天的考勤信息,同时可对年、月、员工进行查询.此外,还可以通过考勤汇总查询模块对员工某月的考勤记录进行汇总,计算出员工月工作天数、早退、迟到的天数.
➢ 三、系统设计
1) 系统目标
人事考勤管理系统以实现员工日常出勤信息管理为设计目标,
加以强大的数据库管理功能,可以极大地提高人事部门的日常工作效率。本系统在设计时满足以下几点:
a) 采用人机对话的操作方式,信息查询灵活、方便、快捷、准确,
数据存储安全可靠。
b) 对考勤信息的操作简单,可以方便地进行添加、修改、和删除。 c) 可以录入员工信息、部门信息. d) 对员工的考勤信息按月汇总计算。
e) 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为
错误.
f) 系统最大限度地实现了易维护性和易操作性。 g) 系统运行稳定、安全可靠。
2) 系统功能结构
2
人事考勤管理系统的功能结构如图所示:
3)
人事考勤管理系统 用部员考户门工勤业务流图 信管信数理 息息据: 人事考勤管理系统业务流程图如图管管录理 理 入 退出登录 考勤信息汇总 用户 员员工工户信考4)系统预览: 管考勤查询勤 息理 人事考勤管理系统由多个功能模块组成,管下面仅列出一些典管型的功能模块,其他模块以后陆续列出: 理 理
用修改密码 部门管理 a) 部门管理模块如图: 主要管理各部门之间的结构信息 b) 用户管理模块如图: 用于用户的一些操作管理
c) 人员信息管理如图:
主要用于维护员工的基本信息
d) 考勤管理模块如图:
用于记录人事考勤的信息
e) 考勤汇总查询如图:
对员工的考勤信息进行汇总统计
4) 数据库设计 A. 数据库分析
3
人事考勤系统采用SQL Server 2008 数据库,数据库名称为 tb_person 在数据库中建立四个表存储不同的信息,如图:
B. 数据库概念设计
根据介绍的需求分析和系统设计,规划处本系统中使用的数据库实体对象,分别以管理员为实体,部门实体和考勤实体等。下面是实体E—R图. a) 管理员实体
管理员包括编号,用户,密码。管理员实体E—R图
编号 密码 用户 管理员 b)部门实体 部门实体包括编号,部门名称,备注信息和上级部门编号.部门实体E—R图 部门编号 部门名称 备注信息 部门管理 上级部门管理 c)员工实体
员工实体包括自动编号,员工编号,员工姓名,照片,
性别和生日等信息。员工E—R图
生日
自动编号 员工编号 4
性别
d)考勤实体 员工 员工姓名 考勤实体包括人员姓名,考勤信息,上班时间,下班时间
考勤日期 上班考勤时间 下班考勤时间 上班时间 下班时间 照片 C。数据库逻辑设计 人员姓名 a) 管理员信息表(tab_user),用于保存管理员的信息,如图:
b) 部门信息表(tab_Dept)用于记录部门的信息,如图:
C) 考勤信息表(tab_check)用于记录考勤信息
c) 员工信息表(tab_Employees)保存公司员工信息,如图:
➢ 四、公共类设计
本系统采用ADO连接数据库。为了能够方便的使用ADO建立
数据库连接并进行相应的数据操作,在公共类中对系统中是使用的ADO操作进行了封装。在系统中建立了ADO的两个公共类CADOConnection和CADODataSet,这两个类定义在ADO.h头文件中,实现在ADO。cpp文件中.
5
A.CADOConnection类
CADOConnection类是用来连接数据库的,实现了对_Connection接口的封装。CADOConnection类在头文件中的定义如下:
#import \"C:\\Program Files\\Common Files\\System\\ado\\msado15。dll” no_namespace rename(\"EOF”,\"adoEOF\") class CADOConnection {
private: static void InitADO();//初始化ADO static void UnInitADO(); protected:
_ConnectionPtr m_Connection;//指针接口 public: BOOL IsOpen();//判断是否与数据库连接 _ConnectionPtr GetConnection();//获取连接接口 CString GetSQLConStr();//获取SQL连接字符串 BOOL Open(CString ConStr);//建立数据库连接 CADOConnection(); virtual ~CADOConnection(); };
CADOConnection类的实现代码如下:
CADOConnection * GetConnection()//GetConnection函数是一个全局函数,用于返回全局数据库连接对象的的指针 { return &g_Connection; }
CADOConnection::CADOConnection()//CADOConnection方法是构造方法,用于初始化OLE和创建_Connection接口指针 { InitADO(); m_Connection。CreateInstance(”ADODB.Connection”); }
CADOConnection::~CADOConnection()//~CADOConnection方法是构造方法,用于取消OLE 的初始化和释放_Connection接口指针 { if (IsOpen()) m_Connection-〉Close(); m_Connection = NULL; UnInitADO(); }
6
void CADOConnection::InitADO()//InitADO是一个静态方法,用于初始化OLE { if (ConCount++ == 0) CoInitialize(NULL); };
void CADOConnection::UnInitADO()//UnInitADO是一个静态方法,用于取消初始化OLE { if (——ConCount == 0) };
CoUninitialize();
BOOL CADOConnection::Open(CString ConStr)//通过指定的数据库连接字符串于SQL数据库建立连接 { if (IsOpen()) m_Connection—〉Close(); m_Connection-〉Open((_bstr_t)ConStr,””,””,adModeUnknown); return IsOpen(); }
CString CADOConnection::GetSQLConStr()//生成数据库连接需要的字符串 { CString Str; Str。Format(\"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tb_person;Data Source=LONGFEI—PC\\\\SQLEXPRESS”); return Str; }
_ConnectionPtr CADOConnection::GetConnection()//该方法用于返回_Connection接口指针 { return m_Connection; }
BOOL CADOConnection::IsOpen()//判断当前数据库连接对象与数据库的连接状态 { long State; m_Connection->get_State(&State); if (State == adStateOpen) return true; return false;}
CADODataSet类的定义如下:
class CADODataSet {
protected:
_RecordsetPtr m_DataSet;//数据集接口指针
CADOConnection *m_Connection;//数据库连接对象
7
public:
BOOL Open(CString SQLStr,int LockType);//打开记录集 void Delete();//记录删除
int GetRecordNo();//获取记录集行号 void move(int nIndex);//移动记录指针 void Save();//保存对记录集的修改
void SetFieldValue(CString FieldName,_variant_t Value);//设置字段的值 void AddNew();//添加新纪录
BOOL Next();//记录集指针指向下一个记录 FieldsPtr GetFields();//获取记录集字段集合
int GetRecordCount();//获取记录集中记录数量
void SetConnection(CADOConnection *pCon);//设置记录集的数据库连接对象 BOOL Open(CString SQLStr);//打开记录集 CADODataSet();
virtual ~CADODataSet(); private:
BOOL IsOpen(); };
CADODataSet类的实现如下:
CADODataSet::CADODataSet()//该方法为记录集实现类的构造方法,在该方法中实现记
录集接口对象的创建 { m_DataSet.CreateInstance(”ADODB.Recordset”); }
CADODataSet::~CADODataSet()//实现记录集的关闭与接口的释放 { if (IsOpen()) m_DataSet->Close(); m_DataSet = NULL; m_Connection = NULL; }
void CADODataSet::SetConnection(CADOConnection *pCon)//设置记录集所连接的数据库连接类的对象 {
m_Connection = pCon; }
int CADODataSet::GetRecordCount()//获取记录集中数据的数量 { if (IsOpen()) return m_DataSet—>GetRecordCount(); else
8
return 0;
}
BOOL CADODataSet::Open(CString SQLStr)//打开数据集 { if (IsOpen()) m_DataSet—>Close(); //*/ m_DataSet—>Open(_bstr_t(SQLStr), _variant_t((IDispatch*)g_Connection。GetConnection(), true), adOpenKeyset, adLockOptimistic, adCmdText); return IsOpen(); //*/ }
BOOL CADODataSet::IsOpen()//判断数据集是否处于打开状态 { long State; m_DataSet-〉get_State(&State); if (State == adStateOpen) return true; return false; }
FieldsPtr CADODataSet::GetFields()//用来获取记录集中字段的集合 { return m_DataSet->GetFields(); }
BOOL CADODataSet::Next()//记录集指针下移一位 { }
if (m_DataSet->adoEOF) return false;
m_DataSet—〉MoveNext(); return true;
void CADODataSet::AddNew() { m_DataSet—>AddNew(); }
void CADODataSet::SetFieldValue(CString FieldName, _variant_t Value)//想记录集中指定的字段赋值 { m_DataSet—>PutCollect((_bstr_t)FieldName,Value); }
void CADODataSet::Save()//保存记录集数据所做的修改
9
{ m_DataSet-〉Update(); }
void CADODataSet::move(int nIndex)//将记录集的当前指针移动到指定的索引位置 { }
m_DataSet—〉MoveFirst(); m_DataSet-〉Move(nIndex);
int CADODataSet::GetRecordNo()//获取记录集中的当前行号 { return m_DataSet—〉AbsolutePosition; }
void CADODataSet::Delete()//删除记录集中的当前行 { m_DataSet-〉Delete(adAffectCurrent); }
BOOL CADODataSet::Open(CString SQLStr, int LockType) { if (IsOpen()) m_DataSet-〉Close(); //*/ m_DataSet-〉Open(_bstr_t(SQLStr), _variant_t((IDispatch*)g_Connection。GetConnection(), true), adOpenKeyset,(LockTypeEnum) LockType, adCmdText); return IsOpen(); }
➢ 五、主题窗设计
A。主题窗由菜单和图片组成,如图:
B.主题窗设计步骤:
a.启动visual c++,选择File/New命令,打开New对话框
b.在左侧选择MFC AppWizard(exe)选项,在Project name编辑框中输入工程名称,在location编辑框中设置保存工程的路径,然后单击OK按钮,打开MFC AppWizard对话框,选择对话框编程,打击fish
10
c.像工程中导入位图,菜单资源(具体操作在最后有补充)
➢ 六、用户登录模块设计
A. 概述,登录界面是每个管理系统应该具备的,本系统的
登录模块如图:
B . 技术分析
窗体应在主题窗创建之前并显示,在登录窗体创建的同时应 BOOL bCon = 、GetConnection()-〉Open(GetConnection()—〉
GetSQLConStr());
CLoginDialog logindlg; if (logindlg.DoModal() != IDOK) return false; ::CoInitialize(NULL); CPersonDlg dlg;
该建立数据库连接,具体操作如下:
C. 实现过程
a. 创建一个对话框
b. 向对话框中添加两个静态文本控件、一个编辑框控件、和
两个按钮控件。分别设置两个静态文本控件的Caption属性为“用户名”和“密码\"设置编辑框控件类型为password; 分别设置连个按钮为“确定”和“取消”。 C. 在窗体初始化方法中创建用户表的数据,并将用户添加到列
表框控件中.代码如下:
BOOL CLoginDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_DataSet.SetConnection(GetConnection()); m_DataSet.Open(”Select * From Tab_User”); int count = m_DataSet.GetRecordCount(); for (int i = 0; i< count;i++) {
m_UserList。AddString((_bstr_t)m_DataSet。GetFields()->Item[L”UserName”]—〉Value); m_DataSet。Next(); }
m_UserList.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
11
}
// EXCEPTION: OCX Property Pages should return FALSE
d. 确定按钮事件代码如下:
void CLoginDialog::OnLogin() {
CString sql,user,pass;
m_UserList。GetWindowText(user); m_PassWord。GetWindowText(pass);
sql。Format(\"Select * From tab_user Where UserName = '%s’ and PassWord = ’%s'”, user,pass);
m_DataSet。Open(sql);
if (m_DataSet.GetRecordCount() == 1) { ::SetUserName(user); this—>OnOK(); } else }
AfxMessageBox(”用户名或密码不正确!\");
➢ 七、用户管理模块
A. 概况:能实现添加,修改,删除等操作如图: B. 实现过程:
a.
b. c. d. e. f.
创建一个对话框
向对话框中添加相应的控件 给对话框添加对话框类 给类添加函数及成员变量 给控件关联变量 编写函数
C.实现代码:
a.定义UpdateGrid方法用来更新列表视图中的信息代码如下: void CUserManage::UpdateGrid()
{
m_DataSet.Open(\"Select * From tab_User”); m_grid.DeleteAllItems();
12
for (int i = 0 ; i < m_DataSet.GetRecordCount();i++) {
m_grid.InsertItem(i,(_bstr_t)m_DataSet.GetFields()—>Item[L”UserName”]-〉Value);
int no = m_DataSet.GetRecordNo(); m_grid。SetItemData(i,no); m_DataSet。Next(); }
}
b.添加按钮代码如下:
void CUserManage::OnAppend()
{
CUserEdit useredit;
if (useredit。DoModal() == IDOK) {
m_DataSet。AddNew(); m_DataSet。SetFieldValue(”UserName\);
m_DataSet.Save(); UpdateGrid(); }
}
c. 删除按钮代码:
void CUserManage::OnDelete() {
if (MessageBox(\"是否删除此记录!”,\"提示\ MB_YESNO|MB_ICONWARNING) == IDYES) { int no = m_grid.GetItemData(m_grid。GetSelectionMark()); m_DataSet。move(no-1); m_DataSet。Delete(); m_DataSet。Save(); UpdateGrid(); } }
d. 修改按钮代码:
void CUserManage::OnEdit() {
CUserEdit useredit;
int no = m_grid。GetItemData(m_grid。GetSelectionMark());
13
m_DataSet.move(no-1);
useredit.name = (char *)(_bstr_t)m_DataSet.GetFields()—>Item[L”UserName”]—>Value;
if (useredit.DoModal() == IDOK) { m_DataSet.SetFieldValue(\"UserName”,(_bstr_t)useredit。name); m_DataSet。Save(); UpdateGrid(); } }
➢ 八、部门管理模块设计
A. 概述:该模块记录了部门间的的层次结构和部门信息,
一般使用树控件实现,如图: B. 实现过程:
a. 创建一个对话框
b。 向对话框中添加相应的控件 c. 给对话框添加对话框类 d。 给类添加函数及成员变量 e。 给控件关联变量 f. 编写函数
C. 相关代码如下:
BOOL CDeptManage::OnInitDialog() //初始化函数
{
CDialog::OnInitDialog(); m_DataSet。SetConnection(::GetConnection()); UpdateDept(); return TRUE; }
将部门信息一次性读入树控件中。代码如下:
void CDeptManage::GetNode(HTREEITEM pNode, int nPid) {
HTREEITEM node; CADODataSet DataSet;
DataSet.SetConnection(::GetConnection()); CString str;
str.Format(”Select * From tab_Dept where pid = %d”,nPid);
14
DataSet.Open(str);
int count = DataSet.GetRecordCount(); int ID;
_variant_t value;
for (int i = 0;i 定义GetNode方法,用于按成次级关系获取部门表中的所有数据,并添加树控件,该方法由UpdateDept方法进行调用,代码如下; void CDeptManage::UpdateDept() { m_tree.DeleteAllItems(); GetNode(TVI_ROOT,0); } void CDeptManage::OnAdd() { CDeptEdit deptedit; if (deptedit.DoModal() == IDOK) { HTREEITEM pNode = m_tree.GetSelectedItem(); int pID; if (deptedit.isroot) pID = 0; else pID = m_tree.GetItemData(pNode); CADODataSet dataset; dataset.SetConnection(::GetConnection()); dataset.Open(\"Select top 1 * From tab_Dept\"); dataset.AddNew(); dataset。SetFieldValue(”DeptName”,(_variant_t)deptedit。name); dataset.SetFieldValue(\"memo”,(_variant_t)deptedit。memo); dataset。SetFieldValue(”PID”,(long)pID); dataset.Save(); UpdateDept(); } 15 } 单击“修改”按钮时将弹出部门编辑窗体,输入部门信息后单击“确定”按钮,实现部门信息的修改。代码如下 void CDeptManage::OnEdit() { CDeptEdit deptedit; deptedit.visible = false; HTREEITEM pNode = m_tree.GetSelectedItem(); if (pNode == 0) return; int pID = m_tree。GetItemData(pNode); CADODataSet dataset; dataset。SetConnection(::GetConnection()); CString str; str。Format(\"Select * From tab_Dept where id = %d”,pID); dataset.Open(str); deptedit。name = (char *)(_bstr_t)dataset.GetFields()—〉Item[L\"DeptName\"]—〉Value; deptedit.memo = (char *)(_bstr_t)dataset.GetFields()—>Item[”memo”]—>Value; if (deptedit.DoModal() == IDOK) { dataset。SetFieldValue(\"DeptName”,(_variant_t)deptedit.name); dataset。SetFieldValue(\"memo”,(_variant_t)deptedit。memo); dataset。Save(); UpdateDept(); } } 当单击“删除”按钮时,将删除当前选中的节点,代码如下: void CDeptManage::OnDelete() { HTREEITEM pNode = m_tree。GetSelectedItem(); if (pNode == 0) return; if (MessageBox(”是否删除此记录!\”提示”, MB_YESNO|MB_ICONWARNING) == IDYES) { int pID = m_tree。GetItemData(pNode); CADODataSet dataset; dataset。SetConnection(::GetConnection()); CString str; str。Format(”Select * From tab_Dept where id = %d”,pID); 16 dataset.Open(str); dataset。Delete(); dataset。Save(); UpdateDept();}} ➢ 九、人员信息管理模块设计 A. 概述:人员信息管理模块根据部门分类显示人员,同时可对 人员信息进行维护,界面如下: B. 实现过程: a. b. c. d. e. 创建对话框 向对话框中添加相应的控件 给对话框添加对话框类 给类添加函数及成员变量 给控件关联变量 C. 相关代码: GetNode方法,获取部门信息,并添加到树控件中.该方法由UpdateDept调用,代码如下: void CPersonManage::GetNode(HTREEITEM pNode, int nPid) { HTREEITEM node; CADODataSet DataSet; DataSet。SetConnection(::GetConnection()); CString str; str。Format(”Select * From tab_Dept where pid = %d\; DataSet.Open(str); int count = DataSet.GetRecordCount(); int ID; _variant_t value; for (int i = 0;i〈count;i++) { node = m_tree。InsertItem((_bstr_t)DataSet。GetFields()-〉Item[\"DeptName\"]—〉Value,pNode); value = (_variant_t)DataSet.GetFields()-〉Item[”ID”]->Value; ID = value。intVal; m_tree.SetItemData(node,ID); GetNode(node,ID); DataSet。Next(); } } UpdateDpt调用GetNode,实现信息更新,代码如下: void CPersonManage::UpdateDept() { 17 m_tree。DeleteAllItems(); HTREEITEM node; node = m_tree.InsertItem(\"全部”,TVI_ROOT); m_tree。SetItemData(node,—1); GetNode(node,0); } UpdatePerson更新人员信息,并将其显示在列表控件中。代码如下: void CPersonManage::UpdatePerson() { m_list。DeleteAllItems(); CADODataSet DataSet; DataSet.SetConnection(::GetConnection()); CString str; if (m_DeptID == -1) str。Format(\"Select * From tab_Employees”); else str。Format(\"Select * From tab_Employees where Dept = %d\ DataSet.Open(str); int count = DataSet.GetRecordCount(); int n = 0; _variant_t value; for (int i = 0;i 18 Item[”Id_Card”]->Value); m_list.SetItemText(n,index++,(_bstr_t)DataSet。GetFields()-〉Item[”Office_phone”]-〉Value); m_list。SetItemText(n,index++,(_bstr_t)DataSet.GetFields()—>Item[\"Mobile\"]->Value); m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item[\"HireDate”]—〉Value); m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()-〉Item[”Duty”]->Value); m_list。SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item[”Memo”]—〉Value); m_list。SetItemText(n,index++,(_bstr_t)DataSet。GetFields()-〉Item[”Files_Keep_Org\"]-〉Value); m_list。SetItemText(n,index++,(_bstr_t)DataSet。GetFields()—>Item[\"Hukou”]—>Value); m_list。SetItemText(n,index++,(_bstr_t)DataSet。GetFields()—>Item[\"Family_Place”]—>Value); n++; DataSet.Next(); } } 单击“添加”按钮,弹出人员编辑窗体,输入人员信息后,单击保存按钮,实现人员的添加代码如下: void CPersonManage::OnAdd() { CPersonEdit personedit; personedit。m_DeptData = m_DeptID; if (personedit。DoModal() == IDOK) { CADODataSet dataset; dataset。SetConnection(::GetConnection()); CString str = ”select top 1 * from tab_Employees\"; dataset.Open(str); dataset。AddNew(); dataset.SetFieldValue(\"Emp_Id\(_bstr_t)personedit.m_id); dataset.SetFieldValue(\"Emp_NAME”,(_bstr_t)personedit。m_name); dataset.SetFieldValue(\"Sex”,(_bstr_t)personedit。m_sex); dataset.SetFieldValue(”Nationality\。m_nationality); dataset.SetFieldValue(”Birth\(_bstr_t)personedit.m_birth。Format(\"%Y—%m—%d”)); dataset.SetFieldValue(”Political_Party”,(_bstr_t)personedit。m_farty); dataset。SetFieldValue(\"Culture_Level\)personedit。m_culture); dataset。SetFieldValue(”Marital_Condition”,(_bstr_t)personedit。 19 m_marital); dataset.SetFieldValue(”Id_Card”,(_bstr_t)personedit.m_card); dataset.SetFieldValue(\"Office_phone\。m_office); dataset。SetFieldValue(\"Mobile\(_bstr_t)personedit。m_mobile); dataset。SetFieldValue(\"HireDate”,(_bstr_t)personedit。m_hire。Format(”%Y-%m—%d”)); dataset.SetFieldValue(\"Duty\); dataset.SetFieldValue(\"Memo\",(_bstr_t)personedit.m_memo); dataset。SetFieldValue(”Files_Keep_Org\",(_bstr_t)personedit。m_files); dataset.SetFieldValue(”Hukou\",(_bstr_t)personedit.m_hukou); dataset.SetFieldValue(”Family_Place”,(_bstr_t)personedit.m_family); dataset。SetFieldValue(”dept\。m_DeptData); dataset。Save(); UpdatePerson(); } } 单击“修改”按钮,弹出人员编辑窗体,输入人员信息后,单击“保存”实现人员信息的修改,代码如下: void CPersonManage::OnEdit() { if (m_list.GetSelectionMark() == -1) return; int id = m_list.GetItemData(m_list。GetSelectionMark()); CPersonEdit personedit; CADODataSet dataset; dataset.SetConnection(::GetConnection()); CString str; str.Format(\"select * from tab_Employees where autoid = %d\; dataset.Open(str); personedit.m_id = (char *)(_bstr_t)dataset.GetFields()->Item[”Emp_Id\"]-〉Value; personedit。m_name = (char *)(_bstr_t)dataset.GetFields()—〉Item[”Emp_NAME”]—>Value; personedit。m_sex = (char *)(_bstr_t)dataset.GetFields()—>Item[”Sex\"]->Value; personedit.m_nationality = (char *)(_bstr_t)dataset。GetFields()—〉Item[”Nationality\"]-〉Value; CString birth = (char *)(_bstr_t)dataset.GetFields()-〉Item[”Birth\"]—>Value; if (!birth.IsEmpty()) { //设置日期数据 int yy=atoi(birth.Left(4)); int mm=atoi(birth.Mid(6,2)); int dd=atoi(birth.Mid(9,2)); 20 CTime tbirth(yy,mm,dd,0,0,0); personedit。m_birth = tbirth; } personedit。m_farty = (char *)(_bstr_t)dataset.GetFields()—〉Item[”Political_Party”]—〉Value; personedit.m_culture = (char *)(_bstr_t)dataset.GetFields()—〉Item[\"Culture_Level\"]—>Value; personedit.m_marital = (char *)(_bstr_t)dataset.GetFields()—>Item[\"Marital_Condition”]-〉Value; personedit.m_card = (char *)(_bstr_t)dataset.GetFields()—>Item[”Id_Card\"]—>Value; personedit。m_office = (char *)(_bstr_t)dataset.GetFields()-〉Item[”Office_phone\"]-〉Value; personedit.m_mobile = (char *)(_bstr_t)dataset。GetFields()—>Item[”Mobile\"]-〉Value; CString hire = (char *)(_bstr_t)dataset。GetFields()—〉Item[\"HireDate”]—>Value; if (!hire.IsEmpty()) { //设置日期数据 int yy=atoi(hire.Left(4)); int mm=atoi(hire。Mid(6,2)); int dd=atoi(hire。Mid(9,2)); CTime thire(yy,mm,dd,0,0,0); personedit.m_hire = thire; } personedit.m_duty = (char *)(_bstr_t)dataset。GetFields()->Item[”Duty\"]—〉Value; personedit.m_memo = (char *)(_bstr_t)dataset。GetFields()-〉Item[”Memo\"]—〉Value; personedit。m_files = (char *)(_bstr_t)dataset.GetFields()->Item[\"Files_Keep_Org”]—>Value; personedit.m_hukou = (char *)(_bstr_t)dataset.GetFields()-〉Item[”Hukou”]->Value; personedit.m_family = (char *)(_bstr_t)dataset.GetFields()-〉Item[\"Family_Place”]->Value; personedit.m_DeptData = dataset.GetFields()->Item[”Dept\"]-〉Value; if (personedit.DoModal() == IDOK) { dataset。SetFieldValue(\"Emp_Id”,(_bstr_t)personedit。m_id); dataset。SetFieldValue(”Emp_NAME\(_bstr_t)personedit。m_name); dataset。SetFieldValue(\"Sex”,(_bstr_t)personedit.m_sex); dataset.SetFieldValue(\"Nationality\)personedit。m_nationality); 21 dataset。SetFieldValue(”Birth\(_bstr_t)personedit.m_birth.Format(”%Y-%m—%d”)); dataset。SetFieldValue(\"Political_Party”,(_bstr_t)personedit.m_farty); dataset。SetFieldValue(”Culture_Level\",(_bstr_t)personedit.m_culture); dataset.SetFieldValue(”Marital_Condition”,(_bstr_t)personedit.m_marital); dataset.SetFieldValue(\"Id_Card\",(_bstr_t)personedit。m_card); dataset.SetFieldValue(\"Office_phone\",(_bstr_t)personedit.m_office); dataset。SetFieldValue(\"Mobile”,(_bstr_t)personedit.m_mobile); dataset.SetFieldValue(\"HireDate”,(_bstr_t)personedit.m_hire。Format(\"%Y—%m-%d”)); dataset。SetFieldValue(\"Duty”,(_bstr_t)personedit.m_duty); dataset。SetFieldValue(”Memo\(_bstr_t)personedit.m_memo); dataset.SetFieldValue(\"Files_Keep_Org”,(_bstr_t)personedit.m_files); dataset。SetFieldValue(\"Hukou”,(_bstr_t)personedit.m_hukou); dataset.SetFieldValue(”Family_Place\(_bstr_t)personedit。m_family); dataset.SetFieldValue(\"dept”,personedit.m_DeptData); dataset。Save(); UpdatePerson(); } } 单击“删除”按钮,实现删除当前选中的人员记录。代码如下; void CPersonManage::OnDelete() { if (MessageBox(”是否删除此记录!\提示\ MB_YESNO|MB_ICONWARNING) == IDYES) { if (m_list。GetSelectionMark() == -1) return; int id = m_list。GetItemData(m_list.GetSelectionMark()); CADODataSet dataset; dataset.SetConnection(::GetConnection()); CString str; str。Format(\"select * from tab_Employees where autoid = %d”,id); dataset。Open(str); dataset。Delete(); dataset.Save(); UpdatePerson(); } } 初始化函数,代码如下; BOOL CPersonManage::OnInitDialog() { 22 CDialog::OnInitDialog(); m_DeptID = —1; UpdateDept(); int i = 0; m_list。InsertColumn(i,”人员编号\"); m_list.SetColumnWidth(i++,80); m_list.InsertColumn(i,”人员名称\"); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,”性别”); m_list.SetColumnWidth(i++,50); m_list.InsertColumn(i,”民族\"); m_list.SetColumnWidth(i++,50); m_list。InsertColumn(i,”出生日期\"); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,”政治面貌”); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,”文化程度”); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,”婚姻状况\"); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,”身份证号”); m_list。SetColumnWidth(i++,100); m_list。InsertColumn(i,”办公电话\"); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,”手机电话\"); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,”到岗日期\"); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,”职务”); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,”备注\"); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,\"家庭住址\"); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,\"档案所在地”); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,”户口所在地”); m_list。SetColumnWidth(i++,100); m_list。SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); UpdatePerson(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE 23 } void CPersonManage::OnSelchangedTreedept(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; m_DeptID = m_tree.GetItemData(pNMTreeView—〉itemNew。hItem); UpdatePerson(); *pResult = 0; } ➢ 十、考勤管理模块设计 A. 概述:将所有的人又当天的考勤信息录入到该 模块中, 并且可以根据年、月及员工对已录入的考勤记录进行查询,界面如下: B. 实现过程: a. 创建对话框 b. 向对话框中添加相应的控件 c. 给对话框添加对话框类 d. 给类添加函数及成员变量 e. 给控件关联变量 C. 相关实现代码: UpdateList方法用于更新显示人员的考勤信息,代码如下: void CCheckManage::UpdateList() { this-〉UpdateData(); CString str; if (m_check) str.Format(\"Select * From tab_check”); else { CString Starttime,EndTime; Starttime = m_yy + ”-\" + m_mm + \"-1” ; EndTime。Format(”DATEADD(month,1,’%s')\ if (m_emp == \"(全部)\") str.Format(\"Select * From tab_check where checkdate between '%s’ and %s\",Starttime,EndTime); else str。Format(\"Select * From tab_check where name = ’%s’ and checkdate 24 between ’%s’ and %s\",m_emp,Starttime,EndTime); } CADODataSet dataset; dataset.SetConnection(::GetConnection()); dataset。Open(str); m_list。DeleteAllItems(); for (int i = 0 ; i < dataset.GetRecordCount() ; i++) { int n = 0; long data = dataset.GetFields()->Item[\"autoid\"]—>Value; m_list。InsertItem(i,”\"); m_list。SetItemData(i,data); m_list。SetItemText(i,n++,(_bstr_t)dataset.GetFields()—>Item[\"name\"]—〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()—>Item[”ondutytime\"]-〉Value); m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()—>Item[”offdutytime\"]-〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()-〉Item[”ontime\"]—>Value); m_list.SetItemText(i,n++,(_bstr_t)dataset。GetFields()->Item[\"offtime”]-〉Value); m_list.SetItemText(i,n++,(_bstr_t)dataset。GetFields()->Item[\"leave”]—〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()-〉Item[\"onleave”]->Value); m_list.SetItemText(i,n++,(_bstr_t)dataset。GetFields()—>Item[”offleave\"]—〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()->Item[”latetime”]—>Value); m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()—>Item[\"leaveearly”]—〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()—〉Item[\"memo\"]-〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()—>Item[”checkdate\"]-〉Value); dataset.Next(); } } OnAdd方法,用于想考勤信息表中添加员工的日考勤数据,代码如下: void CCheckManage::OnAdd() { 25 CCheckEdit checkedit; if (checkedit。DoModal() == IDOK) { CString time; CString str = ”Select top 1 * From tab_check\"; CADODataSet dataset; dataset。SetConnection(::GetConnection()); dataset。Open(str); dataset。AddNew(); dataset。SetFieldValue(”name\",(_bstr_t)checkedit.m_name); dataset。SetFieldValue(”checkdate”,(_bstr_t)checkedit.m_datecheck.Format(”%Y—%m—%d\")); dataset.SetFieldValue(\"ondutytime\(_bstr_t)checkedit.m_timeonduty。Format(\"%H:%M:%S”)); dataset。SetFieldValue(”offdutytime\(_bstr_t)checkedit。m_timeoffduty.Format(”%H:%M:%S”)); dataset。SetFieldValue(\"ontime”,(_bstr_t)checkedit.m_timeon。Format(”%H:%M:%S\")); dataset.SetFieldValue(”offtime”,(_bstr_t)checkedit。m_timeoff。Format(”%H:%M:%S”)); dataset.SetFieldValue(”leave\",(_bstr_t)checkedit.m_leave); dataset.SetFieldValue(\"onleave”,(_bstr_t)checkedit.m_timeonleave.Format(”%H:%M:%S\")); dataset。SetFieldValue(\"offleave”,(_bstr_t)checkedit.m_timeoffleave.Format(\"%H:%M:%S” )); dataset。SetFieldValue(”memo”,(_bstr_t)checkedit。m_memo); CTime latetime = DecTime(checkedit.m_timeon,checkedit.m_timeonduty); time。Format(\"%d:%d:%d\",latetime。GetHour(),latetime。GetMinute(),latetime。GetSecond()); dataset.SetFieldValue(\"latetime”,(_bstr_t)time); CTime leaveearly = DecTime(checkedit.m_timeoff,checkedit.m_timeoffduty); time.Format(”%d:%d:%d\",leaveearly.GetHour(),leaveearly.GetMinute(),leaveearly.GetSecond()); dataset。SetFieldValue(”leaveearly\)time); dataset.Save(); UpdateList(); } } OnEdit方法,用于编辑考勤信息表中的员工的日考勤数据,代码如下: void CCheckManage::OnEdit() 26 { if (m_list。GetSelectionMark() == —1) return; int id = m_list。GetItemData(m_list.GetSelectionMark()); CCheckEdit checkedit; CString str; str。Format(”Select * From tab_check where autoid = %d”,id); CADODataSet dataset; dataset.SetConnection(::GetConnection()); dataset。Open(str); checkedit.m_name = (char *)(_bstr_t)dataset。GetFields()—〉Item[\"name”]-〉Value; checkedit.m_timeonduty = GetTimeForStr((char *)(_bstr_t)dataset.GetFields()—>Item[\"ondutytime\"]—〉Value); checkedit。m_timeoffduty = GetTimeForStr((char *)(_bstr_t)dataset.GetFields()->Item[”offdutytime”]->Value); checkedit.m_timeon = GetTimeForStr((char *)(_bstr_t)dataset.GetFields()-〉Item[”ontime”]->Value); checkedit。m_timeoff = GetTimeForStr((char *)(_bstr_t)dataset.GetFields()-〉Item[”offtime\"]—>Value); checkedit。m_leave = (char *)(_bstr_t)dataset。GetFields()—〉Item[”leave”]-〉Value; checkedit.m_timeonleave = GetTimeForStr((char *)(_bstr_t)dataset。GetFields()->Item[\"onleave\"]-〉Value); checkedit.m_timeoffleave = GetTimeForStr((char *)(_bstr_t)dataset.GetFields()—〉Item[\"offleave”]->Value); checkedit。m_memo = (char *)(_bstr_t)dataset。GetFields()—>Item[”memo”]-〉Value; checkedit。m_datecheck = GetDateForStr((char *)(_bstr_t)dataset。GetFields()—〉Item[”checkdate\"]->Value); if (checkedit。DoModal() == IDOK) { CString time; dataset。SetFieldValue(\"name”,(_bstr_t)checkedit。m_name); dataset.SetFieldValue(”checkdate\(”%Y—%m-%d\")); dataset。SetFieldValue(”ondutytime”,(_bstr_t)checkedit。m_timeonduty.Format(”%H:%M:%S”)); dataset。SetFieldValue(\"offdutytime”,(_bstr_t)checkedit。m_timeoffduty.Format(”%H:%M:%S\")); dataset.SetFieldValue(\"ontime\。m_timeon。Format(\"%H:%M:%S\")); 27 dataset。SetFieldValue(\"offtime\(_bstr_t)checkedit。m_timeoff。Format(”%H:%M:%S”)); dataset。SetFieldValue(”leave”,(_bstr_t)checkedit。m_leave); dataset.SetFieldValue(”onleave”,(_bstr_t)checkedit。m_timeonleave。Format(\"%H:%M:%S”)); dataset。SetFieldValue(”offleave”,(_bstr_t)checkedit。m_timeoffleave.Format(”%H:%M:%S”)); dataset.SetFieldValue(\"memo\",(_bstr_t)checkedit.m_memo); CTime latetime = DecTime(checkedit。m_timeon,checkedit.m_timeonduty); time.Format(\"%d:%d:%d\),latetime。GetMinute(),latetime.GetSecond()); dataset。SetFieldValue(”latetime”,(_bstr_t)time); CTime leaveearly = DecTime(checkedit。m_timeoffduty,checkedit。m_timeoff); time.Format(”%d:%d:%d\。GetHour(),leaveearly。GetMinute(),leaveearly.GetSecond()); dataset.SetFieldValue(”leaveearly”,(_bstr_t)time); dataset.Save(); UpdateList(); } } OnDelete方法,用于删除当前选中的考勤记录,代码如下: void CCheckManage::OnDelete() { if (MessageBox(\"是否删除此记录!”,\"提示\ MB_YESNO|MB_ICONWARNING) == IDYES) { if (m_list.GetSelectionMark() == -1) return; int id = m_list。GetItemData(m_list.GetSelectionMark()); CADODataSet dataset; dataset。SetConnection(::GetConnection()); CString str; str。Format(”select * from tab_check where autoid = %d”,id); dataset.Open(str); dataset.Delete(); dataset.Save(); UpdateList(); } } void CCheckManage::OnCheck1() { 28 UpdateList(); } void CCheckManage::OnCloseupComboemp() { UpdateList(); } void CCheckManage::OnCloseupCombomm() { UpdateList(); } void CCheckManage::OnCloseupComboyy() { } UpdateList(); BOOL CCheckManage::OnInitDialog() //初始化函数 { CDialog::OnInitDialog(); int i = 0; m_list。InsertColumn(i,”人员姓名”); m_list。SetColumnWidth(i++,100); m_list。InsertColumn(i,”上班时间”); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,\"下班时间\"); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,”上班考勤时间”); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,”下班考勤时间”); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,\"请假类别\"); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,\"请假起始时间\"); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,\"请假结束时间\"); m_list.SetColumnWidth(i++,100); m_list.InsertColumn(i,\"迟到时间”); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,\"早退时间”); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,\"备注”); m_list。SetColumnWidth(i++,100); m_list.InsertColumn(i,”考勤日期\"); m_list。SetColumnWidth(i++,130); 29 m_list。SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_check = true; this—>UpdateData(false); int curyear,curmonth; CTime time(CTime::GetCurrentTime()); curyear = time.GetYear(); curmonth = time。GetMonth(); char value[10]; for (int y = 2000; y 〈 2100 ;y++) { _itoa(y,value,10); m_cyy。InsertString(y—2000,value); } m_cyy。SetCurSel(curyear—2000); for (int n = 1 ; n<=12 ;n++) { _itoa(n,value,10); m_cmm.InsertString(n-1,value); } m_cmm.SetCurSel(curmonth-1); CADODataSet dataset; dataset。SetConnection(::GetConnection()); dataset。Open(”Select * From tab_Employees”); m_cemp。InsertString(0,”(全部)\"); for (int index = 1 ; index <= dataset.GetRecordCount() ; index++) { m_cemp。InsertString(index,(_bstr_t)dataset。GetFields()—〉Item[”emp_name”]-〉Value); dataset。Next(); } m_cemp.SetCurSel(0); UpdateList(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } ➢ 十一、考勤汇总查询模块设计 A. 概述:该模块用于将日常录入的员工考勤信息根据时间按段和人员进行汇总查询,并且显示员工的月出勤天数,迟到天数等,界面如下: 30 B.实现过程: 同以上模块步骤 C. 相关代码: UpdateList方法用于更新考勤汇总查询的数据。代码如下: void CCheckSum::UpdateList() { m_list。DeleteAllItems(); this-〉UpdateData(); CADODataSet dataset; dataset.SetConnection(::GetConnection()); CString str,temp,where,datestr,StartDate,EndDate; StartDate = m_yy + ”—\" + m_mm + \"—1\" ; EndDate。Format(”DATEADD(month,1,'%s')\",StartDate); datestr.Format(” between '%s’ and %s\,EndDate); //*/ temp += ”select emp。emp_name ,ROUND(isnull(works.workday,0),2)”; temp += ” workday,ROUND(isnull(lates。lateday,0),2) lateday,\"; temp += \" ROUND(isnull(leaveearlys。leaveearlyday,0),2) leaveearlyday,”; temp += ” ROUND(isnull(bjdays.bjday,0),2) bjday,ROUND(isnull(sjdays。sjday,0),2) sjday\"; temp += ” from tab_Employees emp ”; temp += \" left join\"; temp += ” (select sum(DATEDIFF(second,ontime,offtime)) / 60.0 / 60.0 / 8.0\"; temp += \" as workday,name From tab_check where checkdate %s group by name)\"; temp += \" works on emp。emp_name = works.name”; temp += ” left join\"; temp += \" (select (sum(DATEPART(Hour,latetime)) * 60 * 60 + \"; temp += ” sum(DATEPART(minute,latetime)) * 60 + sum(DATEPART(second,latetime)))”; temp += ” /60.0 /60。0 /8.0 as lateday,name From tab_check where checkdate\"; temp += ” %s group by name) lates on emp.emp_name = lates.name\"; temp += ” left join\"; temp += ” (select (sum(DATEPART(Hour,leaveearly)) * 60 * 60 + ”; 31 temp += \" sum(DATEPART(minute,leaveearly)) * 60 + sum(DATEPART(second,leaveearly)))\"; temp += ” /60。0 /60.0 /8。0 as leaveearlyday,name From tab_check where \"; temp += \" checkdate %s group by name) leaveearlys on emp。emp_name”; temp += ” = leaveearlys.name”; temp += ” left join”; temp += ” (select isnull(sum(DATEDIFF(second,onleave,offleave))\"; temp += ” / 60。0 / 60。0 / 8.0,0) as bjday,name From tab_check where”; temp += \" leave = ’病假’ and checkdate %s group by name) ”; temp += \" bjdays on emp.emp_name = bjdays。name”; temp += ” left join”; temp += \" (select isnull(sum(DATEDIFF(second,onleave,offleave)) \"; temp += \" / 60.0 / 60.0 / 8。0,0) as sjday,name From tab_check where \"; temp += \" leave = '事假’ and checkdate %s group by name) \"; temp += \" sjdays on emp。emp_name = sjdays.name\"; temp += \" %s\";//*/ // where.Format(” where emp。emp_name = '%s’”,m_emp); if (m_emp == \"(全部)\") str。Format(temp,datestr,datestr,datestr,datestr,datestr,\"”); else str。Format(temp,datestr,datestr,datestr,datestr,datestr,where); //*/ dataset.Open(str,adLockUnspecified); for (int i = 0; i < dataset.GetRecordCount() ; i++) { int n = 0; m_list。InsertItem(i,\"”); m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()—>Item[\"emp_name”]-〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item[\"workday\"]->Value); m_list。SetItemText(i,n++,(_bstr_t)dataset。GetFields()-〉Item[\"lateday\"]-〉Value); m_list。SetItemText(i,n++,(_bstr_t)dataset.GetFields()—〉Item[”leaveearlyday”]->Value); m_list.SetItemText(i,n++,(_bstr_t)dataset。GetFields()—〉Item[”bjday”]-〉Value); 32 m_list.SetItemText(i,n++,(_bstr_t)dataset。GetFields()—>Item[\"sjday\"]—〉Value); dataset。Next(); }//*/ } 初始化函数,代码如下: BOOL CCheckSum::OnInitDialog() { CDialog::OnInitDialog(); int i = 0; m_list。InsertColumn(i,”人员姓名”); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,\"工作总天数\"); m_list。SetColumnWidth(i++,100); m_list。InsertColumn(i,”迟到总天数”); m_list。SetColumnWidth(i++,100); m_list。InsertColumn(i,”早退总天数”); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,”病假总天数”); m_list.SetColumnWidth(i++,100); m_list。InsertColumn(i,”事假总天数”); m_list。SetColumnWidth(i++,100); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECTLVS_EX_GRIDLINES); int curyear,curmonth; CTime time(CTime::GetCurrentTime()); curyear = time。GetYear(); curmonth = time.GetMonth(); char value[10]; for (int y = 2000; y < 2100 ;y++) { _itoa(y,value,10); m_cyy。InsertString(y—2000,value); } m_cyy。SetCurSel(curyear-2000); for (int n = 1 ; n〈=12 ;n++) { _itoa(n,value,10); m_cmm。InsertString(n—1,value); } m_cmm.SetCurSel(curmonth-1); CADODataSet dataset; | 33 dataset.SetConnection(::GetConnection()); dataset。Open(”Select * From tab_Employees\"); m_cemp.InsertString(0,”(全部)”); for (int index = 1 ; index <= dataset.GetRecordCount() ; index++) { m_cemp。InsertString(index,(_bstr_t)dataset。GetFields()->Item[\"emp_name”]->Value); dataset。Next(); } m_cemp.SetCurSel(0); UpdateList(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CCheckSum::OnCloseupCyy() { UpdateList(); } void CCheckSum::OnCloseupCmm() { UpdateList(); } void CCheckSum::OnCloseupCemp() { UpdateList(); } ➢ 十二、后续补充部分: 一些过程的具体实现方法总结及图片解释: 一、 导入位图资源 先添加一个pictrue控件,然后导入位图资源 右击项目名,点击插入,点击Bitmap,然后导入,找到要导入的文件。位图就导入了,然后修改pictrue控件的属性,使其为bitmap的格式。然后在image处选择图像的ID。 二、 创建一个菜单资源,并设置各个菜单项的ID和名称。 右击项目名,点击插入,点击menu,即实现菜单的创建。 在主对话框类里(例如persondlg.h中的persondlg类中)添加菜单对象,CMenu m_menu; 在窗体的初始化部分(如persondlg类中的BOOL 34 CPersonDlg::OnInitDialog()中)载入菜单资源,m_menu.LoadMenu(IDR_MENU) 设置菜单与窗体关联this->SetMenu(&m_menu) 三、 添加对话框及对话框类 首先,在dialog处右击,点击添加对话框 然后添加控件 然后双击对话框,添加对话框类 在name框里填写想添加的类名 然后点击OK即可添加一个对话框类或类 如图: 四、 通过类向导向主窗口添加“菜单项或者按钮控件”的单击事件. 在窗口类的编辑部分右击,选择类向导进入如下界面: (消息映射系统自动添加) 点击Message Maps(消息映射按钮)选择 菜单或者按钮ID如图选择ID_MENUITMUSER,双击COMMAND即可添加一个点击事件的函数,可在函数里填写想要实现的功能,如: void CPersonDlg::OnMenuitemuser() { CUserManage usermanage; usermanage。DoModal(); } 使点击ID为ID_MENUITMUSER的菜单,运行上面函数里的相应代码,上例是显示一个用户管理对话框。 注意:想给哪个对话框的菜单添加单机事件,就在哪个对话框类的编辑框内 右击,然后在弹出的类向导中如上图,添加你想添加的方法(即函数)。 五、 添加成员变量 在相应类的类名处右击,出现如图所示窗口: 可以在相应的框内填写变量类型,名称,即在类内的属性如;pubilc、protected、private。 六、 添加成员函数 在相应类的类名处右击,出现如图所示窗口: 可以在相应的框内填写函数类型,名称,即在类内的属性 35 如;pubilc、protected、private。 七、 新建类 在项目名称处右击,然后点击New class 出现如下对话框: 可以在相应的框内填写类名,并且点击更改可以选择类的头文件“.h\"和“.cpp”文件名 八、 使用类向导为控件关联“变量” 点中控件,右击,选择类向导,点击出现如下对话框: 点击Member Variables 选择要添加变量的的控件ID双击,出现如下对话框: 在相应框填写变量名,选择变量的类型(Category)是控件还是数值。然后点击ok。 ➢ 十三、心得 通过这次自主的编写项目,我了解了visual c++的基本使用方 法,学会了对话框编程的基本技术,从以前对这个编程工具的一窍不通,到现在的能写个小项目,我感觉收获很多,为了完成这个项目,虽然花费了我大量的时间和精力,但是我有了进步和提高,我从中得到了知识和快乐,并且增加了我对这门课程的热爱和关注。我要继续努力学习,更进一步的提高我的个人编程开发能力。 36 因篇幅问题不能全部显示,请点此查看更多更全内容