(1) 通讯录应用程序
一、设计目标与内容:
1. 了解Windows编程的基础知识,掌握MFC应用程序的基本
知识;
2. 基本掌握面向对象程序设计的基本思路和方法; 3. 掌握用VC++开发应用程序的的一般步骤和方法;
4. 能够利用所学的基本知识,设计一个简单的通讯录应用程序,
具有以下功能:①用文件来保存通讯录信息(必须实现的功能)②编程实现通讯录记录的添加、删除、修改、浏览和查询(必须实现的功能)。
二,设计要求:
用VC++进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释;
功能描述
创建一个通讯录应用程序,可以通过文件导入导出成员的信息,实现成员信息的添加、删除、修改、浏览和查询的功能(基本功能),改变背景颜色,添加动画,添加背景音乐(添加功能)。
基本思路
利用VisualC++,通过对一些常用控件的使用实现程序的一些常见的功能,通过对文件的操作来保存和删除一些信息,通过对按钮消息的响应,实现一些基本的功能
1
主要步骤
项目的创建
本例使用VisualC++6.0创建一个基于单文档的MFC AppWizard(exe)项目,项目的名字为Address,其中最后一步选择CFormView。
界面设计
按如下对话框资源的界面布置对话框
如后面的(图一)
再添加一个对话框资源,当响应添加消息是弹出该对话框,添加你所想添加的信息,其对话框的见面如图所示,当然了我们也可以再添加一个用户登陆的对话框资源如下所示
2
代码的实现
1 定义一个CPerson类 在Person.h中编辑代码
class CPerson : public CObject {
public: CPerson(); virtual ~CPerson(); CPerson(CString name,CString phone,CString adr,CString qq); void Serialize(CArchive&ar); public: CString m_name;//姓名 CString m_phone;//电话 CString m_addr;//公司 CString m_qq;//QQ号 DECLARE_SERIAL(CPerson)//对类进行串行化宏定义 };
在Person.cpp中编辑代码 CPerson::CPerson(CString name,CString phone,CString adr,CString qq) { m_name=name; m_phone=phone; m_addr=adr; m_qq=qq; }
IMPLEMENT_SERIAL(CPerson,CObject,1) void CPerson::Serialize(CArchive&ar) { if(ar.IsStoring()) ar< 3 2在AddressDoc.h中编辑代码 public: virtual ~CAddressDoc(); CObArray m_stuObArray; int GetAllRecNum(void); CPerson* GetSTUDENTINFORAt(int nIndex); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; 在AddressDoc.cpp中编辑代码 void CAddressDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here m_stuObArray.Serialize(ar) ; } else { // TODO: add loading code here m_stuObArray.Serialize(ar) ; } } int CAddressDoc::GetAllRecNum() { return m_stuObArray.GetSize() ; } 3 定义一个列表控件的变量 CListCtrl m_list_ctrl; AddressView.cpp中的初始化函数OnInitialUpdate() void CAddressView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_gif2.Load(MAKEINTRESOURCE(IDR_GIF2),_T(\"gif\"));// 4 加载动画,m_gif2为图像控件的变量 m_gif2.Draw(); m_gif.Load(MAKEINTRESOURCE(IDR_GIF1),_T(\"gif\"));//加载动画 m_gif.Draw(); if(IsFirst)//判断是否是第一次打开,在CAddressView()中初始化IsFirst=TRUE; { IsFirst=FALSE; m_list_ctrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE); CString strHeader[4] = {\"姓名\电话\地址\ int nWidth[4] = {110,110,110,110} ; for(int nCol=0;nCol<4;nCol++) m_list_ctrl.InsertColumn(nCol,strHeader[nCol],LVCFMT_LEFT,nWidth[nCol]) ; UpdateData(FALSE) ; } } 响应添加按钮的代码 单击添加按钮时弹出如图所示的界面,(添加自己想添加的信息) 5 void CAddressView::OnButtonAdd() { // TODO: Add your control notification handler code here CdlgADD dlg; dlg.DoModal(); int n=m_list_ctrl.GetItemCount(); m_list_ctrl.InsertItem(m_list_ctrl.GetItemCount(),\"\"); m_list_ctrl.SetItemText(n,0,dlg.m_strname); m_list_ctrl.SetItemText(n,1,dlg.m_strphone); m_list_ctrl.SetItemText(n,2,dlg.m_straddress); m_list_ctrl.SetItemText(n,3,dlg.m_strqq); UpdateData(TRUE) ; CAddressDoc* pDoc = GetDocument(); CPerson*pStudent=new CPerson(dlg.m_strname,dlg.m_strphone,dlg.m_straddress,dlg.m_strqq); pDoc->m_stuObArray.Add(pStudent) ; pDoc->SetModifiedFlag() ; pDoc->UpdateAllViews(NULL) ; } 添加完后再列表控件中显示的 响应删除按钮的代码 首先在列表控件中选择你想要删除的那一列,然后选侧删除,代码如下,定义一个public int item;的变量,先让列表控件响应NM_CLICK消息 void CAddressView::OnClickList1(NMHDR* LRESULT* pResult) pNMHDR, 6 { // TODO: Add your control notification handler code here LV_HITTESTINFO* pHitTestInfo (LV_HITTESTINFO*)pNMHDR; item = pHitTestInfo->iItem; *pResult = 0; } void CAddressView::OnButtonDelete() { CAddressDoc* pDoc = GetDocument(); if(item!=LB_ERR) { m_list_ctrl.DeleteItem(item); delete (CPerson*)pDoc->m_stuObArray.GetAt(item) ; pDoc->m_stuObArray.RemoveAt(item); } else return ; pDoc->SetModifiedFlag() ; } = 响应修改按钮的代码 首先打开上次保存的信息,然后点击浏览,此时所有以保存的信息将会显示在列表控件中,在列表控件中选择你要修改的选项,点击修改 弹出如图示的对话框 ,更改你要修改的对象 7 CdlgADD dlg; CAddressDoc*pDoc =GetDocument(); POSITION pos = m_list_ctrl.GetFirstSelectedItemPosition(); if (pos == NULL) { MessageBox(\"没有选中项!\"); } else { while (pos) { int nItem = m_list_ctrl.GetNextSelectedItem(pos); m_list_ctrl.DeleteItem(nItem); dlg.m_strname = ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_name; dlg.m_strphone =((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_phone; dlg.m_straddress = ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_addr; dlg.m_strqq = ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_qq; dlg.DoModal(); 8 UpdateData(FALSE); if(IDOK) { UpdateData(); ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_name = dlg.m_strname; ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_phone = dlg.m_strphone; ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_addr = dlg.m_straddress; ((CPerson*)pDoc->m_stuObArray.GetAt(nItem))->m_qq = dlg.m_strqq ; pDoc->SetModifiedFlag(); m_list_ctrl.InsertItem(nItem , dlg.m_strname); m_list_ctrl.SetItemText(nItem , 1 , dlg.m_strphone); m_list_ctrl.SetItemText(nItem , 2 , dlg.m_straddress); m_list_ctrl.SetItemText(nItem , 3 , dlg.m_strqq); } } } } 响应浏览按钮的代码 void CAddressView::OnButtonScan() { // TODO: Add your control notification handler code here m_list_ctrl.DeleteAllItems() ; CAddressDoc* pDoc = GetDocument(); for(int n=0;n 9 m_list_ctrl.SetItemText(n,1,pDoc->GetSTUDENTINFORAt(n)->m_phone) ; m_list_ctrl.SetItemText(n,2,pDoc->GetSTUDENTINFORAt(n)->m_addr) ; m_list_ctrl.SetItemText(n,3,pDoc->GetSTUDENTINFORAt(n)->m_qq) ; } } 响应查找按钮的代码 输入你要查询的电话号码(如135963)点击查找 void CAddressView::OnButtonSearch() { // TODO: Add your control notification handler code here CAddressDoc* pDoc = GetDocument(); UpdateData(TRUE) ; for(int n=0;n 10 m_strserach,((CPerson*)pDoc->m_stuObArray.GetAt(n))->m_name,m_strserach, ((CPerson*)pDoc->m_stuObArray.GetAt(n))->m_addr,((CPerson*)pDoc->m_stuObArray.GetAt(n))->m_qq ) ; MessageBox(str) ; break ; } } if(n==pDoc->GetAllRecNum()) { CString str ; str.Format(\"没有该学生的信息!\") ; MessageBox(str) ; } } 11 (2) 学生信息管理应用程序 课程设计题目2:一个简单的学生信息管理应用程序 一、设计目标与内容: 1了解Windows编程的基础知识,掌握MFC应用程序的基本知识; 2基本掌握面向对象程序设计的基本思路和方法; 3掌握用VC++开发应用程序的的一般步骤和方法; 4能够利用所学的基本知识, 设计一个简单的学生信息管理应用程序,具有以下功能:①实现学生信息的存储,可以用文件来实现。②编程实现学生信息的添加、删除、修改、浏览和查询等功能(必须实现的功能)。 二,设计要求: 用VC++进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释; 功能描述 创建一个通讯录应用程序,可以通过文件导入导出成员的信息,实现成员信息的添加、删除、修改、浏览和查询的功能(基本功能),改变背景颜色,添加动画,添加背景音乐(添加功能)。 基本思路 利用VisualC++,通过对一些常用控件的使用实现程序的一些常见的功能,通过对文件的操作来保存和删除一些信息,通过对按钮消息的响应,实现一些基本的功能 主要步骤 项目的创建 12 本例使用VisualC++6.0创建一个基于单文档的MFC AppWizard(exe)项目,项目的名字为Student,其中最后一步选择CFormView。 界面设计 按如下对话框资源的界面布置对话框 如后面的(图二) 代码的实现 1 定义一个CPerson类 在Person.h中编辑代码 class CPerson : public CObject { public: CPerson(); virtual ~CPerson(); CPerson(CString num,CString name,BOOL sex,CTime birth,CString school,CString clas); void Serialize(CArchive&ar); public: CString m_num; CString m_name; BOOL m_sex; CTime m_birth; CString m_school; CString m_class; DECLARE_SERIAL(CPerson) }; 在Person.cpp中编辑代码 CPerson::CPerson(CString num,CString name,BOOL sex,CTime birth,CString school,CString clas) { m_num = num; m_name = name; m_sex = sex; m_birth = birth; 13 m_school = school; m_class = clas; } IMPLEMENT_SERIAL(CPerson,CObject,1) void CPerson::Serialize(CArchive &ar) { if(ar.IsStoring()) ar< 2在Student.h中编辑代码 virtual ~CStudentDoc(); CPerson* GetSTUDENTINFORAt(int nIndex); int GetAllRecNum(void); CObArray m_stuObArray; 在Student.cpp中编辑代码 CStudentDoc::~CStudentDoc() { int nIndex = GetAllRecNum() ; while(nIndex--) delete m_stuObArray.GetAt(nIndex) ; m_stuObArray.RemoveAll() ; } void CStudentDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { m_stuObArray.Serialize(ar) ; } else { m_stuObArray.Serialize(ar) ; } 14 } 3 定义一个列表控件的变量 CListCtrl m_list_ctrl; AddressView.cpp中的初始化函数OnInitialUpdate() void CStudentView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_gif.Load(MAKEINTRESOURCE(IDR_GIF1),_T(\"gif\"));//加载动画 m_gif.Draw(); if(IsFirst)// //判断是否是第一次打开,在CAddressView()中初始化IsFirst=TRUE; { IsFirst=FALSE; m_strnum = \"007\" ; m_strname = \" 张三\" ; if(!MG) CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO2);//判断被选中的单选按钮 else CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1); UpdateData(FALSE); m_comschool.AddString(\"计算机学院\") ; m_comschool.AddString(\"理学院\") ; m_strschool = \" \" ; m_comclass.AddString(\"网络工程\") ; m_comclass.AddString(\"软件工程\") ; m_comclass.AddString(\"计算机科学与技术\") ; m_strclass = \" \" ; 15 m_comclass.AddString(\"应用数学\") ; m_comclass.AddString(\"应用物理\") ; m_strbirth = CTime(1971,9,18,0,0,0) ; m_list_ctrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);//设置列表控件的扩展风格 CString strHeader[6] = {\"学号\姓名\性别\出生年月\学院\专业\ int nWidth[6] = {100,80,60,140,140,140} ; for(int nCol=0;nCol<6;nCol++) m_list_ctrl.InsertColumn(nCol,strHeader[nCol],LVCFMT_LEFT,nWidth[nCol]) ; UpdateData(FALSE) ; } } 响应添加按钮的代码 void CStudentView::OnButtonAdd() { // TODO: Add your control notification handler code here CStudentDoc* pDoc = GetDocument(); UpdateData() ; LVFINDINFO info ; info.flags = LVFI_PARTIAL|LVFI_STRING ; info.psz = m_strnum ; if(m_list_ctrl.FindItem(&info)!=-1) { CString str ; str.Format(\"学号为%s的学生的基本信息已添加过!\ MessageBox(str) ; 16 return ; } int nIndex = m_list_ctrl.InsertItem(m_list_ctrl.GetItemCount(),m_strnum) ; m_list_ctrl.SetItemText(nIndex,1,m_strname) ; if(!MG) { m_list_ctrl.SetItemText(nIndex,2,\"男\") ; } else { m_list_ctrl.SetItemText(nIndex,2,\"女\") ; } m_list_ctrl.SetItemText(nIndex,3,m_strbirth.Format(\"%Y-%m-%d\")) ; m_list_ctrl.SetItemText(nIndex,4,m_strschool) ; m_list_ctrl.SetItemText(nIndex,5,m_strclass) ; UpdateData(TRUE) ; CPerson *pStudent = new CPerson(m_strnum,m_strname,MG,m_strbirth,m_strschool,m_strclass); pDoc->m_stuObArray.Add(pStudent) ; m_strtotalnum = pDoc->m_stuObArray.GetSize(); UpdateData(false) ; pDoc->SetModifiedFlag() ; pDoc->UpdateAllViews(NULL) ; } 添加完后再列表控件中显示的 17 响应删除按钮的代码 首先在列表控件中选择你想要删除的那一列,然后选侧删除,代码如下,定义一个public int item;的变量,先让列表控件响应NM_CLICK消息 void CStudentView::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here LV_HITTESTINFO* pHitTestInfo = (LV_HITTESTINFO*)pNMHDR; item = pHitTestInfo->iItem; *pResult = 0; } void CStudentView::OnButtonDelete() { // TODO: Add your control notification handler code here CStudentDoc* pDoc = GetDocument(); if(item!=LB_ERR) //判断列表框查询是否正确 { delete (CPerson*)pDoc->m_stuObArray.GetAt(item) ; pDoc->m_stuObArray.RemoveAt(item); m_list_ctrl.DeleteItem(item); m_strtotalnum = pDoc->m_stuObArray.GetSize(); UpdateData(false) ; 18 } } else return ; pDoc->SetModifiedFlag() ; 响应修改按钮的代码 void CStudentView::OnButtonXiugai() { // TODO: Add your control notification handler code here CStudentDoc* pDoc = GetDocument(); UpdateData() ; LVFINDINFO info ; info.flags = LVFI_PARTIAL|LVFI_STRING ; info.psz = m_strnum ; if(m_list_ctrl.FindItem(&info)!=-1) { CString str ; str.Format(\"学号为%s的学生的基本信息已添加过!\ MessageBox(str) ; return ; } m_list_ctrl.InsertItem(item,m_strnum) ; m_list_ctrl.SetItemText(item,1,m_strname) ; if(!MG) { m_list_ctrl.SetItemText(item,2,\"男\") ; } else { m_list_ctrl.SetItemText(item,2,\"女\") ; } m_list_ctrl.SetItemText(item,3,m_strbirth.Format(\"%Y-% 19 m-%d\")) ; m_list_ctrl.SetItemText(item,4,m_strschool) ; m_list_ctrl.SetItemText(item,5,m_strclass) ; // UpdateData(TRUE) ; CPerson *pStudent = CPerson(m_strnum,m_strname,MG,m_strbirth, m_strschool,m_strclass); pDoc->m_stuObArray.Add(pStudent) ; m_strtotalnum = pDoc->m_stuObArray.GetSize(); UpdateData(false) ; pDoc->SetModifiedFlag() ; pDoc->UpdateAllViews(NULL) ; } new 响应浏览按钮的代码 void CStudentView::OnButtonSee() { m_list_ctrl.DeleteAllItems() ; CStudentDoc* pDoc = GetDocument(); CString str_sex,str_birth ; for(int n=0;n 20 m_list_ctrl.SetItemText(n,4,pDoc->GetSTUDENTINFORAt(n)->m_school) ; m_list_ctrl.SetItemText(n,5,pDoc->GetSTUDENTINFORAt(n)->m_class) ; } m_strtotalnum = pDoc->m_stuObArray.GetSize(); UpdateData(false) ; } 响应查找按钮的代码 输入你要查询的电话号码(如2002) void CStudentView::OnButtonSearch() { // TODO: Add your control notification handler code here CStudentDoc* pDoc = GetDocument(); UpdateData(TRUE) ; for(int n=0;n 21 str_sex = \"男\" ; str_birth = pDoc->GetSTUDENTINFORAt(n)->m_birth.Format(\"%Y-%m-%d\"); str.Format(\"学号为%s的学生的基本信息为:\\n\姓名:%s\\n\学号:%s\\n\性别:%s\\n\出生年月:%s\\n\学院:%s\\n\专业:%s\\n\\n\ m_strsearch,((CPerson*)pDoc->m_stuObArray.GetAt(n))->m_name,m_strsearch,str_sex,str_birth, ((CPerson*)pDoc->m_stuObArray.GetAt(n))->m_school,((CPerson*)pDoc->m_stuObArray.GetAt(n))->m_class ) ; MessageBox(str) ; break ; } } if(n==pDoc->GetAllRecNum()) { CString str ; str.Format(\"没有该学生的信息!\") ; MessageBox(str) ; } } 响应Music按钮的代码 void CStudentView::OnButtonMusic() { // TODO: Add your control notification handler code here PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE | SND_ASYNC | SND_LOOP); } 22 Window课程设计心得体会 通过这两周的学习,我感觉到我学会了很多东西,而这些东西,要是在平时的话,可以说我根本就没有办法去学它,去看它,更别说去学好它了。加大了我们的动手能力,使得我们不得不去看书,不得不去花更多的时间学习它,把自己不懂得地方搞懂,让自己得到升华! 两周的课设,让我发现自己还有很多地方不懂,通过和同学们的沟通,对C++及VisualC++似乎有了一种新的认识,或许并不像有些人所说的那样,枯燥无味,或许只要我们全身心的投入,它也会变的津津有味,给我们的大学生活或是将来带来更多的乐趣!有些事情看上去很难,那只是我们没有经历过,只要有一颗红心在,没有什么不可以的。 这样的机会很难得,所以说,以后如果要是还有这样的机会的话,我们一定要好好把握住,别让它过去之后才知道去珍惜它! 23 图一 图二 24 25 因篇幅问题不能全部显示,请点此查看更多更全内容