前言
目录
第1章Visual Studio 2012介绍1
1.1Visual Studio 2012的安装要求2
1.2Visual Studio 2012的安装步骤2
1.3Visual Studio 2012集成开发环境介绍4
1.4小结7
第2章初识MFC编程8
2.1可视化程序设计8
2.2使用AppWizard创建ContactList初始应用程序9
2.3选择Debug或Release生成选项12
2.4小结14
第3章需求分析15
3.1需求分析的作用15
3.2需求分析的结构15
3.3通讯录系统业务需求16
3.4通讯录系统需求分析范例17
3.5小结19
第4章概要设计20
4.1概要设计要求20
4.2概要设计结构20
4.3通讯录概要设计范例20
4.4小结23
第5章数据结构设计与实现24
5.1CPerson类的设计与实现24
5.2添加CPerson类24
5.3添加CPerson类的成员变量26
5.4添加CPerson类的成员函数27
5.5重载CPerson类的构造函数29
5.6CPerson成员变量的初始化30
5.7CPersonList类的设计与实现30
5.8类模板和动态数组CArray31
5.9添加CPersonList类32
5.10CPersonList继承CArray功能32
5.11生成和运行ContactList34
5.12小结35
第6章界面设计与实现36
6.1界面设计概述36
6.2主对话框的设计与实现36
6.3添加CListCtrl控件36
6.4添加CButton控件39
6.5添加Static Text控件41
6.6添加CEdit控件42
6.7子对话框的设计与实现43
6.8添加CEditDlg类44
6.9绘制编辑对话框界面45
6.10将控件映射到成员变量49
6.11修改CEditDlg类构造函数52
6.12添加OnInitDialog()虚函数55
6.13添加和实现消息响应函数59
6.14设置对话框Tab键顺序60
6.15CListCtrl风格的定义与实现61
6.16CListCtrl数据更新64
6.17小结69
第7章编码实现:联系人管理71
7.1添加联系人功能的实现71
7.2删除联系人功能的实现73
7.3编辑联系人功能的实现74
7.4小结75
第8章编码实现:通讯录文件的读写76
8.1CPerson基础数据的存储76
8.2CPersonList对象的存储77
8.3DoSaveFile()与“恢复”功能79
8.4DoLoadFile()与“恢复”功能81
8.5实现自动读写功能83
8.6实现复制功能86
8.7小结88
第9章编码实现:联系人检索89
9.1查找联系人功能的实现89
9.2统计联系人功能的实现92
9.3显示联系人的照片96
9.4主对话框联系人头像的显示105
9.5显示联系人统计图形109
9.6小结118
第10章编码实现:界面增强119
10.1添加菜单119
10.2添加工具栏122
10.3小结130
第11章软件测试131
11.1软件测试流程131
11.2ContactList项目测试案例131
11.3小结147
第12章软件发布148
12.1通过InstallShield制作安装包148
12.2ContactList项目说明书案例154
12.3小结161
第13章总结与展望162
13.1项目总结162
13.2总结1: 软件过程管理162
13.3总结2: 面向对象程序设计163
13.4总结3: 数据设计原则163
13.5总结4: 功能增强163
附录A术语解释164
参考文献168
导语摘要
本书面向零基础的计算机专业学生或者喜欢编程的读者。书中提供的项目简练、易入门,力图通过CMMI 2级简化模型的软件过程管理的方式,让学生掌握项目计划以及项目计划跟踪与控制,通过角色扮演方式了解企业软件开发流程与团队合作。另外,本书的项目基于MFC框架进行可视化编程,使读者更易上手。全书共13章,内容涵盖了整个软件开发流程,每章的知识点配备有图文解释以及相关的项目练习。本书可作为高等学校及各类培训机构计算机专业课程的教材或参考书。
目录
目录
第1章Visual Studio 2012介绍1
1.1Visual Studio 2012的安装要求2
1.2Visual Studio 2012的安装步骤2
1.3Visual Studio 2012集成开发环境介绍4
1.4小结7
第2章初识MFC编程8
2.1可视化程序设计8
2.2使用AppWizard创建ContactList初始应用程序9
2.3选择Debug或Release生成选项12
2.4小结14
第3章需求分析15
3.1需求分析的作用15
3.2需求分析的结构15
3.3通讯录系统业务需求16
3.4通讯录系统需求分析范例17
3.5小结19
第4章概要设计20
4.1概要设计要求20
4.2概要设计结构20
4.3通讯录概要设计范例20
4.4小结23
第5章数据结构设计与实现24
5.1CPerson类的设计与实现24
5.2添加CPerson类24
5.3添加CPerson类的成员变量26
5.4添加CPerson类的成员函数27
5.5重载CPerson类的构造函数29
5.6CPerson成员变量的初始化30
5.7CPersonList类的设计与实现30
5.8类模板和动态数组CArray31
5.9添加CPersonList类32
5.10CPersonList继承CArray功能32
5.11生成和运行ContactList34
5.12小结35
第6章界面设计与实现36
6.1界面设计概述36
6.2主对话框的设计与实现36
6.3添加CListCtrl控件36
6.4添加CButton控件39
6.5添加Static Text控件41
6.6添加CEdit控件42
6.7子对话框的设计与实现43
6.8添加CEditDlg类44
6.9绘制编辑对话框界面45
6.10将控件映射到成员变量49
6.11修改CEditDlg类构造函数52
6.12添加OnInitDialog()虚函数55
6.13添加和实现消息响应函数59
6.14设置对话框Tab键顺序60
6.15CListCtrl风格的定义与实现61
6.16CListCtrl数据更新64
6.17小结69
第7章编码实现:
联系人管理71
7.1添加联系人功能的实现71
7.2删除联系人功能的实现73
7.3编辑联系人功能的实现74
7.4小结75
第8章编码实现:
通讯录文件的读写76
8.1CPerson基础数据的存储76
8.2CPersonList对象的存储77
8.3DoSaveFile()与“恢复”功能79
8.4DoLoadFile()与“恢复”功能81
8.5实现自动读写功能83
8.6实现复制功能86
8.7小结88
第9章编码实现:
联系人检索89
9.1查找联系人功能的实现89
9.2统计联系人功能的实现92
9.3显示联系人的照片96
9.4主对话框联系人头像的显示105
9.5显示联系人统计图形109
9.6小结118
第10章编码实现:
界面增强119
10.1添加菜单119
10.2添加工具栏122
10.3小结130
第11章软件测试131
11.1软件测试流程131
11.2ContactList项目测试案例131
11.3小结147
第12章软件发布148
12.1通过InstallShield制作安装包148
12.2ContactList项目说明书案例154
12.3小结161
第13章总结与展望162
13.1项目总结162
13.2总结1: 软件过程管理162
13.3总结2: 面向对象程序设计163
13.4总结3: 数据设计原则163
13.5总结4: 功能增强163
附录A术语解释164
参考文献168
内容摘要
本书面向零基础的计算机专业学生或者喜欢编程的读者。书中提供的项目简练、易入门,力图通过CMMI 2级简化模型的软件过程管理的方式,让学生掌握项目计划以及项目计划跟踪与控制,通过角色扮演方式了解企业软件开发流程与团队合作。另外,本书的项目基于MFC框架进行可视化编程,使读者更易上手。全书共13章,内容涵盖了整个软件开发流程,每章的知识点配备有图文解释以及相关的项目练习。
本书可作为高等学校及各类培训机构计算机专业课程的教材或参考书。
主编推荐
以“个人通讯录”项目开发过程为主线,按照CMMI 2级简化模型逐步展开,以完成此项目的开发
精彩内容
第5章数据结构设计与实现数据结构设计与实现本章主要描述ContactList系统的总体数据结构设计与实现方法。数据结构设计应当遵循《需求说明书》和《概要设计说明书》的要求。由于ContactList系统使用了面向对象的思想,所以数据结构设计应当遵循面向对象的三大特性(抽象、封装和继承)。综上所述,本系统的数据结构的主要设计方法是定义相关类,在类中定义所需的数据成员和函数成员(部分自定义数据类继承了MFC系统提供的数据类)。5.1CPerson类的设计与实现 在ContactList项目中,CPerson类主要描述一个联系人的信息,包括姓名、性别、手机号、QQ号和组编号,对每个属性属性都提供了Get/Set函数、基础数据存储以及其他函数的操作功能。ContactList项目的总体结构设计如图51所示。图51总体结构设计图5.2添加CPerson类(1) 单击左下角的Class View切换到类视图,如图52所示。图52类视图(2) 在类视图中的ContactList上右击右击,在弹出的快捷菜单中选择Add→Class命令,如图53所示。图53选择Class命令(3) 弹出类向导对话框,选择C Class后单击Add按钮,如图54所示。图54添加类(4) 在类向导对话框中输入相应内容,如图55所示。图55添加类命名 Class name: 表示添加类的名称。 .h file: 表示该类添加后生成的头文件,主要存放成员数据的声明。 .cpp file: 表示该类添加后生成的源文件源文件,主要存放成员数据的定义。(5) 单击Finish按钮。5.3添加CPerson类的成员变量(1) CPerson类的成员变量设置如表51所示。(2) 单击Class View切换到类视图。(3) 双击双击CPerson类打开该类的Person.h头文件。表51CPerson类的成员变量成员描述m_strName姓名: 描述一个名字,20个字符以内m_bMale性别: TRUE表示男;FALSE表示女m_strPhoneNo手机号: 11位数字m_strQQNoQQ号: 10位以内的数字m_iGroupNo组号: 全局字符串数组g_lstGroups的索引(4) 在Person.h文件中添加如下成员变量代码,然后保存,如图56所示。protected:CStringm_strName;//姓名: 20个字符以内BOOLm_bMale;//性别: TRUE表示男;FALSE表示女CStringm_strPhoneNo;//手机号: 11位数字CStringm_strQQNo;//QQ号: 10位以内的数字intm_iGroupNo;//组号: 全局字符串数组g_lstGroups的索引图56CPerson成员变量5.4添加CPerson类的成员函数CPerson类的成员函数设置如表52所示。表52CPerson类的成员函数续表成员 描述CPerson~CPerson默认构造构造函数和虚析构析构函数,这是由App Wizard自动创建的初始函数体。重载重载的构造函数用于成员变量初始化GetName/SetName获取/设置名字IsMale/SetMale判断/设置性别GetPhoneNo/SetPhoneNo获取/设置手机号码GetQQNo/SetQQNo获取/设置QQ号码GetGroupNo/SetGroupNo获取/设置分组类型打开Person.h文件,添加如下自定义内联成员函数代码,然后保存,如图57所示。public:CStringGetName(){ return m_strName; }BOOL IsMale() { return m_bMale; }CStringGetPhoneNo() { return m_strPhoneNo; }CStringGetQQNo(){ return m_strQQNo; }intGetGroupNo() { return m_iGroupNo; }voidSetName(CString strName) { m_strName=strName; }voidSetMale(BOOL bMale) { m_bMale=bMale; }voidSetPhoneNo(CString strPhoneNo){ m_strPhoneNo=strPhoneNo; }voidSetQQNo(CString strQQNo) { m_strQQNo=strQQNo; }voidSetGroupNo(int iGroupNo) { m_iGroupNo=iGroupNo; }图57CPerson成员函数5.5重载CPerson类的构造函数 重载是函数多用性的一个表现,C 允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是用同一个函数实现功能类似但所处理数据类型不同的问题。本节重载CPerson类构造函数,使CPerson对象带默认参数值,即为后添加联系人功能的默认值。(1) 在Person.h文件的CPerson类中添加下面的代码,如图58所示。CPerson(CString strName, BOOL bMale=TRUE, CString strPhoneNo=_T("88888888888"),CString strQQNo=_T("0000"), int iGroupNo=0);图58重载CPerson类的构造函数声明(2) 单击Solution Explorer切换到解决方案视图。(3) 双击Person.cpp打开该文件,在相应的位置添加如下代码,如图59所示。CPerson::CPerson(CString strName, BOOL bMale, CString strPhoneNo, CString strQQNo,int iGroupNo): m_strName(strName), m_bMale(bMale), m_strPhoneNo(strPhoneNo), m_strQQNo(strQQNo), m_iGroupNo(iGroupNo){
}//end of CPerson::CPerson()图59重载CPerson类的构造函数定义5.6CPerson成员变量的初始化打开Person.cpp文件,在默认构造函数CPerson::CPerson(void)中添加如下代码,如图510所示。m_strName=_T("Unknown");m_bMale=TRUE;m_strPhoneNo=_T("88888888888");m_strQQNo=_T("00000");图510初始化CPerson成员变量5.7CPersonList类的设计与实现CPersonList记录整个通讯录对象,是元素类型为CPerson的动态数组,需要先用类型定义关键字 typedef 定义一个元素为CPerson的CArray类CPersons,再将CPersonList定义成CPersons的派生类(从而也是CArray的派生类),如图511所示。图511CPerson的动态数组5.8类模板和动态数组CArray数组是在编码过程中经常用到的集合命名,它把具有相同类型的若干元素按无序的形式组织起来。普通数组使用起来很麻烦,在程序变化的过程中数组一般不是固定的,而是动态变化的,就像通讯录项目中联系人的数量一样,不同的使用者联系人的数量是不一样的,并且随着时间的发展联系人的数量也会有所改变,所以本项目为了解决联系人存储的问题,引入MFC中几个常用的类模板,其中用得多的是CArray。CArray是MFC中非常重要的类模板之一,使用类模板可以使用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型。类模板是对一批仅成员数据类型不同的类的抽象,程序员只要为这批类组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,从而大大提高编程效率。定义类模板的一般形式如下。 template <类型名 参数名1,类型名参数名2,…> class 类名 { 类声明体 };本项目将通过CArray动态数组管理联系人的增/删/查/改,以提高对联系人的管理效率。CArray的原型声明如下。 template<class TYPE, class ARG_TYPE >class CArray : public CObject(1) TYPE: 模板参数,指定存储在数组中对象的类型。TYPE是CArray返回的参数类型。(2) ARG_TYPE: 模板参数,指定用来访问存储在数组中对象的变量类型,通常是TYPE的引用。ARG_TYPE是传递给CArray的参数类型。CArray类在需要的时候可以动态收缩和扩展。数组索引总是从0开始。用户可以决定是固定数组上界还是允许当添加元素超过当前边界时扩展数组。内存被连续地分配到上界,即使一些元素可能为空。CArray在索引元素访问时是不变的,与数组大小无关。在使用CArray之前用SetSize建立它的大小并为它分配内存。如果不使用SetSize,则为数组添加元素会引起频繁的重新分配和复制,频繁的重新分配和复制不仅没有效率,而且会导致产生内存碎片。5.9添加CPersonList类 在项目中添加CPersonList类,添加的内容如图512所示。图512添加CPersonList类5.10CPersonList继承CArray功能 CArray是有动态数组功能的模
以下为对购买帮助不大的评价