• 80.01 KB
  • 2022-05-17 13:47:48 发布

人事考勤管理系统c++课程设计文档

  • 35页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
课程设计人事考勤管理系统目录第一部分:开发背景……………………………………………………………..3第二部分:系统分析………………………………………………………………3第三部分:系统设计……………………………………………………………..9第四部分:公共类设计………………………………………………………….15第五部分:主题窗设计………………………………………………………….16第六部分:用户登录模块设计……………………………………………...17第七部分:用户管理模块设计………………………………………………20第八部分:部门管理模块设计………………………………………………23第九部分:人员信息管理模块设计……………………………………...32第十部分:考勤模块设计………………………………………………………40第十一部分:考勤汇总模块设计……………………………………………45第十二部分:后续补充部分:一些过程的具体实现方法总结及图片解释:…………………………………………………………………....51第十三部分:心得…………………………………………………………………..51人事考勤管理系统Ø开发背景某公司业务不断发展,员工数量不断增加,人事考勤方面的管理已成为公司管理中的重要部分,但传统的人事考勤制度已不能有效地管理员工的出勤状况,急需一套人事考勤管理的有效工具 ——人事考勤管理系统。Ø二、系统分析1)需求分析通过对人事考勤管理过程的研究和分析,要求本系统应该具有以下功能。a)用户登录。b)部门信息录入c)人员信息管理d)考勤信息录入e)考勤信息汇总。2)系统功能描述用户需要输入用户名和密码进入人事考勤管理系统,对各部门、员工的基本信息进行维护和管理。在考勤管理模块中录入员工当天的考勤信息,同时可对年、月、员工进行查询。此外,还可以通过考勤汇总查询模块对员工某月的考勤记录进行汇总,计算出员工月工作天数、早退、迟到的天数。Ø三、系统设计1)系统目标人事考勤管理系统以实现员工日常出勤信息管理为设计目标,加以强大的数据库管理功能,可以极大地提高人事部门的日常工作效率。本系统在设计时满足以下几点:a)采用人机对话的操作方式,信息查询灵活、方便、快捷、准确,数据存储安全可靠。b)对考勤信息的操作简单,可以方便地进行添加、修改、和删除。c)可以录入员工信息、部门信息。d)对员工的考勤信息按月汇总计算。e)对用户输入的数据,系统进行严格的数据检验,尽可能排除人为错误。f)系统最大限度地实现了易维护性和易操作性。g)系统运行稳定、安全可靠。2)系统功能结构人事考勤管理系统的功能结构如图所示:人事考勤管理系统考勤数据录入考勤信息汇总用户管理部门信息管理员工信息管理3)业务流图 人事考勤管理系统业务流程图如图:用户登录部门、员工信息维护考勤信息汇总查询考勤信息录入1)系统预览:人事考勤管理系统由多个功能模块组成,下面仅列出一些典型的功能模块,其他模块以后陆续列出:a)部门管理模块如图:主要管理各部门之间的结构信息b)用户管理模块如图:用于用户的一些操作管理c)人员信息管理如图:主要用于维护员工的基本信息d)考勤管理模块如图:用于记录人事考勤的信息e)考勤汇总查询如图:对员工的考勤信息进行汇总统计2)数据库设计A.数据库分析人事考勤系统采用SQLServer2021数据库,数据库名称为tb_person在数据库中建立四个表存储不同的信息,如图:B.数据库逻辑设计a)管理员信息表(tab_user),用于保存管理员的信息,如图:b)部门信息表(tab_Dept)用于记录部门的信息,如图:C)考勤信息表(tab_check)用于记录考勤信息 a)员工信息表(tab_Employees)保存公司员工信息,如图:Ø四、公共类设计本系统采用ADO连接数据库。为了能够方便的使用ADO建立数据库连接并进行相应的数据操作,在公共类中对系统中是使用的ADO操作进行了封装。在系统中建立了ADO的两个公共类CADOConnection和CADODataSet,这两个类定义在ADO.h头文件中,实现在ADO.cpp文件中。A.CADOConnection类CADOConnection类是用来连接数据库的,实现了对_Connection接口的封装。CADOConnection类在头文件中的定义如下:#import"C:ProgramFilesCommonFilesSystemadomsado15.dll"no_namespacerename("EOF","adoEOF")classCADOConnection{private:staticvoidInitADO();//初始化ADOstaticvoidUnInitADO();protected:_ConnectionPtrm_Connection;//指针接口public:BOOLIsOpen();//判断是否与数据库连接_ConnectionPtrGetConnection();//获取连接接口CStringGetSQLConStr();//获取SQL连接字符串BOOLOpen(CStringConStr);//建立数据库连接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();}voidCADOConnection::InitADO()//InitADO是一个静态方法,用于初始化OLE{if(ConCount++==0)CoInitialize(NULL);};voidCADOConnection::UnInitADO()//UnInitADO是一个静态方法,用于取消初始化OLE{if(--ConCount==0)CoUninitialize();};BOOLCADOConnection::Open(CStringConStr)//通过指定的数据库连接字符串于SQL数据库建立连接{if(IsOpen())m_Connection->Close();m_Connection->Open((_bstr_t)ConStr,"","",adModeUnknown);returnIsOpen();}CStringCADOConnection::GetSQLConStr()//生成数据库连接需要的字符串{CStringStr;Str.Format("Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurityInfo=False;InitialCatalog=tb_person;DataSource=LONGFEI-PC\SQLEXPRESS");returnStr;}_ConnectionPtrCADOConnection::GetConnection()//该方法用于返回_Connection接口指针{returnm_Connection;}BOOLCADOConnection::IsOpen()//判断当前数据库连接对象与数据库的连接状态 {longState;m_Connection->get_State(&State);if(State==adStateOpen)returntrue;returnfalse;}CADODataSet类的定义如下:classCADODataSet{protected:_RecordsetPtrm_DataSet;//数据集接口指针CADOConnection*m_Connection;//数据库连接对象public:BOOLOpen(CStringSQLStr,intLockType);//打开记录集voidDelete();//记录删除intGetRecordNo();//获取记录集行号voidmove(intnIndex);//移动记录指针voidSave();//保存对记录集的修改voidSetFieldValue(CStringFieldName,_variant_tValue);//设置字段的值voidAddNew();//添加新纪录BOOLNext();//记录集指针指向下一个记录FieldsPtrGetFields();//获取记录集字段集合intGetRecordCount();//获取记录集中记录数量voidSetConnection(CADOConnection*pCon);//设置记录集的数据库连接对象BOOLOpen(CStringSQLStr);//打开记录集CADODataSet();virtual~CADODataSet();private:BOOLIsOpen();};CADODataSet类的实现如下:CADODataSet::CADODataSet()//该方法为记录集实现类的构造方法,在该方法中实现记录集接口对象的创建{m_DataSet.CreateInstance("ADODB.Recordset");}CADODataSet::~CADODataSet()//实现记录集的关闭与接口的释放{if(IsOpen())m_DataSet->Close();m_DataSet=NULL;m_Connection=NULL;} voidCADODataSet::SetConnection(CADOConnection*pCon)//设置记录集所连接的数据库连接类的对象{m_Connection=pCon;}intCADODataSet::GetRecordCount()//获取记录集中数据的数量{if(IsOpen())returnm_DataSet->GetRecordCount();elsereturn0;}BOOLCADODataSet::Open(CStringSQLStr)//打开数据集{if(IsOpen())m_DataSet->Close();//*/m_DataSet->Open(_bstr_t(SQLStr),_variant_t((IDispatch*)g_Connection.GetConnection(),true),adOpenKeyset,adLockOptimistic,adCmdText);returnIsOpen();//*/}BOOLCADODataSet::IsOpen()//判断数据集是否处于打开状态{longState;m_DataSet->get_State(&State);if(State==adStateOpen)returntrue;returnfalse;}FieldsPtrCADODataSet::GetFields()//用来获取记录集中字段的集合{returnm_DataSet->GetFields();}BOOLCADODataSet::Next()//记录集指针下移一位{if(m_DataSet->adoEOF)returnfalse;m_DataSet->MoveNext();returntrue;}voidCADODataSet::AddNew(){ m_DataSet->AddNew();}voidCADODataSet::SetFieldValue(CStringFieldName,_variant_tValue)//想记录集中指定的字段赋值{m_DataSet->PutCollect((_bstr_t)FieldName,Value);}voidCADODataSet::Save()//保存记录集数据所做的修改{m_DataSet->Update();}voidCADODataSet::move(intnIndex)//将记录集的当前指针移动到指定的索引位置{m_DataSet->MoveFirst();m_DataSet->Move(nIndex);}intCADODataSet::GetRecordNo()//获取记录集中的当前行号{returnm_DataSet->AbsolutePosition;}voidCADODataSet::Delete()//删除记录集中的当前行{m_DataSet->Delete(adAffectCurrent);}BOOLCADODataSet::Open(CStringSQLStr,intLockType){if(IsOpen())m_DataSet->Close();//*/m_DataSet->Open(_bstr_t(SQLStr),_variant_t((IDispatch*)g_Connection.GetConnection(),true),adOpenKeyset,(LockTypeEnum)LockType,adCmdText);returnIsOpen();}Ø五、主题窗设计A.主题窗由菜单和图片组成,如图:B.主题窗设计步骤:a.启动visualc++,选择File/New命令,打开New对话框b.在左侧选择MFCAppWizard(exe)选项,在Project name编辑框中输入工程名称,在location编辑框中设置保存工程的路径,然后单击OK按钮,打开MFCAppWizard对话框,选择对话框编程,打击fishc.像工程中导入位图,菜单资源(具体操作在最后有补充)Ø六、用户登录模块设计A.概述,登录界面是每个管理系统应该具备的,本系统的登录模块如图:B.技术分析窗体应在主题窗创建之前并显示,在登录窗体创建的同时应该建立数据库连接,具体操作如下:BOOLbCon=、GetConnection()->Open(GetConnection()->GetSQLConStr());CLoginDialoglogindlg;if(logindlg.DoModal()!=IDOK)returnfalse;::CoInitialize(NULL);CPersonDlgdlg;A.实现过程a.创建一个对话框b.向对话框中添加两个静态文本控件、一个编辑框控件、和两个按钮控件。分别设置两个静态文本控件的Caption属性为“用户名”和“密码”设置编辑框控件类型为password;分别设置连个按钮为“确定”和“取消”。C.在窗体初始化方法中创建用户表的数据,并将用户添加到列表框控件中。代码如下:BOOLCLoginDialog::OnInitDialog(){CDialog::OnInitDialog();m_DataSet.SetConnection(GetConnection());m_DataSet.Open("Select*FromTab_User");intcount=m_DataSet.GetRecordCount();for(inti=0;iItem[L"UserName"]->Value); m_DataSet.Next();}m_UserList.SetCurSel(0);returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}d.确定按钮事件代码如下:voidCLoginDialog::OnLogin(){CStringsql,user,pass;m_UserList.GetWindowText(user);m_PassWord.GetWindowText(pass);sql.Format("Select*Fromtab_userWhereUserName="%s"andPassWord="%s"",user,pass);m_DataSet.Open(sql);if(m_DataSet.GetRecordCount()==1){::SetUserName(user);this->OnOK();}elseAfxMessageBox("用户名或密码不正确!");}Ø七、用户管理模块A.概况:能实现添加,修改,删除等操作如图: A.实现过程:a.创建一个对话框b.向对话框中添加相应的控件c.给对话框添加对话框类d.给类添加函数及成员变量e.给控件关联变量f.编写函数C.实现代码:a.定义UpdateGrid方法用来更新列表视图中的信息代码如下:voidCUserManage::UpdateGrid(){m_DataSet.Open("Select*Fromtab_User");m_grid.DeleteAllItems();for(inti=0;iItem[L"UserName"]->Value);intno=m_DataSet.GetRecordNo();m_grid.SetItemData(i,no);m_DataSet.Next();}}b.添加按钮代码如下:voidCUserManage::OnAppend() {CUserEdituseredit;if(useredit.DoModal()==IDOK){m_DataSet.AddNew();m_DataSet.SetFieldValue("UserName",(_bstr_t)useredit.name);m_DataSet.Save();UpdateGrid();}}a.删除按钮代码:voidCUserManage::OnDelete(){if(MessageBox("是否删除此记录!","提示",MB_YESNO|MB_ICONWARNING)==IDYES){intno=m_grid.GetItemData(m_grid.GetSelectionMark());m_DataSet.move(no-1);m_DataSet.Delete();m_DataSet.Save();UpdateGrid();}}b.修改按钮代码:voidCUserManage::OnEdit(){CUserEdituseredit;intno=m_grid.GetItemData(m_grid.GetSelectionMark());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. 概述:该模块记录了部门间的的层次结构和部门信息,一般使用树控件实现,如图:A.实现过程:a.创建一个对话框b.向对话框中添加相应的控件c.给对话框添加对话框类d.给类添加函数及成员变量e.给控件关联变量f.编写函数C.相关代码如下:BOOLCDeptManage::OnInitDialog()//初始化函数{CDialog::OnInitDialog();m_DataSet.SetConnection(::GetConnection());UpdateDept();returnTRUE;}将部门信息一次性读入树控件中。代码如下:voidCDeptManage::GetNode(HTREEITEMpNode,intnPid){HTREEITEMnode;CADODataSetDataSet;DataSet.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwherepid=%d",nPid);DataSet.Open(str);intcount=DataSet.GetRecordCount();intID;_variant_tvalue;for(inti=0;iItem["DeptName"]->Value,pNode);value=(_variant_t)DataSet.GetFields()->Item["ID"]->Value;ID=value.intVal;m_tree.SetItemData(node,ID);GetNode(node,ID);DataSet.Next();}} 定义GetNode方法,用于按成次级关系获取部门表中的所有数据,并添加树控件,该方法由UpdateDept方法进行调用,代码如下;voidCDeptManage::UpdateDept(){m_tree.DeleteAllItems();GetNode(TVI_ROOT,0);}voidCDeptManage::OnAdd(){CDeptEditdeptedit;if(deptedit.DoModal()==IDOK){HTREEITEMpNode=m_tree.GetSelectedItem();intpID;if(deptedit.isroot)pID=0;elsepID=m_tree.GetItemData(pNode);CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open("Selecttop1*Fromtab_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();}}单击“修改”按钮时将弹出部门编辑窗体,输入部门信息后单击“确定”按钮,实现部门信息的修改。代码如下voidCDeptManage::OnEdit(){CDeptEditdeptedit;deptedit.visible=false;HTREEITEMpNode=m_tree.GetSelectedItem();if(pNode==0)return;intpID=m_tree.GetItemData(pNode);CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwhereid=%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();}}当单击“删除”按钮时,将删除当前选中的节点,代码如下:voidCDeptManage::OnDelete(){HTREEITEMpNode=m_tree.GetSelectedItem();if(pNode==0)return;if(MessageBox("是否删除此记录!","提示",MB_YESNO|MB_ICONWARNING)==IDYES){intpID=m_tree.GetItemData(pNode);CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwhereid=%d",pID);dataset.Open(str);dataset.Delete();dataset.Save();UpdateDept();}}Ø九、人员信息管理模块设计A.概述:人员信息管理模块根据部门分类显示人员,同时可对人员信息进行维护,界面如下:B.实现过程:a.创建对话框b.向对话框中添加相应的控件c.给对话框添加对话框类d.给类添加函数及成员变量e.给控件关联变量A.相关代码:GetNode方法,获取部门信息,并添加到树控件中。该方法由UpdateDept调用,代码如下:voidCPersonManage::GetNode(HTREEITEMpNode,intnPid){ HTREEITEMnode;CADODataSetDataSet;DataSet.SetConnection(::GetConnection());CStringstr;str.Format("Select*Fromtab_Deptwherepid=%d",nPid);DataSet.Open(str);intcount=DataSet.GetRecordCount();intID;_variant_tvalue;for(inti=0;iItem["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,实现信息更新,代码如下:voidCPersonManage::UpdateDept(){m_tree.DeleteAllItems();HTREEITEMnode;node=m_tree.InsertItem("全部",TVI_ROOT);m_tree.SetItemData(node,-1);GetNode(node,0);}UpdatePerson更新人员信息,并将其显示在列表控件中。代码如下:voidCPersonManage::UpdatePerson(){m_list.DeleteAllItems();CADODataSetDataSet;DataSet.SetConnection(::GetConnection());CStringstr;if(m_DeptID==-1)str.Format("Select*Fromtab_Employees");elsestr.Format("Select*Fromtab_EmployeeswhereDept=%d",m_DeptID);DataSet.Open(str);intcount=DataSet.GetRecordCount();intn=0;_variant_tvalue; for(inti=0;iItem["Emp_Id"]->Value);value=DataSet.GetFields()->Item["AutoID"]->Value;m_list.SetItemData(n,value.lVal);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Emp_NAME"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Sex"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Nationality"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Birth"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Political_Party"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Culture_Level"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->Item["Marital_Condition"]->Value);m_list.SetItemText(n,index++,(_bstr_t)DataSet.GetFields()->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();}}单击“添加”按钮,弹出人员编辑窗体,输入人员信息后,单击保存按钮,实现人员的添加代码如下:voidCPersonManage::OnAdd(){CPersonEditpersonedit;personedit.m_DeptData=m_DeptID;if(personedit.DoModal()==IDOK){CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr="selecttop1*fromtab_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",(_bstr_t)personedit.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",(_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();}}单击“修改”按钮,弹出人员编辑窗体,输入人员信息后,单击“保存”实现人员信息的修改,代码如下:voidCPersonManage::OnEdit(){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CPersonEditpersonedit;CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("select*fromtab_Employeeswhereautoid=%d",id);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;CStringbirth=(char*)(_bstr_t)dataset.GetFields()->Item["Birth"]->Value;if(!birth.IsEmpty()){//设置日期数据intyy=atoi(birth.Left(4));intmm=atoi(birth.Mid(6,2));intdd=atoi(birth.Mid(9,2));CTimetbirth(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;CStringhire=(char*)(_bstr_t)dataset.GetFields()->Item["HireDate"]->Value;if(!hire.IsEmpty()){//设置日期数据intyy=atoi(hire.Left(4));intmm=atoi(hire.Mid(6,2));intdd=atoi(hire.Mid(9,2));CTimethire(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",(_bstr_t)personedit.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",(_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();}}单击“删除”按钮,实现删除当前选中的人员记录。代码如下;voidCPersonManage::OnDelete(){if(MessageBox("是否删除此记录!","提示",MB_YESNO|MB_ICONWARNING)==IDYES){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("select*fromtab_Employeeswhereautoid=%d",id);dataset.Open(str);dataset.Delete();dataset.Save();UpdatePerson();}}初始化函数,代码如下;BOOLCPersonManage::OnInitDialog(){CDialog::OnInitDialog();m_DeptID=-1;UpdateDept();inti=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();returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCPersonManage::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.创建对话框 a.向对话框中添加相应的控件b.给对话框添加对话框类c.给类添加函数及成员变量d.给控件关联变量A.相关实现代码:UpdateList方法用于更新显示人员的考勤信息,代码如下:voidCCheckManage::UpdateList(){this->UpdateData();CStringstr;if(m_check)str.Format("Select*Fromtab_check");else{CStringStarttime,EndTime;Starttime=m_yy+"-"+m_mm+"-1";EndTime.Format("DATEADD(month,1,"%s")",Starttime);if(m_emp=="(全部)")str.Format("Select*Fromtab_checkwherecheckdatebetween"%s"and%s",Starttime,EndTime);elsestr.Format("Select*Fromtab_checkwherename="%s"andcheckdatebetween"%s"and%s",m_emp,Starttime,EndTime);}CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open(str);m_list.DeleteAllItems();for(inti=0;iItem["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方法,用于想考勤信息表中添加员工的日考勤数据,代码如下:voidCCheckManage::OnAdd(){CCheckEditcheckedit;if(checkedit.DoModal()==IDOK){CStringtime;CStringstr="Selecttop1*Fromtab_check";CADODataSetdataset;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);CTimelatetime=DecTime(checkedit.m_timeon,checkedit.m_timeonduty);time.Format("%d:%d:%d",latetime.GetHour(),latetime.GetMinute(),latetime.GetSecond());dataset.SetFieldValue("latetime",(_bstr_t)time);CTimeleaveearly=DecTime(checkedit.m_timeoff,checkedit.m_timeoffduty);time.Format("%d:%d:%d",leaveearly.GetHour(),leaveearly.GetMinute(),leaveearly.GetSecond());dataset.SetFieldValue("leaveearly",(_bstr_t)time);dataset.Save();UpdateList();}}OnEdit方法,用于编辑考勤信息表中的员工的日考勤数据,代码如下:voidCCheckManage::OnEdit(){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CCheckEditcheckedit;CStringstr;str.Format("Select*Fromtab_checkwhereautoid=%d",id);CADODataSetdataset;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){CStringtime;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);CTimelatetime=DecTime(checkedit.m_timeon,checkedit.m_timeonduty);time.Format("%d:%d:%d",latetime.GetHour(),latetime.GetMinute(),latetime.GetSecond());dataset.SetFieldValue("latetime",(_bstr_t)time);CTimeleaveearly=DecTime(checkedit.m_timeoffduty,checkedit.m_timeoff);time.Format("%d:%d:%d",leaveearly.GetHour(),leaveearly.GetMinute(),leaveearly.GetSecond()); dataset.SetFieldValue("leaveearly",(_bstr_t)time);dataset.Save();UpdateList();}}OnDelete方法,用于删除当前选中的考勤记录,代码如下:voidCCheckManage::OnDelete(){if(MessageBox("是否删除此记录!","提示",MB_YESNO|MB_ICONWARNING)==IDYES){if(m_list.GetSelectionMark()==-1)return;intid=m_list.GetItemData(m_list.GetSelectionMark());CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr;str.Format("select*fromtab_checkwhereautoid=%d",id);dataset.Open(str);dataset.Delete();dataset.Save();UpdateList();}}voidCCheckManage::OnCheck1(){UpdateList();}voidCCheckManage::OnCloseupComboemp(){UpdateList();}voidCCheckManage::OnCloseupCombomm(){UpdateList();}voidCCheckManage::OnCloseupComboyy(){UpdateList();}BOOLCCheckManage::OnInitDialog()//初始化函数{CDialog::OnInitDialog();inti=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);m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);m_check=true;this->UpdateData(false);intcuryear,curmonth;CTimetime(CTime::GetCurrentTime());curyear=time.GetYear();curmonth=time.GetMonth();charvalue[10];for(inty=2000;y<2100;y++){_itoa(y,value,10);m_cyy.InsertString(y-2000,value);}m_cyy.SetCurSel(curyear-2000);for(intn=1;n<=12;n++){_itoa(n,value,10);m_cmm.InsertString(n-1,value);}m_cmm.SetCurSel(curmonth-1); CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open("Select*Fromtab_Employees");m_cemp.InsertString(0,"(全部)");for(intindex=1;index<=dataset.GetRecordCount();index++){m_cemp.InsertString(index,(_bstr_t)dataset.GetFields()->Item["emp_name"]->Value);dataset.Next();}m_cemp.SetCurSel(0);UpdateList();returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}Ø十一、考勤汇总查询模块设计A.概述:该模块用于将日常录入的员工考勤信息根据时间按段和人员进行汇总查询,并且显示员工的月出勤天数,迟到天数等,界面如下:B.实现过程:同以上模块步骤A.相关代码:UpdateList方法用于更新考勤汇总查询的数据。代码如下:voidCCheckSum::UpdateList(){m_list.DeleteAllItems();this->UpdateData();CADODataSetdataset;dataset.SetConnection(::GetConnection());CStringstr,temp,where,datestr,StartDate,EndDate;StartDate=m_yy+"-"+m_mm+"-1";EndDate.Format("DATEADD(month,1,"%s")",StartDate);datestr.Format("between"%s"and%s",StartDate,EndDate);//*/temp+="selectemp.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+="fromtab_Employeesemp";temp+="leftjoin";temp+="(selectsum(DATEDIFF(second,ontime,offtime))/60.0/60.0/8.0";temp+="asworkday,nameFromtab_checkwherecheckdate%sgroupbyname)";temp+="worksonemp.emp_name=works.name";temp+="leftjoin";temp+="(select(sum(DATEPART(Hour,latetime))*60*60+";temp+="sum(DATEPART(minute,latetime))*60+sum(DATEPART(second,latetime)))";temp+="/60.0/60.0/8.0aslateday,nameFromtab_checkwherecheckdate";temp+="%sgroupbyname)latesonemp.emp_name=lates.name";temp+="leftjoin";temp+="(select(sum(DATEPART(Hour,leaveearly))*60*60+";temp+="sum(DATEPART(minute,leaveearly))*60+sum(DATEPART(second,leaveearly)))";temp+="/60.0/60.0/8.0asleaveearlyday,nameFromtab_checkwhere";temp+="checkdate%sgroupbyname)leaveearlysonemp.emp_name";temp+="=leaveearlys.name";temp+="leftjoin";temp+="(selectisnull(sum(DATEDIFF(second,onleave,offleave))";temp+="/60.0/60.0/8.0,0)asbjday,nameFromtab_checkwhere";temp+="leave="病假"andcheckdate%sgroupbyname)";temp+="bjdaysonemp.emp_name=bjdays.name";temp+="leftjoin";temp+="(selectisnull(sum(DATEDIFF(second,onleave,offleave))";temp+="/60.0/60.0/8.0,0)assjday,nameFromtab_checkwhere";temp+="leave="事假"andcheckdate%sgroupbyname)";temp+="sjdaysonemp.emp_name=sjdays.name";temp+="%s";//*///where.Format("whereemp.emp_name="%s"",m_emp);if(m_emp=="(全部)")str.Format(temp,datestr,datestr,datestr,datestr,datestr,"");elsestr.Format(temp,datestr,datestr,datestr,datestr,datestr,where); //*/dataset.Open(str,adLockUnspecified);for(inti=0;iItem["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);m_list.SetItemText(i,n++,(_bstr_t)dataset.GetFields()->Item["sjday"]->Value);dataset.Next();}//*/}初始化函数,代码如下:BOOLCCheckSum::OnInitDialog(){CDialog::OnInitDialog();inti=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_FULLROWSELECT|LVS_EX_GRIDLINES);intcuryear,curmonth;CTimetime(CTime::GetCurrentTime());curyear=time.GetYear();curmonth=time.GetMonth();charvalue[10];for(inty=2000;y<2100;y++){_itoa(y,value,10);m_cyy.InsertString(y-2000,value);}m_cyy.SetCurSel(curyear-2000);for(intn=1;n<=12;n++){_itoa(n,value,10);m_cmm.InsertString(n-1,value);}m_cmm.SetCurSel(curmonth-1);CADODataSetdataset;dataset.SetConnection(::GetConnection());dataset.Open("Select*Fromtab_Employees");m_cemp.InsertString(0,"(全部)");for(intindex=1;index<=dataset.GetRecordCount();index++){m_cemp.InsertString(index,(_bstr_t)dataset.GetFields()->Item["emp_name"]->Value);dataset.Next();}m_cemp.SetCurSel(0);UpdateList();returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCCheckSum::OnCloseupCyy(){UpdateList();}voidCCheckSum::OnCloseupCmm(){UpdateList();}voidCCheckSum::OnCloseupCemp(){ UpdateList();}Ø十二、后续补充部分:一些过程的具体实现方法总结及图片解释:一、导入位图资源先添加一个pictrue控件,然后导入位图资源右击项目名,点击插入,点击Bitmap,然后导入,找到要导入的文件。位图就导入了,然后修改pictrue控件的属性,使其为bitmap的格式。然后在image处选择图像的ID.二、创建一个菜单资源,并设置各个菜单项的ID和名称。右击项目名,点击插入,点击menu,即实现菜单的创建。在主对话框类里(例如persondlg.h中的persondlg类中)添加菜单对象,CMenum_menu;在窗体的初始化部分(如persondlg类中的BOOLCPersonDlg::OnInitDialog()中)载入菜单资源,m_menu.LoadMenu(IDR_MENU)设置菜单与窗体关联this->SetMenu(&m_menu)三、添加对话框及对话框类首先,在dialog处右击,点击添加对话框然后添加控件然后双击对话框,添加对话框类在name框里填写想添加的类名然后点击OK即可添加一个对话框类或类如图:四、通过类向导向主窗口添加“菜单项或者按钮控件”的单击事件。在窗口类的编辑部分右击,选择类向导进入如下界面:(消息映射系统自动添加)点击MessageMaps(消息映射按钮)选择菜单或者按钮ID如图选择ID_MENUITMUSER,双击COMMAND即可添加一个点击事件的函数,可在函数里填写想要实现的功能,如:voidCPersonDlg::OnMenuitemuser(){CUserManageusermanage;usermanage.DoModal();}使点击ID为ID_MENUITMUSER的菜单,运行上面函数里的相应代码,上例是显示一个用户管理对话框。注意:想给哪个对话框的菜单添加单机事件,就在哪个对话框类 的编辑框内右击,然后在弹出的类向导中如上图,添加你想添加的方法(即函数)。一、添加成员变量在相应类的类名处右击,出现如图所示窗口:可以在相应的框内填写变量类型,名称,即在类内的属性如;pubilc、protected、private。二、添加成员函数在相应类的类名处右击,出现如图所示窗口:可以在相应的框内填写函数类型,名称,即在类内的属性如;pubilc、protected、private。三、新建类在项目名称处右击,然后点击Newclass出现如下对话框:可以在相应的框内填写类名,并且点击更改可以选择类的头文件“.h”和“.cpp”文件名四、使用类向导为控件关联“变量”点中控件,右击,选择类向导,点击出现如下对话框:点击MemberVariables选择要添加变量的的控件ID双击,出现如下对话框: 在相应框填写变量名,选择变量的类型(Category)是控件还是数值。然后点击ok。Ø十三、心得通过这次自主的编写项目,我了解了visualc++的基本使用方法,学会了对话框编程的基本技术,从以前对这个编程工具的一窍不通,到现在的能写个小项目,我感觉收获很多,为了完成这个项目,虽然花费了我大量的时间和精力,但是我有了进步和提高,我从中得到了知识和快乐,并且增加了我对这门课程的热爱和关注。我要继续努力学习,更进一步的提高我的个人编程开发能力。