完整word版C++通讯录.docx
- 文档编号:30463112
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:17
- 大小:131.01KB
完整word版C++通讯录.docx
《完整word版C++通讯录.docx》由会员分享,可在线阅读,更多相关《完整word版C++通讯录.docx(17页珍藏版)》请在冰豆网上搜索。
完整word版C++通讯录
通讯录管理系统
1.设计目的
本课程设计主要解决通讯录里的联系人的查询、添加、删除、修改等功能的程序设计。
在课程设计中,系统开发平台为Windows2007,程序设计设计语言采用VisualC++,程序运行平台为MicrosoftVisualC++6.0。
对于通讯录功能的实现采用添加控件的方法,在程序设计中,采用了面向对象解决问题的方法。
程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在商业中解决实际问题。
本设计通过一个通讯录的制作,介绍单文档界面的读写文档技术以及人性化界面的一般原理。
功能如下:
(1)、可以通过文件导入导出通讯录信息
(2)、可以向前或向后浏览通讯录信息
(3)、可以添加、修改和删除通讯录信息
2.设计内容和步骤
2.1、系统分析
通讯录与以往编写的程序相比,最大的区别在于它需要再现信息。
再现信息值得是当用户何时何地再次启动程序师,程序能恢复到以前的状态或数据。
换句话说,我们需要为通讯录提供这样的功能:
能将通讯录的数据以某种形式存放,当需要时,可以通过载入来恢复数据。
数据存放形式目前有两种:
文件和数据库。
我们采用文件存取方式。
通常情况下,视图通过GetDocument成员函数获得指向相关联的文档对象的指针,并通过该指针调用文档类的成员函数来从文档中读取数据。
从技术方面,是通过VC++来做系统的前台,来实现整系统的功能;从操作方面,基本的录入、查询、修改等都能满足用户的需求;此次设计没有考虑经济可行性。
经过这一阶段确定了该系统的粗略系统流程图,如图1所示。
图1系统流程图
在MicrosoftVisualC++6.0中用MFC可以实现系统程序的编写,实现运行结果可视化,MFC的好处是简化Windows操作,把经常使用而有复杂、烦琐的操作,封装成各种类(MFC程序框架),它使程序员从繁杂的编程中解脱出来,提高了编程和代码效率。
用消息驱动机制来实现代码的添加,产生消息。
在MFC中建立一个单文档应用程序,加入数据库支持,选择对应的数据源。
采用模块化原理可以使软件结构清晰,容易设计也容易阅读和理解,也易于测试和调度,所以它有利于提高软件的可靠性和可修改性。
2.2、项目创建
Visualc++6.0中,新建MFCAppWizard(exe)单文档工程,命名为AddressBook。
最后一步中视图基类选择“CFormView”。
使用AppWizard配置得到的项目信息如图:
2.3、界面设计
打开对话框资源IDD_ADDRESS_FORM,该对话框将是界面运行时的主界面:
2.4、代码实现
2.4.1、建立文档类和视图类数据成员之间的联系。
(1)、双击姓名编辑框,进入事件OnChangeEditName的编辑界面,代码更改如下:
voidCAddressBookView:
:
OnChangeEditName()
{
UpdateData(true);//界面的值传递到变量
CAddressBookDoc*pDoc=GetDocument();//获得文档类指针
CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);//获得当前结点
pListDoc->m_Name=m_strName;//将更改过的姓名添加到结点
pDoc->SetModifiedFlag();//设置文档数据被修改标志
}
(2)、双击电话编辑框,进入事件OnChangeEditPhone的编辑界面,代码更改如下:
voidCAddressBookView:
:
OnChangeEditPhone()
{
UpdateData(true);//界面的值传递到变量
CAddressBookDoc*pDoc=GetDocument();//获得文档类指针
CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);//获得当前结点
pListDoc->m_Phone=m_strPhone;//将更改过的电话添加到结点
pDoc->SetModifiedFlag();//设置文档数据被修改标志
}
(3)、双击单位编辑框,进入事件OnChangeEditCompany的编辑界面,代码更改如下:
voidCAddressBookView:
:
OnChangeEditCompany()
{
UpdateData(true);//界面的值传递到变量
CAddressBookDoc*pDoc=GetDocument();//获得文档类指针
CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);//获得当前结点
pListDoc->m_Company=m_strCompany;//将更改过的单位添加到结点
pDoc->SetModifiedFlag();//设置文档数据被修改标志
}
(4)、双击Email编辑框,进入事件OnChangeEditEmail的编辑界面,代码改如下:
voidCAddressBookView:
:
OnChangeEditEmail()
{
UpdateData(true);//界面的值传递到变量
CAddressBookDoc*pDoc=GetDocument();//获得文档类指针
CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);//获得当前结点
pListDoc->m_Email=m_strEmail;//将更改过的姓名添加到结点
pDoc->SetModifiedFlag();//设置文档数据被修改标志
}
2.4.2、编辑命令按钮执行代码
(1)、双击视图中的“添加记录”按钮,进入事件方法OnButtonAdd()的更改界面,代码更改如下:
voidCAddressBookView:
:
OnButtonAdd()
{
//界面
((CButton*)GetDlgItem(IDC_CHECK_MODIFY))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_CLEAR))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_PREVIOUS))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_NEXT))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_ADD))->SetWindowText(_T("继续添加"));
((CButton*)GetDlgItem(IDC_BUTTON_DELETE))->SetWindowText(_T("添加完毕"));
((CEdit*)GetDlgItem(IDC_EDIT_NAME))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_PHONE))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_COMPANY))->EnableWindow(true);
m_strName="";
m_strPhone="";
m_strCompany="";
m_strEmail="";//清空编辑框
UpdateData(false);//刷新界面
CPerson*pListDoc=newCPerson();
m_Position=m_PersonViewList->AddTail(pListDoc);
//新建空人员信息添加至链表,并将当前位置移至该处
CAddressBookDoc*pDoc=GetDocument();//获得文档指针
pDoc->SetModifiedFlag();//设置文档被修改标置
((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_EDIT_NAME));//姓名编辑框获得焦点
//TODO:
Addyourcontrolnotificationhandlercodehere
}
(2)、双击资源视图中“删除记录”按钮,进入事件方法OnButtonDelete的更改界面,更改界面,代码更改如下:
voidCAddressBookView:
:
OnButtonDelete()
{
CStringstr;
GetDlgItem(IDC_BUTTON_DELETE)->GetWindowText(str);
if(str=="删除记录(&D)")
{
CObject*pOld;//临时对象指针
pOld=m_PersonViewList->GetAt(m_Position);//使其指向当前指针
m_PersonViewList->RemoveAt(m_Position);//将当前结点从列表中删除
deletepOld;//释放空间
if(m_PersonViewList->IsEmpty())//链表若为空,则调用添加生成一个新结点
{
CAddressBookDoc*pDoc=GetDocument();//获得文档指针
pDoc->OnNewDocument();
m_Position=m_PersonViewList->GetHeadPosition();
}
CAddressBookDoc*pDoc=(CAddressBookDoc*)GetDocument();
pDoc->SetModifiedFlag();//获得文档指针,标志文档已被修改
OnInitialUpdate();//显示列表第一个结点
}
else
{
AfxMessageBox("添加完毕!
");
((CButton*)GetDlgItem(IDC_CHECK_MODIFY))->EnableWindow(true);
((CButton*)GetDlgItem(IDC_BUTTON_CLEAR))->EnableWindow(true);
((CButton*)GetDlgItem(IDC_BUTTON_PREVIOUS))->EnableWindow(true);
((CButton*)GetDlgItem(IDC_BUTTON_NEXT))->EnableWindow(true);
((CButton*)GetDlgItem(IDC_BUTTON_ADD))->SetWindowText(_T("添加记录(&A)"));
((CButton*)GetDlgItem(IDC_BUTTON_DELETE))->SetWindowText(_T("删除记录(&D)"));
((CEdit*)GetDlgItem(IDC_EDIT_NAME))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_PHONE))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_COMPANY))->EnableWindow(false);
}
//TODO:
Addyourcontrolnotificationhandlercodehere
}
(3)、双击资源视图中“清除记录”按钮,进入事件方法的更改界面OnButtonClear()的更改界面,代码更改如:
voidCAddressBookView:
:
OnButtonClear()
{
if(m_PersonViewList->GetCount()==1)//链表若为空,则调用添加生成一个新结点
{
AfxMessageBox("没有可清空的记录!
");
return;
}
if(MessageBox("所有的记录将被清空!
","清空警告",MB_YESNO)==IDYES)
{
CAddressBookDoc*pDoc=GetDocument();//获得文档指针
pDoc->OnNewDocument();
m_Position=m_PersonViewList->GetHeadPosition();
/*while(!
pDoc->m_PersonList.IsEmpty())
{//循环删除最前的结点,直到删尽为止
deletepDoc->m_PersonList.RemoveHead();
}
m_strName="someone";
m_strPhone="";
m_strCompany="";
m_strEmail="";//清空编辑框
UpdateData(false);//刷新界面
CPerson*pListDoc=newCPerson();
m_Position=m_PersonViewList->AddTail(pListDoc);
//新建空人员信息添加至链表,并将当前位置移至该处
pDoc->SetModifiedFlag();//设置文档被修改标置
((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_EDIT_NAME));//姓名编辑框获得焦点*/
}//TODO:
Addyourcontrolnotificationhandlercodehere
}
(4)、双击资源视图中的“向前浏览”按钮,进入事件方法OnButtonPrevious()的更改界面,代码更改如:
voidCAddressBookView:
:
OnButtonPrevious()
{
POSITIONm_templeposition;//定义一个临时位置指针
m_templeposition=m_Position;//并使其指向当前结点的前驱结点
m_PersonViewList->GetPrev(m_templeposition);//获得当前结点位置的前一个
if(m_templeposition==NULL)
{//若到链表头结点
AfxMessageBox(_T("已到表头!
"));
}
else
{
m_Position=m_templeposition;//当前指针定位到前一个
CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);
//获得前一个人员的信息
m_strName=pListDoc->m_Name;
m_strPhone=pListDoc->m_Phone;
m_strCompany=pListDoc->m_Company;
m_strEmail=pListDoc->m_Email;//赋值给视图类数据成员
UpdateData(false);//刷新窗口
}
//TODO:
Addyourcontrolnotificationhandlercodehere
}
(5)、双击资源视图中的“向后浏览”按钮,进入事件方法OnButtonNext()的更改界面,代码更改如:
voidCAddressBookView:
:
OnButtonNext()
{
POSITIONm_templeposition;//定义一个临时位置指针
m_templeposition=m_Position;//并使其指向当前结点的前驱结点
m_PersonViewList->GetNext(m_templeposition);//获得当前结点位置的后一个
if(m_templeposition==NULL)
{//若到链表尾结点
AfxMessageBox(_T("已到表尾!
"));
}
else
{
m_Position=m_templeposition;//当前指针定位到后一个
CPerson*pListDoc=(CPerson*)m_PersonViewList->GetAt(m_Position);
//获得前一个人员的信息
m_strName=pListDoc->m_Name;
m_strPhone=pListDoc->m_Phone;
m_strCompany=pListDoc->m_Company;
m_strEmail=pListDoc->m_Email;//赋值给视图类数据成员
UpdateData(false);//刷新窗口
}
//TODO:
Addyourcontrolnotificationhandlercodehere
}
(6)、双击资源视图中的“修改记录”按钮,进入事件方法OnButtonPrevious()的更改界面,代码更改如:
voidCAddressBookView:
:
OnCheckModify()
{
//CButtona;
//a.GetCheck(
if(((CButton*)GetDlgItem(IDC_CHECK_MODIFY))->GetCheck()==1)
{
((CButton*)GetDlgItem(IDC_BUTTON_ADD))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_CLEAR))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_NAME))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_PHONE))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_COMPANY))->EnableWindow(true);
}
else
{
((CButton*)GetDlgItem(IDC_BUTTON_ADD))->EnableWindow(true);
((CButton*)GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(true);
((CButton*)GetDlgItem(IDC_BUTTON_CLEAR))->EnableWindow(true);
((CEdit*)GetDlgItem(IDC_EDIT_NAME))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_PHONE))->EnableWindow(false);
((CEdit*)GetDlgItem(IDC_EDIT_COMPANY))->EnableWindow(false);
}
//TODO:
Addyourcontrolnotificationhandlercodehere
}
2.4.3、主界面形成程序代码
在AddressBookClass中打开Cperson这个成员函数就可以看到代码如下:
#if!
defined(AFX_PERSON_H__873A555F_8884_4E8F_9C9B_5F8D5AB6CB2A__INCLUDED_)
#defineAFX_PERSON_H__873A555F_8884_4E8F_9C9B_5F8D5AB6CB2A__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
classCPerson:
publicCObject
{
public:
DECLARE_SERIAL(CPerson)//对类进行串行化宏定义
CPerson();
virtual~CPerson();
CStringm_Name;//姓名
CStringm_Phone;//电话
CStringm_Company;//公司
CStringm_Email;//Email
public:
virtualvoidSerialize(CArchive&ar);
};
#endif//!
defined(AFX_PERSON_H__873A555F_8884_4E8F_9C9B_5F8D5AB6CB2A__INCLUDED_)
3、程序运行的结果
(1)、在AddressBookClass中打开Cperson这个成员函数,编译,运行就可以得到如下3-1的图形:
图3-1编译,运行所得的图形
(2)、点击图3-1中的“添加记录”按钮,即可添加联系人,输入必要的信息,最后点击“添加完毕”按钮,即可得到如下图3-2:
3-2点击添加完毕后所得的图形
(3)、当关闭窗口时会出现保存数据的提示,点击保存即可保存到特定的目录下,如下图3-3所示:
3-3提示是否保存
(4)、若需要继续添加,点击“继续添加”按钮即可,当添加完之后即可向前向后浏览相关的信息,运行结果如下图3-4:
图3-4继续添加
4.心得体会
VC++是在Windows平台下构建32位运用程序的强大而又复杂的开发工具,是目前世界上使用最多的开发工具之一,掌握VC++的运用,对我们有很重要的意义。
此次通讯录程序开发课程设计主要是做一个最基本最简单的通讯录,主要功能是添加联系人姓名、电话、单位和Email的信息,和浏览各个通讯录的小功能,界面简洁,操作方面,有很大的改善空间,可视化编程与纯手写的程序体现了它的方便性,很多类、方法只需点击几下就可以自动为你构造出代码,使我们无需敲那么多代码,一些简单的界面也可直接拖拉控件实现,然后在控件的属性上添加一些触发事件及相应的函数方法就可达到点击控件时你想它所能出现的功能,整个过程最核心的还是控件发生的事件的代码实现,个人觉得很多还是蛮难的,实力有限呀,有待提高。
通过本
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word C+ 通讯录