




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一章 需求规格说明书1.1引言1.1.1 编写目的作为开发着与用户的公共文档,方便开发者与用户之间的沟通,以实现项目正常、快速、良好的完成,并达到预期效果与要求。同时也便于用户对最终产品的性能参数及功用了解,也方便开发者对程序的处理。1.1.2 项目背景随着电子产品快速发展,在手机用户大量激增的今天,人们需要记录管理的电话号码也越来越多,面对如此压力,简单的电话本将很难在满足人们的需求,拥有一个良好的电话簿管理系统则是必须的。 本款软件包含了一半电话簿的基本功能,即添加、删除、插入、查找用户等,同时还扩大了电话簿容量以及生存范围,即在内存允许的情况下添加用户数量不做限制,且可在多系统下运行。
2、1.1.3 定义术语原文缩写电话簿PhoneBookPbook查找用户FindFind添加用户AddAdd插入用户InsertInsert删除用户DeleteDel1.1.4 参考资料揣锦华.面向对象程序设计与VC+实践.西安:西安电子科技大学出版社,2005.1.2软件产品的一般性描述1.2.1 运行环境Windows系统: Win9X WinNT Win2000 WinXP Win71.2.2 产品功能 电话簿管理系统电话簿管理系统查找添加删除修改查找添加删除修改用户操作用户操作退出退出1.2.3 用户特征适宜各种人群,特别是工作繁忙,电话用户较多的人。1.2.4 限制与约束 编程语言:V
3、C+ 编程工具:Microsoft Visual C+ 6.01.3 功能行为需求联系人手机号码分组地址邮编等查找添加插入删除1.3.1 用例图联系人手机号码分组地址邮编等查找添加插入删除 用户退出退出1.3.2 输出结果与格式退出删除插入添加查找退出删除插入添加查找 添加:姓名*手机号码*分组*QQ*地址邮编等*退出主窗口界面退出主窗口界面请输入查找内容: 1.4 性能需求系统运行稳定系统数据安全系统响应迅速扩展性强方便操作1.5 运行需求1.5.1 用户界面 主界面:1.5.2 硬件环境微机要求:CPU P/133以上;内存32兆以上;硬盘2G以上;显示器VGA等1.5.3 软件环境Win
4、dows系统: Win9X WinNT Win2000 WinXP Win7第二章 详细设计2.1 界面设计用户主界面:添加:未选中位置的插入:选中插入:未选中位置的删除:选中删除:查找:2.2 数据结构#include MainFrm.h结构体声明:struct Person/声明包含个人信息的结构体, CString name;/姓名 CString sex;/姓别 CString phone;/电话号码 CString address;/住址 CString postcode;/邮编 CString qq;/QQ CString group;/分组 ;struct Node /声明结点,
5、结点类型为结构体型,分为两域:数据域存放个人信息,指针域存放前后结点的联系方式. Person person; Node *prev;/前驱指针 Node *next;/后继指针; 类的声明: class PersonInfo:public CObject/声明通讯录类,管理通讯录 public:int length;/贮存表长 Node *first;/双链表的头指针 DECLARE_SERIAL(PersonInfo) PersonInfo()first= new Node;first-prev=NULL;first-next=NULL;length=0;/建立只有头指针的空双链表 Per
6、sonInfo(Person a,int n);/声明有参构造函数 建立有n个元素的双链表 /类的构造函数重载 Node * Find(int i);/找到指向第i个结点的指针,并返回该指针. void Insert(Person x,int i);/插入算法 void Delete(int i); /删除算法 void Append(Person x);/在表尾追加结点 PersonInfo(); /声明类的析构函数void Serialize(CArchive &ar); void Display(CListCtrl *pList,CMainFrame *pFrame); ;第三章 程序编
7、码3.1 代码整体结构说明OnInitialUpdate():初始更新OnSize():使控件的大小随窗口大小改变而改变OnRclickList(NMHDR* pNMHDR, LRESULT* pResult):右击列表控件,弹出快捷菜单OnClickList(NMHDR* pNMHDR, LRESULT* pResult):单击列表控件,选中项目,并在状态栏显示OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult):双击列表控件,编辑项目内容OnAdd():单击添加按钮时执行OnAdd()函数OnInsert():单击“插入”按钮时执行OnInsert()
8、函数OnDel():单击“删除”按钮时执行OnDel()函数OnFind():单击查找按钮时执行OnFind()函数OnReport():“详细信息”显示模式OnSmall() :“缩略图”显示模式OnList() :“列表”显示模式3.2 关键代码*文档的序列化*void CStuInfoSysDoc:Serialize(CArchive& ar)if (ar.IsStoring()m_personInfo.Serialize(ar);elsem_personInfo.Serialize(ar);UpdateAllViews(NULL);/更新所有视图#ifdef _DEBUGvoid CS
9、tuInfoSysDoc:AssertValid() constCDocument:AssertValid();void CStuInfoSysDoc:Dump(CDumpContext& dc) constCDocument:Dump(dc);#endif /_DEBUG*单击添加按钮时执行OnAdd()函数*void CStuInfoSysDoc:OnAdd() CAddDlg dlg;if (dlg.DoModal()!=IDOK)return;Node* pNode;/判断添加的人是否已经在通讯录中if (dlg.m_strName.IsEmpty()AfxMessageBox(姓名不
10、能为空!);return;if (dlg.m_strPost.GetLength()!=6)AfxMessageBox(邮政编码必须是六位!请重新核对!);return;int nCount=m_personInfo.length;for (int i=1;=dlg.m_strName)AfxMessageBox(您已经添加该记录!);return;if(pNode-person.phone=dlg.m_strPhone)AfxMessageBox(该电话号码与+pN+的电话号码重复了n请检查!);return;Person newPers
11、on;/定义一个Person型变量,存贮用户从添加对话框添加的信息.newPerson.address=dlg.m_strAddr;newP=dlg.m_strName;newPerson.phone=dlg.m_strPhone;newPerson.postcode=dlg.m_strPost;newPerson.sex=dlg.m_strSex;newPerson.qq=dlg.m_strQQ;newPerson.group=dlg.m_strGroup;/在链表末尾添加新的结点this-m_personInfo.Append(newPerson);SetModifie
12、dFlag();/该函数默认值为TRUE,用于在文档每次改变后,关闭前提醒用户保存UpdateAllViews(NULL);*单击“插入”按钮时执行该函数*void CStuInfoSysDoc:OnInsert() /获取指向视图的指针POSITION pos=GetFirstViewPosition();if (!pos)return;CStuInfoSysView *pView=(CStuInfoSysView *)this-GetNextView(pos);/获取指向列表控件的指针CListCtrl *pList=&pView-m_listCtrl;/获取鼠标选中的项目POSITION
13、 posItem=pList-GetFirstSelectedItemPosition();int nIndex=pList-GetNextSelectedItem(posItem);if (nIndex0) /没有选中任何一个项目AfxMessageBox(请先选择插入位置!);return;CAddDlg dlg;if (dlg.DoModal()!=IDOK)return;/建立新的结点,把“加入”对话框中的变量值传给新建结点if (dlg.m_strName.IsEmpty()AfxMessageBox(姓名不能为空!);return;if (dlg.m_strPost.GetLeng
14、th()!=6)AfxMessageBox(邮政编码必须是六位!请重新核对!);return;Person newPerson;newPerson.address=dlg.m_strAddr;newP=dlg.m_strName;newPerson.phone=dlg.m_strPhone;newPerson.postcode=dlg.m_strPost;newPerson.sex=dlg.m_strSex;newPerson.qq=dlg.m_strQQ;newPerson.group=dlg.m_strGroup;Node* pNode;/判断是否已经添加过该人的信息了
15、.int nCount=m_personInfo.length;for (int i=1;=dlg.m_strName)AfxMessageBox(您已经添加该记录!);return;if(pNode-person.phone=dlg.m_strPhone)AfxMessageBox(该电话号码与+pN+的电话号码重复了n请检查!);return;/在选中项目的位置上插入结点this-m_personInfo.Insert(newPerson,nIndex+1);SetModifiedFlag();UpdateAllViews(NULL);
16、*单击“删除”按钮时执行该函数*void CStuInfoSysDoc:OnDel() / TODO: Add your command handler code herePOSITION pos=GetFirstViewPosition();/获得和该文档相关的第一个视图的位置(由于是单文档,所以与该文档关的视图只有一个)if (!pos)return;CStuInfoSysView *pView=(CStuInfoSysView *)this-GetNextView(pos);/获得和该文档相关的第一个视图的指针CListCtrl *pList=&pView-m_listCtrl;/声明一
17、个指向列表控件的指针POSITION posItem=pList-GetFirstSelectedItemPosition();/获得当前鼠标所指向的位置int nIndex=pList-GetNextSelectedItem(posItem);/获得该位置在列表控件中的索引号.if (nI,pNode-person.sex,pNode-person.phone,pNode-person.address,pNode-person.postcode,pNode-person.qq,pNode-person.group);/将信息格式化到str中if (Message
18、Box(NULL,str+n确定删除?,删除信息,MB_OKCANCEL)=IDCANCEL) return;/删除结点this-m_personInfo.Delete(nIndex+1);/列表控件的索引从0开始,而链表的索引从1开始,故加1SetModifiedFlag();UpdateAllViews(NULL);*单击查找按钮时执行该函数*void CStuInfoSysDoc:OnFind() / TODO: Add your command handler code hereCFindDlg dlg;if (dlg.DoModal()!=IDOK) return;CString s
19、tr=dlg.m_strFind;POSITION pos=GetFirstViewPosition();if (!pos)return;CStuInfoSysView *pView=(CStuInfoSysView *)this-GetNextView(pos);Node* pNode;int nCount=m_personInfo.length;/采用简单查找算法for (int i=1;=str)/姓名匹配for (int j=0;jm_listCtrl.GetItemCount();j+)pView-m_listCtrl.SetItemState(j,LVIS_
20、SELECTED,LVIS_SELECTED);pView-m_listCtrl.SetItemState(i-1,LVIS_SELECTED,LVIS_SELECTED);CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得指向主框架的指针,旨在获取指向状态栏的指针CStatusBar *pStatus=&pFrame-m_wndStatusBar;/获取指向状态栏的指针CString str;str.Format(姓名:%s 性别:%s 电话号码:%sn地址:%sn邮编:%s QQ:%s 分组:%s,pNode-person.
21、name,pNode-person.sex,pNode-person.phone,pNode-person.address,pNode-person.postcode,pNode-person.qq,pNode-person.group);pStatus-SetPaneText(1,str);/将查找到的人的信息显示在状态栏上AfxMessageBox(str);/显示查找到的人的信息/使被找到的项目选中显示pView-m_listCtrl.SetFocus();pView-m_listCtrl.SetItemState(i-1,LVIS_SELECTED,LVIS_SELECTED);bre
22、ak;if (pNode-person.phone=str)/电话匹配for (int j=0;jm_listCtrl.GetItemCount();j+)pView-m_listCtrl.SetItemState(j,LVIS_SELECTED,LVIS_SELECTED);pView-m_listCtrl.SetItemState(i-1,LVIS_SELECTED,LVIS_SELECTED);CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得指向主框架的指针,旨在获取指向状态栏的指针CStatusBar *pStatus
23、=&pFrame-m_wndStatusBar;/获取指向状态栏的指针CString str;str.Format(姓名:%s 性别:%s 电话号码:%sn地址:%sn邮编:%s QQ:%s 分组:%s,pN,pNode-person.sex,pNode-person.phone,pNode-person.address,pNode-person.postcode,pNode-person.qq,pNode-person.group);pStatus-SetPaneText(1,str);/将查找到的人的信息显示在状态栏上AfxMessageBox(str);/显
24、示查找到的人的信息/使被找到的项目选中显示pView-m_listCtrl.SetFocus();pView-m_listCtrl.SetItemState(i-1,LVIS_SELECTED,LVIS_SELECTED);break;if (pNode-person.group=str)/分组匹配for (int j=0;jm_listCtrl.GetItemCount();j+)pView-m_listCtrl.SetItemState(j,LVIS_SELECTED,LVIS_SELECTED);pView-m_listCtrl.SetItemState(i-1,LVIS_SELECTE
25、D,LVIS_SELECTED);CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;/获得指向主框架的指针,旨在获取指向状态栏的指针CStatusBar *pStatus=&pFrame-m_wndStatusBar;/获取指向状态栏的指针CString str;str.Format(姓名:%s 性别:%s 电话号码:%sn地址:%sn邮编:%s QQ:%s 分组:%s,pN,pNode-person.sex,pNode-person.phone,pNode-person.address,pNode-pe
26、rson.postcode,pNode-person.qq,pNode-person.group);pStatus-SetPaneText(1,str);/将查找到的人的信息显示在状态栏上AfxMessageBox(str);/显示查找到的人的信息/使被找到的项目选中显示pView-m_listCtrl.SetFocus();pView-m_listCtrl.SetItemState(i-1,LVIS_SELECTED,LVIS_SELECTED);break;if (inCount)/查找失败CString str1;str1.Format(没有相关:%s的记录!,str);/弹出对话框,告
27、诉用户没有找到该人的相关信息AfxMessageBox(str1);*“详细信息”显示模式*void CStuInfoSysDoc:OnReport() POSITION pos=GetFirstViewPosition();if (!pos)return;CStuInfoSysView *pView=(CStuInfoSysView *)this-GetNextView(pos);/获取与该文档相关的第一个视图的指针SetWindowLong(pView-m_listCtrl.m_hWnd,GWL_STYLE,WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT)
28、;*“缩略图”显示模式*void CStuInfoSysDoc:OnSmall() / TODO: Add your command handler code herePOSITION pos=GetFirstViewPosition();if (!pos)return;CStuInfoSysView *pView=(CStuInfoSysView *)this-GetNextView(pos);/获取与该文档相关的第一个视图的指针SetWindowLong(pView-m_listCtrl.m_hWnd,GWL_STYLE,WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_
29、ICON);*“列表”显示模式*void CStuInfoSysDoc:OnList() POSITION pos=GetFirstViewPosition();if (!pos)return;CStuInfoSysView *pView=(CStuInfoSysView *)this-GetNextView(pos);/获取与该文档相关的第一个视图的指针SetWindowLong(pView-m_listCtrl.m_hWnd,GWL_STYLE,WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_LIST);*初始更新*void CStuInfoSysView:OnInit
30、ialUpdate()CFormView:OnInitialUpdate();GetParentFrame()-RecalcLayout();ResizeParentToFit();if(!m_flag)return;m_flag=FALSE;m_flagEdit=FALSE;m_listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);/设置列表控件样式int nCount=m_listCtrl.GetHeaderCtrl()-GetItemCount();fo
31、r (int i=0;iIsKindOf(RUNTIME_CLASS(CStuInfoSysDoc);return (CStuInfoSysDoc*)m_pDocument;#endif *视图的更新函数,负责重新显示被更改后的文档的内容*void CStuInfoSysView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) CStuInfoSysDoc *pDoc=(CStuInfoSysDoc*)GetDocument();CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainW
32、nd;pDoc-m_personInfo.Display(&m_listCtrl,pFrame);*OnSize(),使控件的大小随窗口大小改变而改变*void CStuInfoSysView:OnSize(UINT nType, int cx, int cy) CFormView:OnSize(nType, cx, cy);/if语句很重要,最开始时m_listCtrl对应的资源还未生成if (m_listCtrl.m_hWnd)m_listCtrl.SetWindowPos(NULL,0,0,cx-100,cy,SWP_NOZORDER);m_listCtrl.SetColumnWidth
33、(0,(cx-100)/8);m_listCtrl.SetColumnWidth(1,(cx-100)/10);m_listCtrl.SetColumnWidth(2,(cx-100)/8);m_listCtrl.SetColumnWidth(3,(cx-100)/8);m_listCtrl.SetColumnWidth(4,(cx-100)/8);m_listCtrl.SetColumnWidth(5,(cx-100)/8);m_listCtrl.SetColumnWidth(6,(cx-100)/10);/调整四个按钮控件的位置CWnd *pWnd=GetDlgItem(ID_ADD);i
34、f (pWnd)pWnd-SetWindowPos(NULL,cx-90,20,80,30,SWP_NOZORDER);pWnd=GetDlgItem(ID_INSERT);if (pWnd)pWnd-SetWindowPos(NULL,cx-90,70,80,30,SWP_NOZORDER);pWnd=GetDlgItem(ID_DEL);if (pWnd)pWnd-SetWindowPos(NULL,cx-90,120,80,30,SWP_NOZORDER);pWnd=GetDlgItem(ID_FIND);if (pWnd)pWnd-SetWindowPos(NULL,cx-90,170
35、,80,30,SWP_NOZORDER);pWnd=GetDlgItem(ID_Cancle);if (pWnd)pWnd-SetWindowPos(NULL,cx-90,230,80,30,SWP_NOZORDER);*右击列表控件,弹出快捷菜单*void CStuInfoSysView:OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) m_edit.SetWindowPos(&CWnd:wndBottom,0,0,10,10,SWP_HIDEWINDOW);CMenu menu;menu.LoadMenu(IDR_MENU_POPUP);/载入菜单
36、资源CMenu* pPopMenu;pPopMenu=menu.GetSubMenu(0);CPoint pt;GetCursorPos(&pt);/获取光标位置pPopMenu-TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);/弹出菜单/在状态栏中显示右键选中的项目的信息CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusBar *pStatus=&pFrame-m_wndStatusBar;POSITION posItem=this-m_listCtrl.GetFirstSel
37、ectedItemPosition();int nIndex=this-m_listCtrl.GetNextSelectedItem(posItem);if (nIndexSetPaneText(1,NULL);return;*pResult = 0;*单击列表控件,选中项目,并在状态栏显示*void CStuInfoSysView:OnClickList(NMHDR* pNMHDR, LRESULT* pResult) CStuInfoSysDoc *pDoc=(CStuInfoSysDoc *)GetDocument();/获取文档指针Node *pNode;CString str,str
38、2;if (info.iItem=0) &m_flagEdit=TRUE)m_flagEdit=FALSE;str2=m_listCtrl.GetItemText(info.iItem,info.iSubItem);/获取所选项目的其子项目的内容str2.TrimRight();m_edit.GetWindowText(str);/获取编辑框的文本(请注意这里的m_edit是控件变量)str.TrimRight();if (str!=str2)pNode=pDoc-m_personInfo.Find(info.iItem+1);/获取鼠标所单击项的指针switch (info.iSubItem
39、)case 0:if(str.IsEmpty()AfxMessageBox(姓名不能空);m_edit.SetWindowPos(&CWnd:wndBottom,0,0,10,10,SWP_HIDEWINDOW);return;pN=str;break;case 1:if(str!=男&str!=女)AfxMessageBox(性别只能输入 男 或 女 !);m_edit.SetWindowPos(&CWnd:wndBottom,0,0,10,10,SWP_HIDEWINDOW);return;pNode-person.sex=str;break;case 2:p
40、Node-person.phone=str;break;case 3:pNode-person.address=str;break;case 4:if(str.GetLength()!=6)AfxMessageBox(邮政编码必须是六位!);m_edit.SetWindowPos(&CWnd:wndBottom,0,0,10,10,SWP_HIDEWINDOW);return;pNode-person.postcode=str;break;case 5:pNode-person.qq=str;break;case 6:pNode-person.group=str;break;default:b
41、reak;pDoc-SetModifiedFlag();/设置文档更改标志位pDoc-UpdateAllViews(NULL);m_edit.SetWindowPos(&CWnd:wndBottom,0,0,10,10,SWP_HIDEWINDOW);CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;CStatusBar *pStatus=&pFrame-m_wndStatusBar;/获取状态栏指针POSITION posItem=this-m_listCtrl.GetFirstSelectedItemPosition();int nIn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 202520加盟连锁店合同协议样本
- 2024年九月幼儿园驾驶员文明礼仪服务标准聘用协议
- 2025二手设备租赁合同范本
- oem啤酒合同样本
- 二零二五工地门卫劳动合同范文
- 服装店铺转让协议范例二零二五年
- 电梯临时使用协议书范文
- 付款保密协议合同样本
- 预售商品房抵押合同二零二五年
- 二零二五版公租房承租资格确认
- 数字孪生机场数据融合-全面剖析
- (二模)咸阳市2025年高考模拟检测(二)语文试卷(含答案)
- 第四单元 第2课时 三位数加三位数2(连续进位加法)(教学设计)-2024-2025学年三年级上册数学人教版
- 融资部业绩考核及奖励办法
- 2025-2030中国探地雷达行业发展分析及发展趋势预测与投资价值研究报告
- 《中央八项规定精神学习教育》专项讲座
- 2025年交管12123学法减分考试题库及答案
- 环境政策协同效应-第1篇-深度研究
- 2024年福建省能源石化集团有限责任公司秋季校园招聘153人笔试参考题库附带答案详解
- 劳务派遣劳务外包项目方案投标文件(技术方案)
- 棚户区改造项目(EPC)方案投标文件(技术方案)
评论
0/150
提交评论