译者序 1
前言 1
第一部分 从头开始 1
第1章 建立第一个应用程序 1
1.1 生成一个Windows应用程序 1
目录 1
1.1.1 决定应用程序支持多少文档 2
1.1.2 数据库 3
1.1.3 复合文档支持 4
1.1.4 外观和其他选项 5
1.1.5 其他选项 7
1.1.7 生成应用程序 8
1.1.6 文件和类名 8
1.1.8 试一试 9
1.2 生成基于对话的应用程序 10
1.3 生成DLL,控制台应用程序以及其他 13
1.3.1 ATL COM AppWizard 14
1.3.2 Custom AppWizard 14
1.3.3 Database Project 14
1.3.4 DevStudio Add-in Wizard 14
1.3.5 ISAPI Extension Wizard 14
1.3.6 Makefile 14
1.3.7 MFC ActiveX Control Wizard 14
1.3.12 Win32 Dynamic-Link Library 15
1.3.11 Win32 Console Application 15
1.4 改变AppWizard决定 15
1.3.13 Win32 Static Library 15
1.3.10 Win32 Application 15
1.3.9 Niw Database Wizard 15
1.3.8 MFC AppWizard(DLL) 15
1.5 理解AppWizard代码 16
1.5.1 单文档界面应用程序 16
1.5.2 其他文件 21
1.6 理解多文档界面应用程序 21
1.7 基于对话的应用程序 24
1.8 回顾AppWizard决定以及本书 26
1.9 小结 27
第二部分 用对话框和控件与应用程序交互第2章 对话框和控件 29
2.1 理解对话框 29
2 2 创建对话框资源 30
2.2.2 创建示例对话框 31
2.2.1 定义对话框和控件的ID 31
2.3 编写对话框类 32
2.4 使用对话框类 34
2.4.1 显示对话框 35
2.4.2 屏幕之后 36
2.4.3 使用列表框控件 37
2.4.4 使用单选按钮 41
2.5 小结 42
第3章 Windows 95常用控件 43
3.1 Win95控件应用程序 43
3.2 进度条控件 45
3.2.1 创建进度条 45
3.2.2 初始化进度条 46
3.2.3 操作进度条 46
3.3 滑块控件 46
3.3.1 创建跟踪条 47
3.3.2 初始化跟踪条 48
3.4 上下控件 49
3.3.3 操作滑块 49
3.5 图像列表控件 51
3.5.1 创建图像列表 52
3.5.2 初始化图像列表 52
3.6 列表视图控件 53
3.6.1 创建列表视图 56
3.6.2 创建列表视图的列 59
3.6.3 创建列表视图的项目 59
3.6.4 操作列表视图 61
3.7 树形视图控件 63
3.7.1 创建树形视图 64
3.7.2 创建树形视图的项目 66
3.8 Rich编辑控件 67
3.7.3 操作树形视图 67
3.8.1 创建rich编辑控件 68
3.8.2 初始化rich编辑控件 69
3.8.3 操作rich编辑控件 71
3.9 小结 73
第4章 消息和命令 74
4.1 消息传递 74
4.2 消息循环 75
4.3 消息映射 76
4.3.1 消息映射宏 77
4.3.2 消息映射是如何工作的 78
4.3.3 由MFC代码所捕获的消息 80
4.4 ClassWizard帮助用户捕获消息 80
4.4.1 带标签的ClassWizard对话框 80
4.4.2 添加Windows消息处理函数对话框 81
4.4.3 哪个类应捕获消息 82
4.5 消息列表 82
4.6 命令 84
4.7 命令更新 84
4.8 ClassWizard帮助用户捕获命令和命令更新 86
4.9 小结 87
第5章 文档和视图 88
5.1 了解文档类 88
5.2 了解视图类 90
5.3 建立Rectangles应用程序 93
5.4 其他视图类 97
5.5 文档模板,视图和框架窗口 98
5.6 小结 100
6.1 理解设备环境 101
第6章 在屏幕上绘图 101
第三部分 由应用程序获取信息 101
6.2 Pointl应用程序介绍 102
6.3 创建Paintl应用程序 103
6.3.1 在一个MFC程序中画图 104
6.3.2 切换显示 105
6.3.3 使用字体 106
6.3.4 改变窗口的大小和位置 110
6.3.5 使用画笔 111
6.3.6 使用画刷 113
6.4 滚动窗口 115
6.5 小结 121
第7章 打印和打印预览 122
7.1 理解MFC的基本打印和打印预览 122
7.2 缩放 124
7.3 打印多页 126
7.4 设置原点 131
7.5 MFC和打印 133
7.6 小结 135
第8章 持久性和文件I/O 136
8.1 对象和持久性 136
8.2 File Demo应用程序 136
8.2.1 Document类的回顾 138
8.2.2 File Demo的源代码的快速浏览 138
8.3 创建一个持久类 141
8.3.1 File Demo 2应用程序 142
8.3.2 CMessage类一览 142
8.3.3 在程序中使用CMessage类 145
8.4.2 CFile类 147
8.4.1 File Demo 3应用程序:使用CFile 147
8.4 直接读写文件 147
8.4.3 开发File Demo 3应用程序 149
8.5 创建自己的CArchive对象 151
8.6 注册 152
8.6.1 Registry是如何设置的 152
8.6.2 预定义的键 152
8.6.3 在MFC应用程序中使用 154
Registry 154
8.6.4 重新访问File Demo 2应用程序 155
8.7 小结 155
第9章 创建一个完整的应用程 157
序:ShowString 157
9.1 建立显示字符串的应用程序 157
9.1.1 用AppWizard创建一个空壳 157
9.1.2 显示字符串 158
9.2 建立ShowString菜单 161
9.3 创建ShowString对话框 164
9.3.1 ShowString的About对话框 164
9.3.2 ShowString的选项对话框 165
9.4 使菜单工作 166
9.4.1 对话框类 166
9.4.2 捕获消息 169
9.5 使对话框工作 170
9.6 向选项对话框添加外观选项 171
9.6.1 改变选项对话框 172
9.6.2 在对话框类中增加成员变量 173
9.6.3 在文档中增加成员变量 174
9.6.4 改变OnToolsOptions() 175
9.6.5 改变OnDraw() 176
9.7 小结 177
第四部分 改善用户界面 179
第10章 状态栏和工具栏 179
10.1 使用工具栏 179
10.1.1 删除工具栏按钮 179
10.1.2 添加按钮到工具栏 181
10.1.3 CToolBar类的成员函数 185
10.2 使用状态栏 186
10.2.1 创建新的命令ID 188
10.2.2 创建缺省字符串 188
10.2.3 添加ID到指示器数组 189
10.2.4 创建窗格的命令更新处理程序 190
10.2.5 设置状态栏的外观 191
10.3 小结 193
11.1 Help的不同类型 195
第11章 帮助 195
11.1.1 获得Help 196
11.1.2 显示Help 196
11.1.3 使用Help 196
11.1.4 编写Help程序 198
11.2 帮助系统的组件 198
11.3 AppWizard支持的Help 200
11.4 设计用户Help的方法 200
11.5 命令Help的编程 201
11.6 上下文Help的编程 202
11.7 编写Help文本 205
11.7.1 更改占位符字符串 207
11.7.2 添加主题 209
11.7.3 更改“How to Modify Text”主题 212
11.8 Contents的调整 213
11.9 小结 215
第12章 属性页,属性表和属性向导 216
12.1 属性表介绍 216
12.2 创建属性表演示应用程序 217
12.3 运行属性表演示应用程序 227
12.4 在用户应用程序中添加属性表 227
12.5 把属性表变成Wizards 228
12.5.1 运行Wizard Demo应用程序 229
12.5.2 创建Wizard页 230
12.5.3 显示Wizard 230
12.5.4 设置Wizard的按钮 231
12.5.5 响应向导的按钮 232
12.6 小结 233
13.1 ActiveX的目的 235
第13章 ActiveX概念 235
第五部分 AcriveX应用程序和控件 235
13.2 对象链接 238
13.3 对象嵌入 239
13.4 容器与服务器 240
13.5 更加直观的用户界面 241
13.6 组件对象模型 242
13.7 ActiveX Automation 243
13.8 ActiveX控件 245
13.9 小结 245
第14章 创建ActiveX容器应用程序 246
14.1 改变Showstring 246
14.1.1 由AppWizard生成的AetiveX容器代码 246
14.1.2 返回ShowString功能 262
14.2 移动、重设大小和跟踪 263
14.3 处理多个对象和对象选取 266
14.3.1 击中测试 266
14.3.2 画多个选项 267
14.3.3 处理单击 268
14.3.4 处理双击 271
14.4 实现拖放 271
14.4.1 实现拖动源 271
14.4.2 实现释放目标 273
14.4.3 注册视图作为释放目标 273
14.4.4 建立函数框架,添加成员变量 274
14.4.5 OnDragEnter 275
14.4.6 OnDragOver 277
14.4.7 OnDragLiave 279
14.4.8 OnDragDrop 279
14.5 删除对象 281
14.4.9 测试和拖动目标 281
14.6 小结 282
第15章 创建ActiveX服务器应用程 283
序 283
15.1 给ShowString添加服务器功能 283
15.1.1 AppWizard的服务器示例程序 283
15.1.2 再次显示字符串 298
15.2 既是服务器又是容器的应用程序 302
15.2.1 创建另一个版本的ShowString 302
15.2.2 嵌套和递归问题 303
15.3 ActiveX文档 304
15.3.1 ActiveX Documents做些什么 304
15.3.2 使ShowString成为ActiveX文档服务器 305
15.4 小结 309
第16章 创建自动服务器 310
16.1 再次设计ShowString 310
16.1.1 AppWizard的自动示例程序 310
16.1.2 揭示属性 313
16.1.3 OnDraw()函数 318
16.1.4 显示窗口 320
16.2 Visual Basic 322
16.3 类型库和ActiveX内核 325
16.4 小结 327
第17章 创建ActiveX控件 328
17.1 一个滚动的骰子控件 328
17.1.1 创建控件外壳 328
17.1.2 AppWizard的代码 330
17.2.1 添加属性 333
17.2 显示当前值 333
17.1.3 设计控件 333
17.2.2 编写绘图代码 335
17.3 响应鼠标单击和滚动骰子 337
17.3.1 通知容器 338
17.3.2 滚动骰子 339
17.4 更好的用户界面 341
17.4.1 位图图标 341
17.4.2 显示圆点 341
17.5 属性表 345
17.5.1 数字与圆点 345
17.5.2 用户选择的颜色 349
17.6 按需滚动 354
17.7.3 骰子数组 355
17.8 小结 355
17.7.1 允许与禁止滚动 355
17.7.2 具有非同寻常面数的骰子 355
17.7 进一步改进 355
第六部分 Internet编程 357
第18章 插口,MAPI和Internet 357
18.1 使用Windows插口 357
18.2 消息收发API(MAPI) 360
18.2.1 何为MAPI? 360
18.2.2 Win95标志要求 361
18.2.3 MAPI的高级应用 363
18.3 使用Visual C++4.2中的新的Internet类 365
18.4 使用Internet服务器API(ISAPI)类 366
18.5 小结 368
编程 370
19.1 设计Internet查询应用程序 370
第19章 用Winlnet类进行Internet 370
19.2 创建查询对话框 372
19.3 查询HTTP站点 374
19.4 查询FTP站点 379
19.5 查询Gopher站点 381
19.6 使用Gopher发送Finger查询 383
19.7 使用Gopher发送一个Whois查询 386
19.8 未来的工作 388
19.9 小结 388
第20章 创建一个Internet ActiveX 389
控件 389
20.1 在Micorsoft ExplorerWeb页中嵌入一个ActiveX控件 389
20.2 把一个ActiveX控件嵌入到NetscapeNavigatorWeb页中 392
20.3 为了改编和初始化安全而注册 394
ActiveX控件 398
20.4 在ActiveX和Java之间进行选择 398
20.5 使用AppWizard来创建更快的 398
20.6 用异步属性加速控件代码 402
20.6.1 属性 403
20.6.2 使用BLOB 403
20.6.3 改变Dieroll 404
20.6.4 测试和调试Dieroll 410
20.7 小结 411
第21章 活动模板库 413
21.1 为何使用ATL? 413
21.2 用AppWizard开始 414
21.3 使用Object Wizard 415
21.3.1 在工程中加入一个控件 415
21.3.2 命名此控件 415
21.3.3 设置控件属性 416
21.3.4 支持Stock属性 418
21.4 给控件添加属性 418
21.4.1 由Object Wizard生成的代码 418
21.4.2 添加ReadyState Stock属性 421
21.4.3 增加定制属性 421
21.4.4 初始化属性 423
21.4.5 添加异步属性 424
21.5 绘制控件 427
21.6 持久性和属性页 431
21.6.1 增加一个属性页 431
21.6.2 连接属性页到CDieRoll 435
21.6.3 在属性包中的持久性 435
21.7 在Control Pad中使用控件 435
21.8.1 编辑idl文件 436
21.8 增加事件 436
21.8.2 IConnectionPoint接口的包装类 437
21.8.3 触发单击事件 438
21 8.4 触发ReadyStateChange事件 439
21.9 展示DoRoll()函数 439
21.10 Init Safe和Script Safe的注册 440
21.11 准备在设计模式中使用的控件 441
21.12 最小化可执行文件大小 442
21.13 在Web页中使用控件 444
21.14 修正闪烁 445
21.15 小结 446
第七部分 高级编程技术 447
第22章 数据库访问 447
22.1 数据库概念 447
22.1.3 数据库访问 448
22.1.2 关系数据库模型 448
22.1.1 平面数据库模型 448
22.1.4 Visual C++ ODBC类 450
22.2 创建ODBC数据库应用程序 450
22.2.1 注册数据库 450
22.2.2 创建基本的Employee应用程序 452
22.2.3 创建数据库显示 455
22.2.4 添加和删除记录 459
22.2.5 OnRecordAdd()函数分析 464
22.2.6 OnMove()函数分析 464
22.2.7 OnRecordDelete()函数分析 465
22.2.8 排序与过滤 465
22.2.9 OnSortDept()函数分析 470
22.2.10 DoFilter()函数分析 470
22.3 在ODBC与DAO之间作出选择 471
22.4 OLE DB 472
22.5 小结 473
第23章 最新的企业版 474
23.1 SQL 474
23.2 在C++中使用SQL操作数据库 475
23.3 开发出版应用程序 476
23.3.1 创建应用程序外壳 476
23.3.2 数据连接 479
23.3.3 查询设计器 481
23.3.4 存储过程 482
23.3.5 编写新的存储过程 484
23.3.6 存储过程与C++代码的连接 486
23.4 使用数据库 489
23.4.1 数据库设计器 489
23.4.2 数据库图表 491
23.5 Microsoft事务处理服务器 492
23.6 使用Visual SourceSafe 493
23.7 小结 494
第24章 提高应用程序性能 495
24.1 ASSERT和TRACE 495
24.1.1 ASSERT:检测逻辑错误 495
24.1.2 TRACE:隔离用户程序中存 496
在问题的区域 496
24.2 只调试特征 497
24.3 封住内存泄漏 499
24.3.1 内存泄漏的共同原因 499
24.3.2 调试使用new和delete调用 500
的代码 500
24.3.3 自动指针 501
24.4 优化 502
24.5 配置 504
24.6 小结 504
第25章 用Gallery和用户自己的 506
AppWizard的实现重用 506
25.1 书写可重用代码的优点 506
25.2 使用Component Gallery 507
25.2.1 向Gallery中添加一个组件 507
25.2.2 在用户项目中使用Gallery 508
Components 508
25.3 开发Gallery 509
25.4 定制的AppWizard介绍 510
25.5 小结 513
补充 514
26.1 例外 514
第26章 例外、模板和C++的最新 514
26.1.1 简单的例外处理 515
26.1.2 例外对象 516
26.1.3 放置catch块 517
26.1.4 处理多种类型的例外 521
26.1.5 旧的例外机制 523
26.2 使用模板 523
26.2.1 模板介绍 524
26.2.2 创建函数模板 524
26.2.3 创建类模板 526
26.2.4 标准模板库 530
26.3 使用运行时类型信息 532
26.3.1 RTTI介绍 532
26.3.3 获得对象信息 533
26.3.2 实现安全的向下传播 533
26.3.4 准备使用RTTI 535
26.4 名字空间 536
26.4.1 定义一个名字空间 536
26.4.2 名字空间范围确定 537
26.4.3 未命名的名字空间 538
26.4.4 名字空间别名 538
26.5 新的关键字与数据类型 539
26.5.1 bool数据类型 539
26.5.2 mutable关键字 539
26.5.3 typename关键字 540
26.5.4 explicit关键字 541
26.6 小结 541
理 543
27.1 简单线程 543
第27章 Windows线程的多任务处 543
27.2 线程通信 547
27.2.1 利用全局变量通信 547
27.2.2 利用用户定义的消息通信 549
27.2.3 利用事件对象通信 551
27.3 使用线程同步 553
27.3.1 使用临界区 553
27.3.2 使用互斥 558
27.3.3 使用信号量 559
27.4 小结 562
第28章 未来的开发方法 563
28.1 创建控制台应用程序 563
28.1.1 创建一个控制台可执行程序 563
28.1.2 编写一个面向对象的控制台应用程序 565
28.1.3 搭架起离散的算法 566
28.2 创建并使用一个32位的动态链接库 567
28.3 制作一个32位的DLL 569
28.4 使用32位DLLs 572
28.5 发送消息和命令 574
28.6 软件的国际化发展趋势 575
28.7 小结 577
第八部分 附录 579
附录A Windows编程回顾以及CWnd 579
内幕 579
附录B DeveloperStudio用户界面 588
附录C 调试 639
附录D MFC宏和全局变量 651
附录E 有用的类 658
附录F Visual Basic Script快速参考 681
附录G 光盘内容简介 777