前言 1
第一部分 开始学习 1
第1章 创建一个Windows应用程序 1
1.1 生成一个Windows应用程序 1
译者序 1
1.1.1 选择文档界面风格 2
1.1.2 数据库 3
1.1.3 复合文档支持 4
1.1.4 外观和其他选项 5
1.1.6 文件名和类名 7
5.4 滚动窗口 7
1.1.5 其他选项 7
1.1.8 试验应用程序 8
1.1.7 生成应用程序 8
1.2 生成一个基于对话框的应用程序 10
1.3 生成DLL、控制台应用程序及其他 13
1.3.1 ATL COM AppWizard 13
1.3.2 Custom AppWizard 13
1.3.3 Database Project 13
1.3.4 DevStudio Add-In Wizard 13
1.3.9 Win32 Application 14
1.3.11 Win32 Dynamic Link Library 14
1.3.10 Win32 Console Application 14
1.3.5 ISAPI Extension Wizard 14
1.3.8 MFC AppWizard(DLL) 14
1.3.7 MFC ActiveX Control Wizard 14
1.3.6 Makefile 14
1.5.1 单文档界面应用程序 15
1.3.12 Win32 Static Library 15
1.4 在应用程序向导中改变选择项目 15
1.5 理解应用程序向导所生成的代码 15
1.5.3 理解多文档界面应用程序代码 20
1.5.2 其他文件 20
1.5.4 理解基于对话框的应用程序代码 23
1.6 回顾AppWizard的选择项和本章小结 25
第2章 对话框和控件 27
2.1 理解对话框 27
2.2 创建对话框资源 27
2.2.1 定义对话框和控件ID 29
2.2.2 创建示例对话框 29
2.3 编写对话框类 30
2.4 使用对话框类 32
2.4.1 显示对话框 32
2.4.2 屏幕之后 34
2.4.3 使用列表框控件 35
2.4.4 使用单选按钮 38
第3章 消息和命令 40
3.1 理解消息机制 40
3.2 理解消息循环 41
3.3 消息映射 43
3.3.1 消息映射宏 43
3.3.2 消息映射如何工作? 44
3.3.3 MFC代码捕获的消息 45
3.4 怎样利用ClassWizard捕获消息 46
3.4.1 ClassWizard对话框 46
3.4.2 添加Windows消息处理对话框 47
3.4.3 捕获消息的类 48
3.5 识别消息 48
3.6 理解命令 49
3.7 理解命令更新 50
3.8 怎样利用ClassWizard捕获命令与命令更新 51
第二部分 从应用程序得到信息 53
第4章 文档和视图 53
4.1 理解文档类 53
4.2 理解视图类 55
4.3 创建Rectangles应用程序 57
4.4 其他视图类 61
4.5 文档模板、视图和框架窗口 62
5.1 理解设备环境 64
第5章 在屏幕上绘图 64
5.2 介绍Paintl应用程序 65
5.3 创建Paintl应用程序 66
5.3.1 在MFC程序中画图 66
5.3.2 切换显示 67
5.3.3 使用字体 69
5.3.4 改变窗口的大小和位置 72
5.3.5 使用画笔 73
5.3.6 使用画刷 74
5.4.1 创建Scroll应用程序 77
5.4.3 添加代码减少行 80
5.4.2 添加代码增加行 80
6.1 理解MPC的基本打印和打印预览 83
第6章 打印和打印预览 83
6.2 缩放 85
6.3 打印多页 86
6.3.1 设置原点 91
6.3.2 MFC和打印 92
第7章 持久性和文件I/O 95
7.1 对象的持久性 95
7.2 File Demo应用程序 95
7.2.1 文档类的回顾 95
7.2.2 创建File Demo应用程序 96
7.3 创建一个持久类 99
7.3.2 CMessages类一览 100
7.3.1 File Demo 2应用程序 100
7.3.3 在程序中使用CMessages类 103
7.4 直接读写文件 104
7.5 创建自己的CArchive对象 106
7.6 理解注册 106
7.6.1 注册是如何设置的 107
7.6.2 预定义的键 108
7.6.3 在MFC应用程序中使用“注册” 108
7.6.4 简单的应用程序 109
第8章 创建一个完整的应用程序:ShowString 110
8.1 建立显示字符串的应用程序 110
8.1.1 用AppWizard创建一个程序的空壳 110
8.1.2 显示字符串 111
8.2 建立ShowString菜单 113
8.3 创建ShowString对话框 116
8.3.1 ShowString的About对话框 116
8.3.2 ShowString的Options对话框 117
8.4 使菜单工作 118
8.4.1 对话框类 118
8.4.2 捕获消息 121
8.5 使对话框工作 122
8.6 向Options对话框添加外观选项 123
8.6.1 改变Options对话框 123
8.6.2 在对话框类中增加成员变量 124
8.6.3 在文档中增加成员变量 125
8.6.4 改变OnTools Options() 126
8.6.5 改变OnDraw() 127
第三部分 改善用户界面 129
第9章 状态栏和工具栏 129
9.1 使用工具栏 129
9.1.1 删除工具栏按钮 129
9.1.2 添加按钮到工具栏 131
9.1.3 CToolBar类的成员函数 134
9.2 使用状态栏 135
9.2.1 创建新的命令ID 136
9.2.2 创建缺省字符串 137
9.2.3 添加ID到指示器数组 138
9.2.4 创建窗格的命令更新处理程序 138
9.2.5 设置状态栏的外观 140
9.3 使用Rebars 142
第10章 常用控件 145
10.1 进度条控件 147
10.1.1 创建进度条 147
10.1.2 初始化进度条 148
10.1.3 操作进度条 148
10.2 滑块控件 149
10.2.1 创建滑块 149
10.2.2 初始化滑块 150
10.2.3 操作滑块 150
10.3 上下控件 151
10.4 图像列表控件 152
10.4.2 初始化图像列表 153
10.4.1 创建图像列表 153
10.5 列表视图控件 154
10.5.1 创建列表视图 156
10.5.2 创建列表视图的列 157
10.5.3 创建列表视图的项目 158
10.5.4 操作列表视图 159
10.6 树形视图控件 163
10.6.1 创建树形视图 164
10.6.2 创建树形视图的项目 165
10.6.3 操作树形视图 167
10.7 Rich Edit控件 168
10.7.1 创建Rich Edit控件 168
10.7.3 操作Rich Edit控件 169
10.7.2 初始化Rich Edit控件 169
10.8 IP地址控件 172
10.9 日期提取(Date Picker )控件 172
10.10 月历(Month Calendar)控件 174
10.11 卷动视图 174
第11章 帮助 176
11.1 不同类型的Help 176
11.1.1 获得Help 176
11.1.2 显示Help 177
11.1.3 使用Help 178
11.1.4 编写Help程序 179
11.2 帮助系统的组件 179
11.3 AppWizard支持的Help 180
11.4 设计你自己的Help的方法 181
11.5 命令Help的编程 182
11.6 上下文Help的编程 183
11.7 编写Help文本 186
11.7.1 更改占位符字串 187
11.7.2 添加主题 189
11.7.3 更改“How to Modify Text”主题 192
11.8 Contents的调整 193
第12章 属性页和属性表 195
12.1 属性表介绍 195
12.2 创建属性表演示应用程序 196
12.2.1 创建基本文件 196
12.2.2 编辑资源 196
12.2.3 添加新资源 199
12.2.4 建立资源和类的关联 200
12.2.5 创建属性表类 201
12.3 运行属性表演示应用程序 204
12.4 在应用程序中添加属性表 205
12.5 把属性表变成Wizard(向导) 205
12.5.1 运行Wizard Demo应用程序 206
12.5.2 创建Wizard页 207
12.5.3 显示Wizard 207
12.5.4 设置Wizard的按钮 208
12.5.5 响应Wizard的按钮 208
第四部分 ActiveX应用程序与ActiveX控件 211
第13章 ActiveX概念 211
13.1 ActiveX的目的 211
13.2 对象链接 213
13.3 对象嵌入 214
13.4 容器和服务器 215
13.5 面向更加直观的用户界面 216
13.6 组件对象模型 217
13.7 自动化 219
13.8 ActiveX控件 220
第14章 创建ActiveX容器应用程序 221
14.1 更改ShowString 221
14.1.1 AppWiard生成ActiveX容器代码 221
14.1.2 恢复ShowString的功能 235
14.2 移动、改变大小和跟踪 236
14.3 处理多个对象和对象选择 239
14.3.1 击中测试 239
14.3.2 画多个项目 240
14.3.3 处理单击 241
14.3.4 处理双击 243
14.4 实现拖放 244
14.4.1 实现拖动源 244
14.4.2 实现释放目标 245
14.4.3 将视图作为释放目标注册 246
14.4.4 建立函数框架并添加成员函数 246
14.4.5 OnDragEnter() 247
14.4.6 OnDragOver() 249
14.4.7 OnDragLeave() 251
14.4.8 OnDragDrop() 251
14.5 删除对象 253
14.4.9 测试和拖动目标 253
第15章 创建ActiveX服务器应用程序 255
15.1 给ShowString增加服务器功能 255
15.1.1 AppWizard的服务器示例程序 255
15.1.2 再次显示字符串 269
15.2 既是服务器又是容器的应用程序 273
15.2.1 创建另一个版本的ShowString 273
15.2.2 嵌套和递归问题 273
15.3 ActiveX文档* 274
15.3.1 ActiveX文档做些什么 275
15.3.2 使用ShowString 成为ActiveX文档服务器 276
16.1 再次设计ShowString 279
16.1.1 AppWizard的自动模板 279
第16章 创建自动服务器 279
16.1.2 揭示属性 282
16.1.3 OnDraw()函数 286
16.1.4 显示窗口 288
16.2 在Visual Basic 中创建控制器应用程序 290
16.3 类型库和ActiveX 实质 292
第17章 创建ActiveX控件 295
17.1 创建一个骰子滚动控件 295
17.1.1 创建控件外壳 295
17.1.2 AppWizard的代码 297
17.2 显示当前值 299
17.2.1 添加属性 299
17.1.3 设计控件 299
17.2.2 编写绘图代码 301
17.3 响应鼠标单击和滚动骰子 303
17.3.1 通知容器 303
17.3.2 滚动骰子 305
17.4 创建更好的用户界面 306
17.4.1 位图图标 306
17.4.2 显示圆点 307
17.5 生成属性表 310
17.5.1 数字与圆点 310
17.5.2 用户选定的颜色 314
17.6 按要求滚动 319
17.7 将来的改进 319
17.7.1 允许与禁止滚动 319
17.7.3 骰子数组 320
17.7.2 具有与众不同的面数的骰子 320
第五部分 Internet编程 321
第18章 Sockets、MAPI和Internet 321
18.1 使用Windows Sockets 321
18.2 使用消息收发API(MAPI) 324
18.2.1 何为MAPI 324
18.2.2 Windows95标识要求 325
18.2.3 MAPI的高级应用 326
18.3 使用WinInet类 328
18.4 使用Internet服务器API(ISAPI)类 329
第19章 用WinInet类进行Internet编程 333
19.1 设计Internet查询程序 333
19.2 创建查询对话框 334
19.3 查询HTTP站点 336
19.4 查询FTP站点 341
19.5 查询Gopher站点 342
19.6 使用Gopher发送Finger查询 345
19.7 使用Gopher发送一个Whois查询 347
19.8 未来的工作 349
第20章 创建一个Internet ActiveX控件 351
20.1 在Microsoft Internet Explorer Web页中嵌入ActiveX控件 351
20.2 在Netscape Navigator Web页中嵌入ActiveX控件 354
20.3 为了改编和初始化安全而注册 355
20.4 ActiveX控件与Java Applets的选取 358
20.5 使用AppWizard创建更快的ActiveX控件 359
20.6.1 属性 363
20.6 利用异步属性提高控件的加载速度 363
20.6.2 使用BLOB 364
20.6.3 修改Dieroll 365
20.6.4 测试和调试Dieroll 370
第21章 活动模板库 372
21.1 为什么使用ATL 372
21.2 使用APPWizard入门 373
21.3 使用Object Wizard 373
21.3.1 在项目中添加一个控件 374
21.3.2 命名控件 374
21.3.3 设置控件属性 374
21.3.4 支持Stock属性 376
21.4.1 由Object Wizard生成的代码 377
21.4 给控件添加属性 377
21.4.2 添加ReadyState Stock 属性 379
21.4.3 增加定制属性 379
21.4.4 初如化属性 381
21.4.5 添加异步属性 382
21.5 绘制控件 385
21.6.1 添加属性页 389
21.6 持久性和属性页 390
21.6.2 连接属性页到CDieRoll 393
21.6.3 在属性包中的持久性 393
21.7 在Control Pad中使用控件 393
21.8 增加事件 394
21.8.1 给事件接口添加方法 394
21.8.2 实现IConnectionPoint接口 395
21.8.3 触发Click事件 395
21.8.4 触发ReadyStateChange事件 396
21.9 暴露DoRoll()函数 397
21.10 Init Safe和Script Safe的注册 398
21.11 准备在设计模式中使用的控件 398
21.12 最小化可执行文件大小 399
21.13 在Web页中使用控件 401
第六部分 高级编程技术 403
第22章 数据库访问 403
22.1 理解数据库的概念 403
22.1.1 使用平面数据库模型 403
22.1.2 使用关系数据库模型 404
22.1.3 数据库访问 405
22.1.4 Visual C++ ODBC类 405
22.2.1 注册数据库 406
22.2 创建ODBC数据库应用程序 406
22.2.2 创建基本的Empolyee应用程序 408
22.2.3 创建数据库显示 411
22.2.4 添加和删除记录 413
22.2.5 OnRecordAdd函数分析 418
22.2.6 OnMove函数分析 418
22.2.7 OnRecordDelete()函数分析 419
22.2.8 排序与过滤 419
22.2.9 OnSortDept()函数分析 424
22.2.10 DoFilter()函数分析 424
22.3 在ODBC与DAO之间作出选择 424
22.4 OLEDB 426
23.2 理解SQL 427
23.1 什么是企业版 427
第23章 最新的企业版 427
23.3 在C++中使用SQL操作数据库 428
23.4 开发发布应用程序 429
23.4.1 建立Data Source 429
23.4.2 创建应用程序外壳 432
23.4.3 建立数据连接 434
23.4.4 使用查询设计器 436
23.4.5 存储过程 437
23.4.6 编写新的存储过程 439
23.4.7 存储过程与C++代码的连接 440
23.5 使用数据库 443
23.5.1 数据库设计器 443
23.5.2 数据库图表 444
23.6 理解Microsoft事务处理服务器 445
23.7 使用Visual SourceSafe 446
第24章 改进应用程序性能 448
24.1 使用ASSERT和TRACE防止错误 448
24.1.1 ASSERT:检测逻辑错误 448
24.1.2 TRACE:隔离程序中存在问题的区域 449
24.2 增加只调试特性 450
24.3 防止内存泄漏 451
24.3.1 内存泄漏的常见原因 451
24.3.2 调试使用new和delete的代码 453
24.3.3 自动指针 454
24.4 通过优化使代码效率更高 455
24.5 利用配置文件找到瓶颈 456
25.2 使用Component Gallery 457
第25章 使用Galiery和自己的AppWizard实现重用 457
25.1 编写可重用代码的优点 457
25.2.1 向Gallery中添加一个组件 458
25.2.2 在用户项目中使用Gallery组件 459
25.2.3 开发Gallery 460
25.3 定制AppWizard简介 460
25.4 小结 463
第26章 异常的模板 464
26.1 异常 464
26.1.1 简单的异常处理 465
26.1.2 异常对象 466
26.1.3 放置catch块 467
26.1.4 处理多种类型的异常 471
26.2.1 模板介绍 473
26.2.2 创建函数模板 473
26.1.5 旧的异常机制 473
26.2 使用模板 473
26.2.3 创建类模板 475
26.3 标准模板库 479
26.3.1 管理指针模板:auto_ptr 479
26.3.2 其他有用的STL模板 481
26.4 名字空间 481
26.4.1 定义一个名字空间 481
26.4.2 名字空间范围确定 482
26.4.3 未命名的名字空间 483
26.4.4 名字空间别名 484
27.1 简单线程 485
第27章 Windows线程的多任务处理 485
27.2 线程通信 488
27.2.1 利用全局变量通信 489
27.2.2 利用用户定义的消息通信 490
27.2.3 利用事件对象通信 492
27.3 使用线程同步 494
27.3.1 使用临界区 494
27.3.2 使用互斥 499
27.3.3 使用信号量 500
第28章 未来的开发方法 504
28.1 创建控制台应用程序 504
28.1.1 创建控制台可执行程序 504
28.1.2 编写一个面向对象的控制台应用程序 505
28.2 创建并使用一个32位的动态链接库 507
28.1.3 搭架起离散的算法 507
28.2.1 创建32位DLL 512
28.2.2 使用32位DLL 514
28.3 发送消息和命令 515
28.4 软件的国际化发展趋势 517
第七部分 附 录 519
A C++回顾和面向对象的概念 519
B Windows编程回顾以及CWnd内幕 533
C Developer Studio的界面、菜单和工具栏 542
D 调试 585
E MFC宏和全局变量 598
F 有用的类 605