第一部分 Visual C++入门 1
第1章 Visual C++开发环境 1
1.1 开始运行Visual C++ 1
1.2 Visual C++联机帮助系统 2
1.2.1 帮助基础知识 3
1.2.2 缩小查找范围 4
1.2.3 防止迷路 6
1.2.4 补充说明 7
1.3 项目和项目工作区 8
1.3.1 项目 8
1.3.2 项目工作区 8
1.4 采用项目进行工作 9
1.4.1 创建一个项目文件 9
1.4.2 目录及创建的文件 10
1.4.3 项目工作区窗口的使用 11
1.4.4 项目文件的添加和删除 13
1.4.5 编辑源代码和资源 14
1.4.6 项目配置 15
1.4.7 项目连编 16
1.4.8 改正编译错误 16
1.4.9 运行应用程序 17
1.4.10 调试应用程序 18
1.4.11 剖试器和代码优化 18
1.5 采用Visual C++提供的向导工具 18
1.6 项目工作区窗口的使用 19
1.6.1 文档窗口 19
1.6.2 停靠窗口 20
1.7 工具栏和菜单 21
1.8 Visual C++中的查找 22
1.8.1 查找和替换 22
1.8.2 下拉式的查找列表控件 23
1.8.3 文件查找命令 23
1.8.4 源代码文件的书签 23
1.9 Microsoft网站和联机帮助 23
1.10 技巧 23
1.11 练习 24
1.12 下一步学什么 24
第2章 C++基础 25
2.1 采用C++语言编写的Hello程序 25
2.2 编译和运行应用程序 27
2.3 在Hello文件中的C++代码 28
2.3.1 C++注释 28
2.3.2 预编译伪指令 29
2.3.3 C++常数 29
2.3.4 C++关键字 30
2.3.5 直接量 30
2.3.6 语句 31
2.3.7 变量和数据类型 31
2.3.8 变量的内存分配 36
2.3.9 函数和参数 38
2.3.10 从函数返回结果 39
2.3.11 C/C++运行库 40
2.3.12 main函数 40
2.3.13 表达式和操作符 42
2.3.14 C++控制语句 44
2.3.15 C++输入/输出流 46
2.4 练习 46
2.5 下一步学什么 47
第3章 C++作用域、指针和引用 48
3.1 作用域 48
3.2 指针 50
3.2.1 指针基础 51
3.2.2 指针和数组 53
3.2.3 指针和字符串 54
3.2.4 函数参数和函数返回指针 55
3.3 引用 58
3.4 关于指针、引用的规则和注意事项 60
3.4.1 传递参数和返回结果的规则 60
3.4.2 返回结果需要注意事项 60
3.5 头文件和实现文件 62
3.5.1 避免多重包含 64
3.5.2 预编译头文件 64
3.6 练习 64
3.7 下一步学什么 65
第4章 C++类 66
4.1 对象和类 66
4.2 Shape1程序 68
4.2.1 Shape1程序的C++代码 72
4.2.2 Shape1程序中的struct 73
4.2.3 Shape1程序中的运行库函数 74
4.2.4 Shape1程序中的main函数 75
4.2.5 Shape1程序的缺陷 76
4.3 Shape2程序 76
4.3.1 Shape2程序的C++语言 80
4.3.2 静态变量 84
4.3.3 Shape2程序的缺陷 85
4.4 友元函数 85
4.5 练习 87
4.6 下一步学什么 87
第5章 面向对象程序设计 88
5.1 Shape3程序 88
5.1.1 Shape3程序中的C++ 93
5.1.2 类的派生 94
5.1.3 设计类的层次性 98
5.1.4 类层次的访问权限 99
5.1.5 析构器 100
5.1.6 静态类成员 101
5.1.7 关于构造器和析构器的进一步说明 102
5.1.8 操作符重载 108
5.2 作用域 109
5.3 面向对象的程序设计 110
5.4 本书没有介绍的内容 111
5.5 练习 112
5.6 下一步学什么 113
第6章 Windows和Win32 API 114
6.1 Windows的优点 114
6.2 WindowsAPI 114
6.2.1 Win32、SDK和Windows.h 114
6.2.2 Windows的主要概念 115
6.2.3 不同的Win32平台编程 115
6.2.4 多任务和多线程 115
6.3 Windows基础 115
6.3.1 事件 116
6.3.2 消息 116
6.3.3 绘图 117
6.3.4 设备描述表 119
6.3.5 坐标系 120
6.4 Windows程序的生命周期 123
6.5 练习 123
6.6 下一步学什么 123
第7章 采用MFC AppWizard生成代码 124
7.1 MFC、Win32 API和学习曲线 124
7.1.1 类库 124
7.1.2 应用框架 125
7.2 使用AppWizard生成代码 126
7.2.1 跟我一起学习 126
7.2.2 对MyDraw程序进行连编 128
7.2.3 运行MyDraw应用程序 129
7.2.4 AppWizard免费提供的是什么 130
7.3 编写代码 131
7.4 练习 133
7.5 下一步学什么 133
第8章 MFC内幕 134
8.1 通过AppWizard文件来探索MFC 134
8.2 浏览代码 134
8.2.1 应用程序对象 135
8.2.2 主框架窗口对象 142
8.2.3 文档对象 146
8.2.4 文档/视图结构 147
8.2.5 视图对象 149
8.3 Windows在MFC中的位置 153
8.4 MFC程序的生命周期 154
8.5 在运行AppWizard之后的工作 155
8.6 MFC和Windows 155
8.7 在MFC查找和使用钩子 156
8.8 练习 157
8.9 下一步学什么 157
第二部分 MFC基础 159
第9章 菜单 159
9.1 MyDraw程序简介 159
9.2 菜单 160
9.2.1 菜单资源 160
9.2.2 菜单助记符和菜单加速键 161
9.3 Windows资源 161
9.4 在MyDraw程序中添加“Tools”菜单 163
9.4.1 加入顶层菜单 164
9.4.2 添加子菜单 164
9.4.3 在MyDraw程序中添加键盘加速键 165
9.5 菜单和命令 166
9.6 练习 167
9.7 下一步学什么 167
第10章 添加命令处理函数 168
10.1 继续MyDraw程序的第一步 168
10.2 添加命令处理函数 168
10.2.1 添加OnToolRectangle和OnTool Ellipse命令处理函数 169
10.2.2 在视图类中添加数据成员m_boxShape 172
10.2.3 添加两个辅助函数RandomCoord和RandomRect 172
10.3 测试OnDraw的菜单和绘图命令 174
10.3.1 使图形消失 175
10.3.2 更新重画 175
10.3.3 记住Shape类型 175
10.3.4 MyDraw程序的功能 176
10.4 MyDraw程序的未来版本 177
10.5 练习 177
10.6 下一步学什么 178
第11章 增加人机界面功能 179
11.1 采用鼠标绘图 179
11.1.1 与鼠标相关的函数 179
11.1.2 鼠标消息处理函数 180
11.1.3 添加鼠标消息处理函数 181
11.1.4 采用AfxMessageBox来测试消息处理函数 182
11.2 MyDraw程序 183
11.2.1 创建Shape数据类型 184
11.2.2 代替视图类数据成员 184
11.2.3 重写OnDraw函数 185
11.2.4 为鼠标消息添加消息处理函数 186
11.2.5 添加绘图辅助函数 187
11.2.6 重写“Tool”命令处理函数 188
11.2.7 为“Tool”命令添加更新处理函数 188
11.2.8 删掉旧代码 188
11.3 在鼠标消息处理函数中绘制图形 189
11.3.1 按下鼠标按钮:开始绘图 189
11.3.2 捕获鼠标消息 189
11.3.3 设置绘图的起始位置 189
11.3.4 拖动鼠标:在绘图中描出鼠标轨迹 190
11.3.5 删掉代码行:R2_NOT绘制图形模式 190
11.3.6 InvertShape辅助函数 190
11.3.7 释放鼠标:结束绘图 191
11.3.8 释放捕获 192
11.3.9 绘制最后的图形,调整它的坐标 192
11.3.10 在数组中保存图形 192
11.3.11 使用数组 192
11.4 对选中的绘制图形工具添加选中标记:更新菜单 192
11.4.1 更新处理函数 193
11.4.2 CCmdUI类 193
11.4.3 添加一个更新处理函数 193
11.5 使图形透明 194
11.6 练习 197
11.7 下一步学什么 197
第12章 在绘图中使用颜色 198
12.1 RGB颜色系统 198
12.1.1 采用RGB宏来创建一种颜色 198
12.1.2 用颜色进行工作 198
12.2 添加分层的“Tools”菜单 199
12.3 为“Color”菜单命令编写高效的处理函数 200
12.4 在“Color”菜单中添加选中标记 201
12.5 采用颜色绘图 202
12.5.1 管理当前选中的颜色 202
12.5.2 将“Color”命令ID转化为RGB颜色 202
12.5.3 选择采用当前颜色的画笔 203
12.5.4 设置新图形的颜色 205
12.6 练习 205
12.7 下一步学什么 205
第13章 调试应用程序 206
13.1 Visual C++调试器概览 206
13.2 Debug和Release连编的比较 207
13.3 查找程序中的缺陷 208
13.4 分析程序缺陷 209
13.4.1 变量检查 211
13.4.2 断点 213
13.4.3 在MyDraw程序中设置断点 213
13.4.4 单步执行代码 214
13.4.5 查找第11个图形 216
13.4.6 问题分析 220
13.5 修正缺陷 221
13.6 MFC调试机制 222
13.7 练习 222
13.8 下一步学什么 223
第三部分 深入学习MFC 225
第14章 数据、文档和视图 225
14.1 文档的设计 225
14.1.1 文档/视图结构 225
14.1.2 选择一个合适的数据结构 226
14.1.3 MyDraw程序的文档界面 227
14.1.4 清除文档 234
14.2 CShape类 235
14.2.1 类的定义 235
14.2.2 从CObject类中派生 237
14.2.3 CShape基类 238
14.2.4 一个派生类CShpRectangle 239
14.2.5 CShape实现 240
14.2.6 CShpRectangle和CShpEllipse实现代码 241
14.2.7 修补MyDraw的头文件结构 241
14.2.8 数据类设计考虑概述 242
14.3 练习 243
14.4 下一步学什么 244
第15章 屏幕滚动 245
15.1 为什么需要滚动栏 245
15.2 滚动的基本理论 246
15.3 处理滚动的基本技巧 248
15.4 处理文本行的滚动 248
15.4.1 画出文本 250
15.4.2 设置滚动大小 252
15.4.3 在MyText中添加滚动 253
15.5 返回MyDraw程序 254
15.5.1 在何处调用SetScrollSize 255
15.5.2 文档长度计算 255
15.5.3 在MyDraw程序中增加滚动功能 256
15.5.4 坐标转换 257
15.6 几点思考 260
15.7 练习 261
15.8 下一步学什么 261
第16章 在文件中保存数据 262
16.1 序列化和反序列化 262
16.2 在MyDraw中实现序列化 263
16.2.1 数据类的序列化要求 263
16.2.2 使一个图形序列化 265
16.2.3 在文档中序列化所有图形 265
16.2.4 CShape的序列化成员函数 266
16.2.5 CMyDrawDoc中的序列化成员函数 268
16.2.6 采用CArchieve操作符和调用Serialize 269
16.2.7 采用MFC模式进行应用程序版本控制 271
16.3 序列化是怎样工作的 272
16.3.1 DECLARE_SERIAL宏和IMPLEMENT_SERIAL宏 272
16.3.2 创建对象 272
16.3.3 Serialize是如何调用的 273
16.3.4 CArchieve和CFile 274
16.4 不采用序列化 275
16.4.1 文档/视图中的文件I/O 275
16.4.2 在非文档/视图结构中使用文件I/O 276
16.5 练习 276
16.6 下一步学什么 276
第17章 文档打印 277
17.1 打印设计 277
17.2 MFC打印程序结构 277
17.2.1 Windows打印 277
17.2.2 采用MFC进行打印程序设计 278
17.3 改变映射模式 279
17.4 对文档编写页码 282
17.4.1 计算可打印区域 283
17.4.2 MFC在何处中断页面的打印 285
17.5 纵向打印和横向打印 288
17.6 添加页眉和页脚 289
17.6.1 添加PrintHeader和PrintFooter函数 290
17.6.2 添加页眉 291
17.6.3 添加页脚 292
17.7 结束打印 293
17.8 练习 294
17.9 下一步学什么 294
第18章 工具栏和选择工具 295
18.1 添加一个工具栏 295
18.1.1 工具栏类 295
18.1.2 创建一个新的工具栏资源 295
18.1.3 编写工具栏代码 297
18.2 实现“Selection”代码 301
18.2.1 选择模式是如何工作的 302
18.2.2 “Selction”按钮 302
18.2.3 在Shapes类中的选择代码 304
18.2.4 击中测试 307
18.2.5 绘制选择处理 309
18.3 练习 312
18.4 下一步学什么 312
第19章 对话框和控件 313
19.1 关于对话框和控件 313
19.2 一个简单的有模式对话框 314
19.2.1 创建并编辑对话框资源 315
19.2.2 创建对话框类 316
19.2.3 显示对话框并检索它的内容 317
19.3 Windows公共对话框 319
19.3.1 关于公共对话框 319
19.3.2 在MyDraw中添加“Color”对话框 320
19.4 一个更为复杂的属性表单对话框 321
19.4.1 属性表单和属性页 321
19.4.2 显示“Settings”对话框 323
19.4.3 为“Setting”对话框创建对话框资源 324
19.4.4 为“Settings”对话框创建对话框类 326
19.4.5 为控件添加类数据成员 327
19.4.6 实现“Shape”属性页 328
19.4.7 实现“Line”属性页 329
19.5 控件窗口 332
19.6 练习 333
19.7 下一步学什么 333
第20章 多视图 334
20.1 分割窗口 334
20.1.1 何时采用动态或静态分割窗口 335
20.1.2 将静态和动态分割窗口相结合 335
20.2 在MyDraw中添加动态分割窗口 336
20.3 创建一个静态分割窗口 337
20.4 采用视图类能完成什么 338
20.4.1 用于人机交互 339
20.4.2 视图是一个窗口 339
20.4.3 作为应用程序视图类的基类 339
20.4.4 组合视图类 339
20.5 MFC对象的通信 340
20.6 祝贺 340
20.7 练习 340
20.8 下一步学什么 341
第21章 结束MyDraw程序 342
21.1 关于C++、Visual C++和MFC的工具书 342
21.2 本书所没有涉及的内容 343
21.3 Microsoft网站和MSDN Online 343
21.4 MyDraw程序的最后特色 344
21.5 MyDraw的最终版本 345
附录A MFC源代码文件 346