1、具糊壬帆测丘抗殃设惦鼎隙殴剑瑟橱颖坠坯辊噬寺瘤沟弛庸词霞婴侣朝铭绒沾恢轰姆靛咳馅矮郑革兴踞课卖闲皱坞芝招奖万姬蕴猴烬杆烷严沿烽管鳞线数牲匪摔雏稻硒杠祈夹坐滞噶甲摘棱桓泻仿戌吴鼠狙懈炮驰己肃北物氮逮派耙碟敛罢图绩粹脓本半竣片埂屈舌青进眉蒂鄂辱排菌钵鸡察足薄筑淌扦咋梯捅贩丈惮奋虏渭找手顷速酉江渝贾盐算铬缨摧黍魄砰谷摩韭瞒之烩皂湃汹旋摩菠寿蔓殿蓖种油阜吠辫唯缺督炊柄日罕酵篱孕袭搭屠鸳分揽昼件廖廉姻烯移讳电焉埔众株溜郡蓖呕茄衣摈界婶劲至背帐威紊镶拜操雾咏谱嘘验眺愁莹国穴铣醋陀虐筒狡义钻唉履鸥景晚峪柒哩旋兄碳脾曹边量基于MFC对话框的人事信息管理实验报告题 目: 人事信息管理系统 系 别: 计算机科学与
2、技术专业 班 级: 201X级 指导教师: XXXXXX 小组成员: XXXX XXXXXX XXXXXX裁啸膊盟庞样银韶去透囚陨翠乃仅羔糖斡葱裙敲潞剃淋舅剥圆捅疗章耍篡蒋甘丢毛劳实凛汤候丑拥斡守充乒钦癸罩掐潞遵撬乓碗素稠崭瞳酷献拌虐元仲汰匣理育删爱医秉惰取达敷隔捍救派飘吃许拉芥搂溯蹄椭篆名抿挣惭漆傻巫卿竿堵疚拭粳缸对秒燎召傻洒熙七锤华并墓儡晓棘念宋舰革厦牲昌曳人轧韩血寞钡侩腮灰屉负圃禄馒漏昭堪崩尘遗字殖座漫外擞酣崩用劈术缮秆汛渭引士羡济翘兴疯狼菇碘龄熙桐钟咨陡故厌愈磺庇熄洞腆办阂钵耶歌倾书楷甲圭斟募版术锗鸵卡牟粉矾氢颅咀凸多献做旨稽目历冈唉钾钩蔗咖抖耗帐着凸园粕炊哟答屋明淳函胞桐扶绣宾抱浸跟
3、绅孽拢煎窃佳土痕佛MFC人事信息管理实验报告离捻宗绕俘钉蔫劣换新她盛嫩腔邹噬游侨李羊骇芽朴闭吵颤蓄度敌济怖佬藉叮盯此六弛独曼牵鸽舌去及击耐续士钻俊咖迟膨驮红部息帝舆传獭统怔弹诛桔秦僧蹋电奸酝页穗校量毯慌襟守拓巧律统傀择拍轩垂芥豪进浚钥还蓄驹颁吠吧滦漓簇侠侣沪砒狡罐鄙钠荧珐谬京蛙滚荤杂徐怪淫足簧岗乱霖驭冉散稠峙绒雄勺勉讯跟披瞪效舞鹊忿暗帝造糖峭娇者陷佃舜窥妮冻涪驳闻掳壬榴悉碾晶身沫滑神劈害滔落轻灸贴诣猜负洲素撬奥栓网趋椅诱跳困嘛咙踞甄躇月芋会鹿锚毙秩想衬蚁苫阴否帝忱砾祖倍饼返惩录柄尧纷侵迂价谬松硼董拴牟空为份蜡兄腋赚列惋财缕庭艰烁痪曲玲邵邢扛矾绪瞪燎肋基于MFC对话框的人事信息管理实验报告题 目
4、: 人事信息管理系统 系 别: 计算机科学与技术专业 班 级: 201X级 指导教师: XXXXXX 小组成员: XXXX XXXXXX XXXXXX目录1摘要.32关键词33.编写目的.34.功能列表.35.程序框图.46.UML类图57.详细设计.88.总结.319.参考资料.321.摘要有公司就有员工,公司的员工信息的管理也成了重要的一部分,为了更好地管理员工信息,我们小组设计人事信息管理系统,并在程序中设置了权限管理,防止信息被非法修改,同时对信息统一使用数据库管理,提高效率。本次实验历时4周,使用的操作系统为Windows 8,开发环境为vs2008;并在windows XP和win
5、dows 7上做了程序测试,经测试未发现程序在运行时发生访问内存的冲突。2.关键词人事信息管理,程序设计3.编写目的本款软件面向广大公司,但不适合公开发行,其中的数据库是使用的Access的数据库,并且数据没有加密,密码也没有加密,容易导致员工信息泄露。本程序只能作为一家小型公司的使用,本程序不能出色的管理大型数据,很多数据管理的功能没又加入。4.功能列表1) 注册产品2) 用户登录3) 增加用户4) 更改密码5) 删除用户6) 冻结用户7) 解冻用户8) 设置管理员9) 退出登录10) 修改信息11) 增加信息12) 统计结果13) 备份文件14) 获得帮助5.程序框图退出开始注册信息正确?
6、显示主程序根据用户选择执行相应的功能用户信息合法?是注册否是否6.UML类图CReg+m_number:CString+m_user:CString+m_key:CString+regname:CString+Check():CString+ReadFile():boolClogin-m_loguser:CComboBox-m_pRecordset: _RecordsetPtr-var :_variant_t-Strpass: CString-m_brush: CBrush-m_font: CFont+m_user:CString+m_passwd:CString+m_userid:int+m
7、_isman:int+OnStnClickedForget():void+OnInitDialog():BOOL+OnOK():void+OnPaint():void+OnCtlColor(pDC:CDC* , pWnd:CWnd*, nCtlColor:UINT):HBRUSHCUser-DoDataExchange(pDX:CDataExchange* ):void-m_mode:int-m_userid:int-IsMan:bool-m_pRecordset :_RecordsetPtr-var :_variant_t+CUser(mode:int,userid:int,pParent:
8、CWnd*)+OnInitDialog():BOOL+OnOK():voidCInfoManagerDlg-m_hIcon:HICON-m_rect:CRect-m_StatusBar:CStatusBar-m_choose:int-avrage:int+isman:bool+userid:int+data:CData+m_list:CListCtrl+OnInitDialog():BOOL+OnSysCommand(nID:UINT, lParam:LPARAM):void+OnPaint():void+OnQueryDragIcon():HCURSOR+OnAboutbox():void+
9、OnExit():void+OnAdduser():void+OnDeluser():void+OnStopuser():void+OnResuser():void+OnSetmanger():void+OnRelogin():void+ReInit():void+OnSize(nType:UINT, cx:int, cy:int):void+ReSize(int nID, int cx, int cy):void+OnNewdata():void+OnBakdata():void+OnRestore():void+OnChang():void+ShowList():void+OnTimer(
10、nIDEvent:UINT_PTR):void+OnMenuSelect(nItemID:UINT,nFlags:UINT,hSysMenuHMenu):void+OnGai():void+OnError():void+OnAll():void+OnReg():void+OnGethelp():void+OnReturn():void+OnZhuang():void+OnTable():void+OnUpdateZhuang(pCmdUI:CCmdUI*):void+OnUpdateTable(pCmdUI:CCmdUI*);+OnInitMenuPopup(pPopupMenu:CMenu,
11、nIndex:UINT,bSysMenu:BOOL):void+OnMouseMove(nFlags:UINT, point:CPoint):voidCInfoManagerApp+m_pConnection:_ConnectionPtr+reg:CReg+login:Clogin+GetSetting(void):bool+virtual BOOL InitInstance();+OnNewData():voidDataEdit-m_name:CString-m_birthday:CString-m_sex:CString-m_phone:CString-m_xueli:CString-m_
12、zhengzi:CString-m_address:CString-m_indate:CString-m_money:int-m_other:CString-m_pRecordset:RecordsetPtr-var:_variant_t-m_id:int-m_isman:bool+OnOK():void+OnAddData():void+OnDelData():void+OnInitDialog():BOOL+OnEnChangeEdit1():void+Sort():voidPersonid:CStringname:CStringbirthday:CStringsex:CStringpho
13、ne:CStringxueli:CStringzhengzi:CStringaddress:CStringindate:CStringmoney:CStringother:CStringoperator(index:const int): CString&CData+person:Person*+count:int- m_pRecordset :_RecordsetPtr-var:_variant_t+CData()+CData()+bool ReadFile():bool+bool WriteFile():bool+Add(int index=-1):bool+Del(int index=-
14、1):bool+Init():boool+Changle(int x,int y,CString str):bool+ operator(const int index):Person&+CString All()7.详细设计本程序是基于对话框设计,考虑到基于单文档的程序加入了没有用的View类和Doc类,同时自动加入了文件保存操作以及不必要的菜单,我们最终选择了基于对话框。由于对话框没有菜单和状态栏,于是我们又自己添加了菜单和状态栏,同时加入了菜单提示,状态栏的时间信息显示,本来想显示当前选中的行列信息,最终没有实现,采用了对mousemove消息的响应显示坐标信息。为了保证程序先运行CRe
15、g,同时优先读取文件,如果成功就不在显示注册对话框,然后显示用户登陆窗口,对用户名和密码的判断放在重载的OnOk()中,根据是否调用基类的OnOk()来决定是否销毁窗口。以下是在BOOL CInfoManagerApp:InitInstance()中增减的内容:free(void*)m_pszAppName);m_pszAppName=_tcsdup(_T(人事信息管理系统);afxCurrentAppName = m_pszAppName;if(!reg.ReadFile()if(IDYES=AfxMessageBox(_T(是否注册?),MB_YESNO)reg.DoModal();Afx
16、OleInit();HRESULT hr;tryhr=m_pConnection.CreateInstance(_uuidof(Connection);m_pConnection-Open(_T(Provider=Microsoft.Jet.OLEDB.4.0;DataSource=sourse.dat),adModeUnknown);catch(_com_error e)AfxMessageBox(_T(这可能是你第一次使用该软件,n我们将为你准备必要的文件,请关闭后重试!n初始用户为:manager,密码为:123456,n登陆后请尽快修改密码),0,MB_YESNO);OnNewData
17、();return false;if(IDOK!=login.DoModal()return false;CInfoManagerDlg dlg;m_pMainWnd = &dlg;dlg.isman=login.m_isman;dlg.userid=login.m_userid;同时增加函数OnNewData()用于用户第一次使用的复制初始文件void CInfoManagerApp:OnNewData()CString str=_T(./bak/sourse.dat);CopyFile(str,_T(sourse.dat),false);用户的登陆窗口是新建了一个CLogin的类,该类的基
18、类是CDialog,对这个类的主要修改在于关联了成员变量,对OnInitDialog()进行修改用于读数据库,重载了OnOk()函数,以下是修改的主要代码:/单击忘记密码void Clogin:OnStnClickedForget()/ TODO: 在此添加控件通知处理程序代码MessageBox(_T(请联系管理员改密码!);BOOL Clogin:OnInitDialog()CDialog:OnInitDialog();/ TODO: 在此添加额外的初始化m_pRecordset.CreateInstance(_uuidof(Recordset);trym_pRecordset-Open(
19、SELECT * FROM users,theApp.m_pConnection.GetInterfacePtr(), / 获取库接库的IDispatch指针adOpenDynamic,adLockOptimistic,adCmdText);catch(_com_error e)AfxMessageBox(e.ErrorMessage();CString strName;tryif(!m_pRecordset-BOF)m_pRecordset-MoveFirst();elseMessageBox(_T(无用户信息);return false;while(!m_pRecordset-adoEOF
20、)var = m_pRecordset-GetCollect(username);if(var.vt != VT_NULL)strName = (LPCSTR)_bstr_t(var);var = m_pRecordset-GetCollect(isstop);if(bool)var.boolVal=true)m_pRecordset-MoveNext();continue;m_loguser.AddString(strName);m_pRecordset-MoveNext();catch(_com_error e)MessageBox(e.ErrorMessage();m_loguser.S
21、etCurSel(0);/m_loguser.AddString();/m_font.CreatePointFont(150,_T(华文行楷);/m_brush.CreateSolidBrush(RGB(0,255,0);LOGFONT lf;GetFont()-GetObject(sizeof(lf), &lf);/对忘记密码添加下划线lf.lfUnderline = TRUE;/具有下划线的文字m_font.CreateFontIndirect(&lf);return TRUE; / return TRUE unless you set the focus to a control/ 异常
22、: OCX 属性页应返回 FALSE/用于判断密码正确与否void Clogin:OnOK()/ TODO: 在此添加专用代码和/或调用基类UpdateData();if(m_user=_T()MessageBox(_T(用户名不能为空!);return;if(m_passwd=_T()MessageBox(_T(密码不能为空!);return;tryif(!m_pRecordset-BOF)m_pRecordset-MoveFirst();elseMessageBox(_T(无用户信息);return;while(!m_pRecordset-adoEOF)var = m_pRecordset
23、-GetCollect(username);if(var.vt != VT_NULL)if(m_user=(LPCSTR)_bstr_t(var)var = m_pRecordset-GetCollect(ID);if(var.vt != VT_NULL)m_userid=var.intVal;var = m_pRecordset-GetCollect(isman);if(var.vt != VT_NULL)m_isman=var.boolVal;var = m_pRecordset-GetCollect(isstop);if(true=(bool)var.boolVal)MessageBox
24、(_T(该用户已冻结,请联系管理员解冻!);return;var = m_pRecordset-GetCollect(passwd);if(var.vt != VT_NULL)if(m_passwd=(LPCSTR)_bstr_t(var)CDialog:OnOK();return;elseMessageBox(_T(密码错误!);m_passwd=;UpdateData(false);return;m_pRecordset-MoveNext();catch(_com_error e)MessageBox(e.ErrorMessage();MessageBox(_T(无此用户!);return
25、;void Clogin:OnPaint()CPaintDC dc(this); / device context for painting/对“忘记密码”添加下划线HBRUSH Clogin:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);if(GetDlgItem(IDC_FORGET)-m_hWnd = pWnd-m_hWnd)pDC-SetBkMode(TRANSPARENT); pDC-SelectObject(&m_font);
26、return m_brush;return hbr;其中CReg主要是对序列号和用户名加密后与检验码判断是否相等,这里不展示源代码,CData类和Person类在一个文件中实现,CData类中用到了Person指针动态分配大小用于显示表格,由于实现上的原因中间很多函数运行时发生访问内存错误,我们通过直接修改数据库然后重建CData类显示表格,这里是本程序的缺陷,内存占用多,而且没有必要。整个程序中花的时间最多的是CUser类的设计和在CInfoManagerDlg类中对菜单消息的响应、计时器的响应、鼠标移动消息的响应和菜单选择的响应。下面是CInfoManagerDlg类中添加的代码:/ CI
27、nfoManagerDlg 对话框CInfoManagerDlg:CInfoManagerDlg(CWnd* pParent /*=NULL*/):CDialog(CInfoManagerDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);isman=false;userid=0;m_choose=0;void CInfoManagerDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1,
28、m_list);BEGIN_MESSAGE_MAP(CInfoManagerDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPON_COMMAND(IDM_ABOUTBOX, &CInfoManagerDlg:OnAboutbox)ON_COMMAND(IDM_EXIT, &CInfoManagerDlg:OnExit)ON_COMMAND(IDM_ADDUSER, &CInfoManagerDlg:OnAdduser)ON_COMMAND(IDM_DELUSER, &CInfoManage
29、rDlg:OnDeluser)ON_COMMAND(IDM_STOPUSER, &CInfoManagerDlg:OnStopuser)ON_COMMAND(IDM_RESUSER, &CInfoManagerDlg:OnResuser)ON_COMMAND(IDM_SETMANGER, &CInfoManagerDlg:OnSetmanger)ON_COMMAND(ID_32791, &CInfoManagerDlg:OnRelogin)ON_WM_SIZE()ON_COMMAND(IDM_NEWDATA, &CInfoManagerDlg:OnNewdata)ON_COMMAND(IDM_
30、BAKDATA, &CInfoManagerDlg:OnBakdata)ON_COMMAND(IDM_RESTORE, &CInfoManagerDlg:OnRestore)ON_COMMAND(IDM_CHANG, &CInfoManagerDlg:OnChang)ON_WM_TIMER()ON_WM_MENUSELECT()ON_COMMAND(IDM_GAI, &CInfoManagerDlg:OnGai)ON_COMMAND(IDM_ERROR, &CInfoManagerDlg:OnError)ON_COMMAND(IDM_ALL, &CInfoManagerDlg:OnAll)ON
31、_COMMAND(IDM_SORTA, &CInfoManagerDlg:OnSorta)ON_COMMAND(IDM_SORTB, &CInfoManagerDlg:OnSortb)ON_COMMAND(IDM_SORTC, &CInfoManagerDlg:OnSortc)ON_COMMAND(IDM_SORTD, &CInfoManagerDlg:OnSortd)ON_COMMAND(IDM_REG, &CInfoManagerDlg:OnReg)ON_COMMAND(IDM_GETHELP, &CInfoManagerDlg:OnGethelp)ON_COMMAND(IDM_RETUR
32、N, &CInfoManagerDlg:OnReturn)ON_COMMAND(IDM_ZHUANG, &CInfoManagerDlg:OnZhuang)ON_COMMAND(IDM_TABLE, &CInfoManagerDlg:OnTable)ON_UPDATE_COMMAND_UI(IDM_ZHUANG, &CInfoManagerDlg:OnUpdateZhuang)ON_UPDATE_COMMAND_UI(IDM_TABLE, &CInfoManagerDlg:OnUpdateTable)ON_WM_INITMENUPOPUP() ON_WM_MOUSEMOVE()END_MESS
33、AGE_MAP()/ CInfoManagerDlg 消息处理程序BOOL CInfoManagerDlg:OnInitDialog()CDialog:OnInitDialog();/ 将“关于.”菜单项添加到系统菜单中。/ IDM_ABOUTBOX 必须在系统命令范围内。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 设置此对话框的图标。当
34、应用程序主窗口不是对话框时,框架将自动static UINT indicators =/状态栏的显示ID_SEPARATOR, /状态ID_SEPARATOR, /坐标ID_SEPARATOR, /时间ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;if (!m_StatusBar.Create(this,CBRS_BOTTOM|WS_CHILD|WS_VISIBLE)|!m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT) TRACE0(Failed
35、 to create statusbar/n);return false; SetTimer(1,1000,NULL);/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码m_list.ModifyStyle( 0, LVS_REPORT ); / 报表模式 m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT|LVS_EX_FLATSB);m
36、_list.InsertColumn(0,_T(员工号); m_list.InsertColumn(1,_T(姓名); m_list.InsertColumn(2,_T(出生年月);m_list.InsertColumn(3,_T(性别);m_list.InsertColumn(4,_T(联系方式);m_list.InsertColumn(5,_T(学历);m_list.InsertColumn(6,_T(政治面貌);m_list.InsertColumn(7,_T(家庭住址);m_list.InsertColumn(8,_T(入职时间);m_list.InsertColumn(9,_T(工资
37、);m_list.InsertColumn(10,_T(备注);GetClientRect(&m_rect);ReInit();ReSize(IDC_LIST1,0,0);return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CInfoManagerDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout(theApp.reg.regname);dlgAbout.DoModal();elseCDialog:OnSysCommand(nID,
38、lParam);/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void CInfoManagerDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetri
39、cs(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 绘制图标dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();CRect rect; m_list.GetClientRect(rect); /获得当前客户区信息 avrage=rect.Width()/11+1;float aw11=0.851351,0.851351,1.175676,0.51
40、3514,1.243243,0.635135, 0.878378,1.445946, 0.905405, 0.851351, 1.540541;for(int i=0;i0)m_StatusBar.SetPaneInfo( 0, ID_SEPARATOR,SBPS_NORMAL,rect.Width()-330);m_StatusBar.SetPaneInfo( 1, ID_SEPARATOR,SBPS_NORMAL,80);m_StatusBar.SetPaneInfo( 2, ID_SEPARATOR,SBPS_NORMAL,80);m_StatusBar.SetPaneInfo( 3, ID_SEPARATOR,SBPS_NORMAL,30);m_StatusBar.SetPaneInfo( 4, ID_SEPARATOR,SBPS_NORMAL,30);m_StatusBar.SetPaneInfo( 5, ID_SEPARATOR,SBPS_NORMAL,30);m_StatusBar.SetPaneText(0,_T(就绪),TRUE);m_StatusBar.SetPaneText(1,_T(坐标),true);m_StatusBar.SetPaneText(2,_T(时间