设计思路及过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通讯录编程
一、所在实现的功能:
(1) 可通过文件导入和导出通信录信息
(2) 可向前或向后浏览通信录
(3)可添加、修改和删除通信记录
如下图所示,点击添加数据(点击后会变为浏览记录)开始进行添加数据,输入完数据后点击保存,数据才能被保存,添加完数据后,可以再点浏览记录,对添加完的数据进行浏览,在保存有记录和浏览记录时,可以对记录进行修改和删除。
图1-1
单击打开文件可以打开以前保存的记录,单击保存文件可以将当前保存的记录保存进一个text格式的文件中。
二、设计思路:
首先新建一个CPerson的类,在其中添加成员变量以保存所需要保存的信息,然后使其派生于Cobject类,并将其串行化,用一个CPerson的对象来保一个人的个人信息,并在MFC生成的CMyDlg类中定义一个CObList的对象
m_PersonViewList来保存所生成的CPerson对象。并用CArchive来对
m_PersonViewList的元素进行保存和读取。
三、设计过程:
1、CPerson建立:点击菜单栏中的Insert,插入一个新类,名使其从CObject 派生出来,并将其串行化,其代码如下:
(1) 头文件代码:
class CPerson:public CObject//将其从CObject类中派生出来
{
public:
DECLARE_SERIAL(CPerson) //对类进行串行化宏定义
CPerson(); //添加无参数的构造函数,用于从文件中读取时来
构造此函数
CPerson(CString m_Name,CString m_Phone,
CString m_Company,CString m_Email);//构造带参数的构造函数用于传递需要保存的数据
virtual ~CPerson();
CString m_Name; //姓名
CString m_Phone; //电话
CString m_Company; //公司
CString m_Email; //Email
public:
virtual void Serialize(CArchive& ar); //定义一个Serialize虚函数};
(2) 源文件:
IMPLEMENT_SERIAL(CPerson,CObject,0)/使用IMPLEMENT_SERIAL
宏
CPerson::CPerson()
{
}
CPerson::CPerson(Cstring m_Name,Cstring m_Phone,CString
m_Company,CString m_Email)
{
//初始化人员信息(m_Name,m_Phone,m_Company,m_Email)
this->m_Name=m_Name; //姓名
this->m_Phone=m_Phone; //电话
this->m_Company=m_Company; //公司
this->m_Email=m_Email; //Email
}
CPerson::~CPerson()
{
}
void CPerson::Serialize(CArchive& ar)//重定Serialize函数
{
if (ar.IsStoring())//判断是否是存储状态
{
ar< // storing code } else//如果是读取数据 { // loading code ar>>m_Name>>m_Phone>>m_Company>>m_Email;//读取数据} } (3)小结: 将一个类对象串行化需要五个步骤: <1> 从CObject 派生类(或从CObject 派生的某个类中派生); <2> 重写Serialize 成员函数。 <3> 使用DECLARE_SERIAL 宏(在类声明中)。 <4> 定义不带参数的构造函数。 <5> 为类在实现文件中使用IMPLEMENT_SERIAL 宏。 2、界面各控件功能的实现: 程序界面设计如图1-1所示,下面将分别对各控件所实现的功能及代码分别进行简单介绍: (1)EditBox控件:用户可以通过界面的四个EditBox输入每个人的个人信 息,如姓名、电话、单位、Email。用ClassWizard生成向导,使每个 EditBox控件分别与CmyDlg中的四个成员变量m_Name、m_Phone、 m_Company、m_Email关联起来,即使用户输入EditBox的记录分别保存 于这四个变量,其代相关代码如下: enum { IDD = IDD_MY_DIALOG }; CString m_Name; CString m_Phone; CString m_Company; CString m_Email; void CMyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Text(pDX, IDC_EDIT1, m_Name); DDX_Text(pDX, IDC_EDIT2, m_Phone); DDX_Text(pDX, IDC_EDIT3, m_Company); DDX_Text(pDX, IDC_EDIT4, m_Email); //}}AFX_DATA_MAP } 由于四个成员变量都在DoDataExchange中与四个EditBox关联起来了,所以每次刷新记录时都需要调用UpdateData()函数。 (2)添加记录按钮: 当程序开始运行时,点击此按钮可以进行添加记录,此时,该按钮的Caption由“添加记录变”为“浏览记录”,并使按钮“保存”可操作,此时可输入记录并保存。再次点击此按钮,可使按钮“向前浏览”、“向后浏览”、“删除记录”、“修改记录”可操作,并可以浏览此前所添加的数据并对其进行删除和修改记录。其关联的代码如下所示: void CMyDlg::OnButtonChange() { ((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_EDIT1)); CString str; GetDlgItem(IDC_BUTTON_CHANGE)->GetWindowText(str); if(str=="添加记录") { ((CButton*)GetDlgItem(IDC_BUTTON_PREVIOUS))->EnableWindow(false) ; ((CButton*)GetDlgItem(IDC_BUTTON_NEXT))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_BUTTON_DELET))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_BUTTON_ADD))->EnableWindow(TRUE);((CBu tton*)GetDlgItem(IDC_BUTTON_CHANGE))->SetWindowText("浏览通讯录"); //清空编辑窗口 m_Name=""; m_Phone=""; m_Company=""; m_Email=""; UpdateData(false);//刷新窗口 } else { ((CButton*)GetDlgItem(IDC_BUTTON_ADD))->EnableWindow(FALSE); ((CButton*)GetDlgItem(IDC_BUTTON_DELET))->EnableWindow(TRUE); ((CButton*)GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(TRUE)((C Button*)GetDlgItem(IDC_BUTTON_PREVIOUS))->EnableWindow(TRUE);