前言 29
第一部分 Windows、Visual C++和应用程序框架基础第一章 Microsoft Windows和Visual C++ 3
1.1 Windows的编程模式 3
1.1.1 消息处理 3
1.1.2 Windows的图形设备接口(GDI) 4
1.1.3 基于资源的程序设计 4
1.1.4 内存管理 4
1.1.5 动态连接库(DLL) 5
1.1.6 Win32应用程序编程接口 5
1.2 Visual C++的组成 5
1.2.1 Microsoft Developer Studio 97和创建过程 6
1.2.2 资源编辑器——Workspace ResourceView 8
1.2.3 C/C++编译器 8
1.2.4 资源编译器 9
1.2.5 连接器 9
1.2.6 调试器 9
1.2.7 AppWizard 9
1.2.8 ClassWizard 10
1.2.9 源程序浏览器 10
1.2.10 联机帮助 11
1.2.11 Windows诊断工具 12
1.2.12 源代码控制 12
1.2.13 Gallery 12
1.2.14 Microsoft基本类库4.21版 13
1.2.15 Microsoft ActiveX模板库 13
第二章 Microsoft基本类库应用程序框架 14
2.1 为什么要使用应用程序框架 14
2.1.1 学习曲线 17
2.2 什么是应用程序框架 18
2.2.1 应用程序框架和MFC库 18
2.2.2 应用程序框架示例 18
2.3 MFC库消息映射 21
2.3.1 文档和视图 22
第二部分 MFC库中的视图类 27
第三章 从“Hello,world!”着手学习AppWizard 27
3.1 什么是视图 27
3.2 单文档界面(SDI)和多文档界面(MDI) 28
3.3 “不做任何事情”的应用程序 28
3.4 CEx03aView视图类 32
3.5 在视窗内绘图——Windows的图形设备接口 32
3.5.1 OnDraw成员函数 33
3.5.2 Windows设备环境 33
3.5.3 往EX03A程序中加入绘制代码 33
3.6 资源编辑器简介 35
3.6.1 ex03a.rc的内容 35
3.6.2 运行对话框资源编辑器 36
3.7 Win32 Debug目标和Win32 Release目标 37
3.8 允许诊断宏 37
3.9 对预编译头文件的理解 38
3.10 两种方法运行程序 39
第四章 基本事件处理、映射模式和滚动视图 40
4.1 获取用户输入——消息映射函数 40
4.1.1 消息映射 40
4.1.2 保存视图的状态-类数据成员 41
4.1.3 初始化视图类数据成员 42
4.1.4 使矩形区域无效 42
4.1.5 Windows的客户区域 42
4.1.6 CRect,CPoint和CSize类的运算 43
4.1.7 一个点是否在矩形内 43
4.1.8 CRect的LPRECT操作符 43
4.1.9 一个点是否在椭圆内 44
4.2 EX04A示例程序 44
4.3 对EX04A使用ClassWizard 48
4.3.1 同时使用AppWizard和ClassWizard 49
4.4 映射模式 51
4.4.1 MM_TEXT映射模式 52
4.4.2 “固定比例”映射模式 53
4.4.3 “可变比例”映射模式 53
4.4.4 坐标变换 54
4.4.5 EX04B示例程序——转换到MM_HIMETRIC映射模式 56
4.5 滚动视窗 57
4.5.1 窗口比人们所见到的要大 57
4.5.2 滚动条 58
4.5.3 滚动方式的选择 58
4.5.4 OnInitialUpdate函数 58
4.5.5 接收键盘输入 58
4.5.6 EX04C滚动示例程序 59
4.6 其他Windows消息 62
4.6.1 WM_CREATE消息 62
4.6.2 WM_CLOSE消息 63
4.6.3 WM_QUERYENDSESSION消息 63
4.6.4 WM_DESTROY消息 63
4.6.5 WM_NCDESTROY消息 63
第五章 图形设备接口(GDI)、颜色及字体 64
5.1 设备环境类 64
5.1.1 显示设备环境类CClientDC和CWindowDC 65
5.1.2 构造和析构CDC对象 65
5.1.3 设备环境的状态 66
5.1.4 CPaint DC类 66
5.2 GDI对象 67
5.2.1 GDI对象的构造与析构 67
5.2.2 跟踪GDI对象 67
5.2.3 库存的GDI对象 68
5.2.4 GDI选择的有效期 69
5.3 Windows的颜色映射 70
5.3.1 标准视频图形阵列(VGA)显示卡 70
5.3.2 256色显示卡 71
5.3.3 16位颜色显示卡 71
5.3.4 24位颜色显示卡 72
5.4 字体 72
5.4.1 字体是GDI对象 72
5.4.2 选择字体 72
5.4.3 打印字体 73
5.4.4 显示字体 73
5.4.5 显示器的逻辑英寸和物理英寸 73
5.4.6 计算字符高度 74
5.5 EX05A示例程序 75
5.5.1 EX05A程序的组成元素 78
5.6 EX05B程序 79
5.6.1 EX05B程序的组成元素 82
5.7 EX05C示例程序——再次使用CScrollView 82
5.7.1 EX05C程序的组成元素 86
5.7.2 CScrollView的SetScaleToFitSize模式 87
5.7.3 在滚动视图中使用逻辑twips映射模式 88
第六章 模式对话框和Windows通用控件 89
6.1 模式和无模式对话框 89
6.2 资源和控件 90
6.3 模式对话框的编程 90
6.4 包罗万象的对话框——EX06A示例程序 91
6.4.1 创建对话框资源 92
6.4.2 ClassWizard和对话框类 99
6.4.3 将对话框与视图相连接 102
6.4.4 深入理解EX06A应用程序 104
6.5 对话框程序的改进 105
6.5.1 获得OnOK退出控制 106
6.5.2 OnCancel处理 107
6.5.3 和滚动条控件挂上钩 107
6.6 控件的标识:CWnd指针和控件ID 109
6.7 设置对话框的背景色和其中控件的颜色 109
6.8 在对话框窗口内绘图 111
6.9 在运行时加入对话框控件 111
6.10 利用其他的控件特性 112
6.11 Windows通用控件 112
6.11.1 进度指示器控件 113
6.11.2 滑杆条(Trackbar)控件 113
6.11.3 微调按钮控件 114
6.11.4 列表控件 114
6.11.5 树状控件 114
6.11.6 WM_NOTIFY消息 115
6.12 EX06B示例程序 115
6.13 其他Windows通用控件 125
第七章 无模式对话框和Windows通用对话框类 126
7.1 无模式对话框 126
7.1.1 创建无模式对话框 126
7.1.2 用户定义的消息 127
7.1.3 对话框的归属 127
7.1.4 无模式对话框的例子——EX07A 127
7.2 CFormView类——另外一种可供选择的无模式对话框 134
7.3 Windows通用对话框 134
7.3.1 直接使用CFileDialog类 134
7.3.2 从通用对话框类进行派生 135
7.3.3 嵌套对话框 135
7.3.4 使用CFileDialog的一个例子——EX07B 135
7.3.5 CFileDialog的其他可定制特性 141
第八章 使用ActiveX控件 142
8.1 ActiveX控件和普通的Windows控件 142
8.1.1 普通的Windows控件——参考体系 142
8.1.2 ActiveX控件与普通控件的相同点 143
8.1.3 ActiveX控件与普通控件的不同点——属性和方法 143
8.2 安装ActiveX控件 144
8.3 日历控件 145
8.4 ActiveX控件包容器编程 147
8.4.1 属性访问 147
8.4.2 ClassWizard为ActiveX控件产生的C++类 148
8.4.3 AppWizard对ActiveX控件的支持 150
8.4.4 ClassWizard和包容器对话框 150
8.4.5 对话框类数据成员和控件类的用法 150
8.4.6 映射ActiveX控件事件 151
8.4.7 把ActiveX控件锁定在内存里 152
8.5 EX08A示例程序——ActiveX控件对话框包容器 152
8.6 ActiveX控件在HTML文件中的使用 160
8.7 在运行时创建ActiveX控件 160
8.8 EX08B示例程序——Web浏览器ActiveX控件 161
8.9 EX08C示例程序——一个完整的双窗口浏览器 165
8.10 图形属性 165
8.11 约束属性——改变通知 166
8.12 其他的ActiveX控件 167
第九章 Win32内存管理 168
9.1 进程和内存空间 168
9.1.1 Windows 95进程地址空间 170
9.1.2 Windows NT进程地址空间 170
9.2 虚拟内存如何工作 170
9.3 VirtualAlloc函数——占用和保留内存 173
9.4 Windows堆和GlobalAlloc函数族 173
9.5 小内存堆,C++的new和delete操作符,_heapmin 174
9.6 内存映射文件 175
9.7 访问资源 176
9.8 管理动态内存的一些提示 177
9.9 常量数据的优化存储 177
第十章 位图 179
10.1 GDI位图和与设备无关的位图 179
10.2 彩色位图和单色位图 180
10.3 使用GDI位图 180
10.3.1 从资源中装入GDI位图 180
10.3.2 显示映射模式的作用 181
10.3.3 对位进行伸缩处理 182
10.3.4 EX10A示例程序 182
10.4 利用位图改进屏幕显示 185
10.4.1 EX10B示例程序 185
10.4.2 Windows动画 189
10.5 DIB和CDib类 190
10.5.1 关于调色板编程的术语 190
10.5.2 DIB、象素和颜色表 191
10.5.3 BMP文件中DIB的结构 192
10.5.4 DIB访问函数 193
10.5.5 CDib类 193
10.5.6 DIB显示性能 198
10.5.7 EX10C示例程序 199
10.6 进一步使用DIB 202
10.6.1 LoadImage函数 202
10.6.2 DrawDibDraw函数 203
10.7 在按钮上设置位图 204
10.7.1 EX10D示例程序 205
10.7.2 进一步使用位图按钮 208
第十一章 Windows消息处理和多线程编程 209
11.1 Windows消息处理 209
11.1.1 单线程程序处理消息的过程 209
11.1.2 交出控制 210
11.1.3 计时器 210
11.1.4 EX11A示例程序 211
11.2 空状态处理 214
11.3 多线程编程 215
11.3.1 编写辅助线程函数和启动线程 215
11.3.2 主线程如何和辅助线程通话 216
11.3.3 辅助线程如何和主线程通话 217
11.3.4 EX11B示例程序 217
11.3.5 用事件使线程同步 219
11.3.6 EX11C示例程序 219
11.3.7 线程阻塞 221
11.3.8 排斥区 222
11.3.9 互斥体(mutex)和信号(semaphore) 223
11.3.10 用户界面线程(UI线程) 224
第三部分 文档-视图结构 227
第十二章 菜单、键盘加速键、复文本编辑控件和属性表 227
12.1 主框架窗口和文档类 227
12.2 Windows的菜单 228
12.3 键盘加速键 229
12.4 命令处理 229
12.4.1 派生类中的命令消息控制 230
12.4.2 更新命令用户界面消息控制函数 231
12.4.3 对话框发送的命令 231
12.5 应用程序框架的内含菜单项 232
12.6 菜单项的允许/禁用 232
12.7 MFC文本编辑选择 233
12.7.1 CEditView类 233
12.7.2 CRichEditView类 233
12.7.3 CRichEditCtrl类 233
12.8 EX12A示例程序 234
12.9 属性表 239
12.9.1 创建属性表 239
12.9.2 属性表数据交换 239
12.10 改进EX12A示例程序 240
12.11 Apply按钮的处理过程 254
12.12 CMenu类 254
12.13 创建浮动的弹出式菜单 255
12.14 扩展命令处理 256
第十三章 工具栏和状态栏 258
13.1 控制栏和应用程序框架 258
13.2 工具栏 259
13.2.1 工具栏位图 259
13.2.2 按钮的状态 259
13.2.3 工具栏和命令消息 260
13.2.4 工具栏更新命令UI消息控制函数 261
13.3 工具提示 261
13.4 寻找主框架窗口 261
13.5 EX13A工具栏示例程序 262
13.6 状态栏 267
13.6.1 状态栏的定义 267
13.6.2 信息行 268
13.6.3 状态指示器 268
13.6.4 获得对状态栏的控制 268
13.7 EX13B状态栏示例程序 269
第十四章 可重用框架窗口基类 275
14.1 为什么可重用基类难以设计 275
14.2 CPersistentFrame类 276
14.3 CFrameWnd类和ActivateFrame成员函数 276
14.4 PreCreateWindow成员函数 277
14.5 Windows注册表 278
14.6 使用CString类 280
14.7 最大化窗口的位置 281
14.8 控制栏状态和注册表 282
14.9 静态数据成员 282
14.10 默认窗口矩形 282
14.11 EX14A示例程序 283
14.12 MDI应用程序中的持续框架 289
第十五章 文档与视图的分离 291
15.1 文档-视图之间的相互作用函数 291
15.1.1 CView::GetDocument函数 291
15.1.2 CDocumeat::Update AllViews函数 292
15.1.3 CView::OnUpdate函数 293
15.1.4 CView::OnInitialUpdate函数 293
15.1.5 CDocument::OnNewDocument函数 293
15.2 最简单的文档-视图应用程序 294
15.3 CFormView类 294
15.4 CObject类 295
15.5 诊断信息转储 296
15.5.1 TRACE宏 296
15.5.2 afxDump对象 296
15.5.3 信息转储环境及CObject类 297
15.5.4 未被删除对象的自动信息转储 298
15.6 EX15A示例程序 300
15.7 更加高级的文档-视图之间的相互作用 307
15.8 CDocument::DeleteContents函数 308
15.9 CObList集合类 308
15.9.1 对先入先出列表使用CObList类 309
15.9.2 在CObList中进行迭代——POSITION变量 310
15.9.3 CTypedPtrList模板集合类 311
15.9.4 信息转储环境及集合类 312
15.10 EX15B示例程序 313
15.10.1 资源要求 314
15.10.2 代码要求 315
15.10.3 CStudentDoc 316
15.10.4 CStudentView 320
15.10.5 测试EX15B应用程序 330
15.11 留给读者的两个练习 330
第十六章 读和写文档——SDI应用程序 331
16.1 什么是序列化 331
16.1.1 磁盘文件和归档(Archives) 332
16.1.2 使类可序列化 332
16.1.3 编写Serialize函数 333
16.1.4 从归档中载入——内嵌对象和指针 334
16.1.5 使集合序列化 335
16.1.6 Serialize函数和应用程序框架 336
16.2 SDI应用程序 336
16.2.1 Windows应用程序对象 336
16.2.2 文档模板类 337
16.2.3 文档模板资源 339
16.2.4 SDI文档的多视图 339
16.2.5 创建空文档——CWinApp::OnFileNew函数 339
16.2.6 文档类的OnNewDocument函数 340
16.2.7 连接File Open与序列化代码——OnFileOpen函数 340
16.2.8 文档类的DeleteContents函数 341
16.2.9 将File Save和File Save As与序列化代码相连接 341
16.2.10 文档的“脏”标志 342
16.3 EX16A——序列化SDI示例程序 342
16.3.1 CStudent 343
16.3.2 CEx16aApp 343
16.3.3 CFrameWnd 348
16.3.4 CStudentDoc 352
16.3.5 CStudentView 353
16.3.6 测试EX16A应用程序 353
16.4 从Explorer启动及拖放 354
16.4.1 程序注册 354
16.4.2 在文档上双击鼠标 355
16.4.3 允许拖放 355
16.4.4 程序启动参数 356
16.4.5 试验用Explorer启动程序及拖放功能 356
第十七章 读和写文档——MDI应用程序 357
17.1 MDI应用程序 357
17.1.1 一个典型的具有MFC库风格的MDI应用程序 357
17.1.2 MDI应用程序对象 360
17.1.3 MDI文档模板类 360
17.1.4 MDI框架窗口和MDI子窗口 360
17.1.5 主框架和文档模板资源 361
17.1.6 创建空文档——CWinApp::OnFileNew函数 362
17.1.7 为现有文档创建新的视图 362
17.1.8 载入和存储文档 363
17.1.9 多文档模板 363
17.1.10 Explorer启动及拖放 364
17.2 EX17A示例程序 364
17.2.1 CEx17aApp 365
17.2.2 CMainFrame 370
17.2.3 CChildFrame 373
17.2.4 测试EX17A应用程序 376
第十八章 打印和打印预览 377
18.1 Windows的打印 377
18.1.1 标准打印对话框 377
18.1.2 交互选择打印页码 377
18.1.3 显示页和打印页 379
18.2 打印预览 379
18.3 有关打印机的程序设计 380
18.3.1 打印机设备环境和CView::OnDraw函数 380
18.3.2 CView::OnPrint函数 380
18.3.3 准备设备环境——CView::OnPrepareDC函数 380
18.3.4 打印任务的开始和结束 381
18.4 EX18A示例程序——一个所见即所得的打印程序 381
18.5 读取打印机矩形框 388
18.6 再看模板集合类——CArray类 388
18.7 EX18B示例程序——多页打印程序 389
第十九章 切分窗口和多视图 395
19.1 切分窗口 395
19.2 多视图选择 395
19.3 动态和静态切分窗口 396
19.4 EX19A示例程序——具有单个视图类的SDI动态切分 396
19.4.1 与切分有关的资源 397
19.4.2 CMainFrame 397
19.4.3 测试EX19A应用程序 398
19.5 EX19B示例程序——双视图类SDI静态切分 399
19.5.1 CHexView 399
19.5.2 CMainFrame 400
19.5.3 测试EX19B应用程序 400
19.6 EX19C示例程序——切换没有切分的视图类 401
19.6.1 资源要求 401
19.6.2 CMainFrame 401
19.6.3 测试EX19C应用程序 403
19.7 EX19D示例程序——多视图类MDI应用程序 403
19.7.1 资源要求 404
19.7.2 CEx19dApp 404
19.7.3 CMainFrame 405
19.7.4 测试EX19D应用程序 406
第二十章 上下文相关帮助 407
20.1 Windows的WinHelp程序 407
20.1.1 复文本格式(RTF) 407
20.1.2 编写简单的帮助文件 408
20.1.3 改进的Table Of Contents 412
20.2 应用程序框架与WinHelp 413
20.2.1 调用WinHelp 414
20.2.2 使用搜索字符串 414
20.2.3 从应用程序的菜单调用WinHHelp 415
20.2.4 帮助上下文别名 415
20.2.5 确定帮助上下文 415
20.2.6 F1帮助 416
20.2.7 Shift-F1帮助 416
20.2.8 消息框帮助——AfxMessageBox函数 417
20.2.9 一般的帮助 417
20.3 帮助示例——不需要任何编程 418
20.4 MAKEHELP处理 420
20.5 帮助命令处理 420
20.5.1 F1处理过程 421
20.5.2 Shift-F1处理过程 421
20.6 帮助命令处理示例程序——EX20B 422
20.6.1 头文件要求 422
20.6.2 CStringView 422
20.6.3 CHexView 423
20.6.4 资源要求 424
20.6.5 帮助文件要求 424
20.6.6 测试EX20B应用程序 425
第二十一章 动态连接库 426
21.1 基本DLL理论 426
21.1.1 导入如何与导出相匹配 427
21.1.2 隐式连接和显式连接 427
21.1.3 符号连接和序号连接 428
21.1.4 DLL入口点——DllMain 429
21.1.5 实例句柄——装载资源 429
21.1.6 客户程序如何找到DLL 430
21.1.7 调试DLL 430
21.2 MFC DLL——扩展的和正规的 430
21.2.1 共享的MFC DLL和Windows DLL 431
21.2.2 MFC扩展DLL——导出类 432
21.2.3 MFC扩展DLL资源搜索的顺序 432
21.2.4 EX21A示例程序——MFC扩展DLL 433
21.2.5 EX21B示例程序——DLL测试客户程序 435
21.2.6 MFC正规DLL——CWinApp派生类 436
21.2.7 使用AFX_MANAGE_STATE宏 436
21.2.8 MFC正规DLL资源搜索顺序 436
21.2.9 EX21C示例程序——MFC正规DLL 437
21.2.10 修改EX21B示例程序——加入代码以测试ex21c.dll 438
21.3 自定义控件DLL 440
21.3.1 什么是自定义控件 440
21.3.2 自定义控件的窗口类 440
21.3.3 MFC库和WndProc函数 441
21.3.4 自定义控件通知消息 441
21.3.5 发送给控件的用户定义消息 442
21.3.6 EX21D示例程序——自定义控件 442
21.3.7 再修改EX21B示例程序——加入代码以测试ex21d.dll 448
第二十二章 不带文档或视图类的MFC程序 452
22.1 EX22A示例程序——一个基于对话框的应用程序 452
22.1.1 应用程序类InitInstance函数 454
22.1.2 对话框类和程序图标 455
22.2 EX22B示例——一个SDI应用程序 456
22.2.1 应用程序类InitInstance函数 457
22.2.2 CMainFrame类 458
22.3 EX22C示例程序——一个MDI应用程序 458
22.3.1 应用类程序InitInstance函数 459
22.3.2 CMainFrame类 460
22.3.3 CChildFrame类 462
22.3.4 资源要求 462
22.4 定制(Custom)AppWizard 463
第四部分 ActiveX:组件对象模型、自动化和OLE第二十三章 组件对象模型 467
23.1 ActiveX技术背景 467
23.2 组件对象模型(COM) 468
23.2.1 COM所解决的问题 468
23.2.2 COM的本质 468
23.2.3 什么是COM接口 469
23.2.4 IUnknown接口和QueryInterface成员函数 473
23.2.5 引用计数:AddRef和Release函数 475
23.2.6 类厂(class factory) 476
23.2.7 CCmdTarget类 477
23.2.8 EX23A示例程序——一个模拟的COM 478
23.3 MFC库中实际的COM 486
23.3.1 COM的CoGetClassObject函数 486
23.3.2 COM和Windows注册表 487
23.3.3 运行时对象注册 488
23.3.4 COM客户程序如何调用进程内组件 489
23.3.5 COM客户程序如何调用进程外组件 491
23.3.6 MFC接口宏 493
23.3.7 MFC的COleObjectFactory类 494
23.3.8 AppWizard/ClassWizard对COM进程内组件的支持 494
23.3.9 MFC COM客户程序 496
23.3.10 EX23B示例程序——MFC COM进程内组件 496
23.3.11 EX23C示例程序——MFC COM客户 501
23.4 包容、集合和继承 502
第二十四章 自动化 504
24.1 C++与Visual Basic for Applications(VBA)之间的连接 504
24.2 自动化客户和自动化组件 505
24.3 Microsoft Excel——一种比Visual Basic还好的Visual Basic 505
24.4 属性(property)、方法(method)和集合(collection) 507
24.5 自动化所解决的问题 508
24.6 IDispatch接口 508
24.7 自动化程序设计的选择 509
24.8 MFC IDispatch的实现 510
24.9 一个MFC自动化组件 511
24.10 一个MFC自动化客户程序 512
24.11 使用编译器#import指令的自动化客户程序 514
24.12 VARIANT类型 515
24.13 COleVariant类 517
24.14 Invoke的参数和返回值的类型转换 519
24.15 自动化示例 521
24.15.1 EX24A自动化组件EXE示例——不带任何用户界面 521
24.15.2 EX24B自动化组件DLL示例程序 529
24.15.3 EX24C SDI自动化组件EXE示例——带用户界面 538
24.15.4 EX24D自动化客户示例程序 544
24.15.5 EX24E自动化客户示例程序 559
24.16 VBA早绑定 562
24.16.1 注册类型库 563
24.16.2 组件如何注册自己的类型库 564
24.16.3 ODL文件 564
24.16.4 Excel如何使用类型库 565
24.16.5 为什么使用早绑定 567
24.16.6 客户-组件的快速连接 567
第二十五章 统一数据传输——剪贴板传输以及OLE拖放 568
25.1 IDataObject接口 568
25.2 IDataObject如何增强标准剪贴板的支持 568
25.3 FORMATETC和STGMEDIUM结构 569
25.3.1 FORMATETC 569
25.3.2 STGMEDIUM 570
25.3.3 IDataObject接口成员函数 570
25.4 MFC统一数据传输支持 571
25.4.1 COleDataSource类 572
25.4.2 COleDataObject类 573
25.4.3 MFC数据对象剪贴板传输 574
25.5 MFC CRectTracker类 576
25.5.1 CRectTracker类成员函数 576
25.5.2 CRectTracker类矩形坐标转换 577
25.6 EX25A示例程序——数据对象剪贴板 577
25.6.1 CMainFrame类 578
25.6.2 CEx25aDoc类 578
25.6.3 CEx25aView类 578
25.7 MFC拖放 587
25.7.1 传输的源方 587
25.7.2 传输的目标方 587
25.7.3 拖放的顺序 588
25.8 EX25B示例程序——OLE拖放 589
25.8.1 CEx25bDoc类 589
25.8.2 CEx25bView类 589
25.9 Windows应用程序和拖放——Dobjview 592
第二十六章 结构化存储 593
26.1 复合文件 593
26.2 存储(Storage)和IStorage接口 594
26.2.1 获取IStorage指针 596
26.2.2 释放STATSTG内存 596
26.2.3 对存储对象的元素进行枚举 596
26.2.4 进程间共享存储 597
26.3 流(Stream)和IStream接口 597
26.3.1 IStream接口成员函数 597
26.3.2 IStream编程 598
26.4 ILockBytes接口 599
26.5 EX26A示例程序——结构化存储 599
26.5.1 菜单 600
26.5.2 CEx26aView类 600
26.5.3 辅助线程 600
26.6 结构化存储和持久COM对象 604
26.6.1 IPersistStorage接口 605
26.6.2 IPersistStream接口 606
26.6.3 IPersistStream编程 606
26.7 EX26B示例程序——一个持久DLL组件 607
26.8 EX26C示例程序——一个持久存储客户程序 613
26.9 复合文件碎片的处理 617
26.10 复合文件的其他优点 618
第二十七章 OLE嵌入组件和包容器 619
27.1 嵌入和实地激活(可视编辑) 619
27.2 最小服务器和完备服务器(组件)——链接 620
27.3 可视编辑前景暗淡的一面 620
27.4 Windows图元文件和内嵌对象 621
27.5 组件程序的MFC OLE结构 622
27.6 EX27A示例程序——MFC实地激活最小服务器 623
27.6.1 MDI嵌入组件 627
27.6.2 实地组件调整大小的思路 628
27.7 包容器-组件相互作用 628
27.7.1 使用组件的IOleObject接口 629
27.7.2 装入和保存组件自身的数据——组件文档 630
27.7.3 剪贴板数据传输 630
27.7.4 获得组件的图元文件 630
27.7.5 进程内控制器的角色 631
27.8 组件状态 632
27.8.1 包容器接口 632
27.8.2 通报连接 633
27.8.3 剪贴板图元文件 634
27.9 接口简要说明 634
27.9.1 IOleObject接口 634
27.9.2 IViewObject2接口 635
27.9.3 IOleClientSite接口 635
27.9.4 IAdviseSink接口 636
27.10 OLE辅助函数 636
27.11 OLE嵌入包容器应用程序 637
27.11.1 MFC对OLE包容器的支持 637
27.11.2 一些包容器限制 638
27.11.3 包容器特性 638
27.12 EX27B示例程序——嵌入包容器 638
27.12.1 CEx27bView类 639
27.12.2 CEx27bDoc类 652
27.13 EX27C示例程序——OLE嵌入组件 660
27.13.1 CEx27cView类 661
27.13.2 CEx27cDoc类 661
第五部分 数据库管理 671
第二十八章 Microsoft ODBC数据库管理 671
28.1 数据库管理的优势 671
28.2 结构化查询语言 672
28.3 ODBC标准 673
28.3.1 ODBC结构 673
28.3.2 ODBC SDK编程 674
28.4 MFC ODBC类——CRecordset和CDatabase 675
28.4.1 记录集中关于行的计数 677
28.4.2 处理ODBC异常 677
28.5 学生注册数据库 678
28.6 EX28A记录集示例程序 678
28.7 EX28A示例程序中的元素 684
28.7.1 记录集类与应用程序之间的连接 684
28.7.2 CEx28aView类的OnInitialUpdate成员函数 684
28.7.3 CEx28aView类的OnDraw成员函数 685
28.8 筛选器和排序字符串 686
28.9 连接两个数据库表 686
28.10 MFC CRecordView类 687
28.11 EX28B记录查看示例程序 688
28.12 多记录集 693
28.12.1 EX28C多记录集示例程序 694
28.12.2 参数化查询 695
28.13 ODBC多线程 696
28.14 大批行数据获取(bulk row fetch) 696
28.15 使用不带绑定的记录集 696
第二十九章 Microsoft Data Access Objects数据库管理 699
29.1 DAO、COM和Microsoft Jet数据库引擎 699
29.2 DAO和VBA 699
29.3 DAO和MFC 700
29.4 利用DAO可以打开什么样的数据库 701
29.5 按ODBC模式使用DAO——快照和动态集 701
29.6 DAO表类型记录集 702
29.7 DAO QueryDef和TableDef 703
29.8 DAO多线程情况 703
29.9 在滚动窗口中显示数据库的行 703
29.9.1 滚动显示方法 703
29.9.2 一个行-视图类 704
29.9.3 基类和派生类的分工处理 705
29.9.4 CRowView的纯虚成员函数 706
29.9.5 其他的CRowView函数 706
29.10 动态记录集的编程 707
29.11 EX29A示例程序 708
29.11.1 CEx29aApp 709
29.11.2 CMainFrame和CChildFrame 709
29.11.3 CEx29aDoc 709
29.11.4 CEx29aView 716
29.11.5 CTableSelect 719
29.11.6 CIsamSelect 720
29.12 EX29A资源文件 721
29.13 运行EX29A程序 722
第六部分 Internet程序设计 725
第三十章 TCP/IP、Winsock和WinInet 725
30.1 既针对COM也可以不需要COM 725
30.2 Internet基础 725
30.2.1 网络协议——层 726
30.2.2 Internet协议 726
30.2.3 用户报文协议 727
30.2.4 IP地址格式——网络字节顺序 728
30.2.5 传输控制协议 729
30.2.6 域名系统(Domain Name System) 730
30.2.7 HTTP基础 732
30.2.8 FTP基础 734
30.2.9 Internet和Intranet 734
30.3 建立自己的价值$99的Intranet 734
30.3.1 NT文件系统和文件分配表 735
30.3.2 网络硬件 735
30.3.3 对Windows进行网络配置 735
30.3.4 Intranet的主机名——HOSTS文件 736
30.3.5 测试Intranet——Ping程序 736
30.3.6 只有一台计算机的Intranet——TCP/IP环形地址 736
30.4 Winsock 737
30.4.1 同步和异步Winsock编程 737
30.4.2 MFC Winsock类 737
30.4.3 Blocking Socket类 737
30.4.4 一个简化了的HTTP服务器程序 745
30.4.5 一个简化了的HTTP客户端程序 747
30.5 用CHttpBlockingSocket创建一个Web服务器程序 749
30.5.1 EX30A服务器限制 749
30.5.2 EX30A服务器结构 749
30.5.3 使用Win32 TransmitFile函数 750
30.5.4 编译和测试EX30A 751
30.5.5 使用Telnet 752
30.6 用CHttpBlockingSocket创建一个Web客户端程序 752
30.6.1 EX30A Winsock客户 752
30.6.2 EX30A对代理服务器的支持 753
30.6.3 测试EX30A Winsock客户 753
30.7 WinInet 753
30.7.1 WinInet相对于Winsock的优势 754
30.7.2 MFC WinInet类 754
30.7.3 Internet会话状态回调 756
30.7.4 一个简化了的WinInet客户程序 757
30.8 用MFC WinInet类创建一个Web客户 758
30.8.1 EX30A WinInet Client #1——使用CHttpConnection 758
30.8.2 测试WinInet Client #1 758
30.8.3 EX30A WinInet Client #2——使用OpenURL 759
30.8.4 测试WinInet Client #2 760
30.9 异步Moniker文件 760
30.9.1 Moniker 760
30.9.2 MFC CAsyncMonikerFile类 760
30.9.3 在程序中使用CAsyncMonikerFile类 760
30.9.4 异步moniker文件和WinInet编程 761
第三十一章 Microsoft Internet Information Server编程 763
31.1 IIS的替代产品 763
31.2 Microsoft IIS 763
31.2.1 安装和控制IIS 763
31.2.2 运行Internet Service Manager 764
31.2.3 IIS的安全性 764
31.2.4 IIS目录 765
31.2.5 IIS日志记录 766
31.2.6 测试IIS 766
31.3 ISAPI服务器扩展 767
31.3.1 通用网关接口和ISAPI 767
31.3.2 一个简单的ISAPI服务器扩展GET请求 767
31.3.3 HTML窗体——GET和POST 768
31.3.4 编写ISAPI服务器扩展DLL 769
31.3.5 MFC ISAPI服务器扩展类 770
31.4 一个实际的ISAPI服务器扩展——ex31a.dll 771
31.4.1 第一步——获取定单 772
31.4.2 第二步——处理确认窗体 775
31.4.3 编译并测试ex31a.dll 776
31.4.4 调试EX31A DLL 776
31.5 ISAPI数据库访问 777
31.6 使用HTTP Cookie来连接事务 778
31.6.1 Cookie如何工作 778
31.6.2 ISAPI服务器扩展如何处理Cookie 779
31.6.3 使用Cookie的一些问题 779
31.7 WWW鉴定 779
31.7.1 基本鉴定 779
31.7.2 Windows NT问讯/应答鉴定 780
31.7.3 安全套接字层(SSL) 780
31.8 ISAPI过滤器 781
31.8.1 编写ISAPI过滤器DLL 781
31.8.2 MFC ISAPI过滤器类 781
31.9 ISAPI过滤器示例——ex31b.dll、ex31c.exe 782
31.9.1 选择通知 783
31.9.2 把事务数据发送到显示程序 783
31.9.3 显示程序 785
31.9.4 编译并测试EX31B ISAPI过滤器 785
第三十二章 ActiveX文档服务器和Internet 787
32.1 ActiveX文档理论 787
32.1.1 ActiveX文档服务器和OLE嵌入服务器 787
32.1.2 从IE3中运行ActiveX文档服务器 788
32.1.3 ActiveX文档服务器和ActiveX控件 789
32.1.4 ActiveX文档服务器和包容器的OLE接口 790
32.1.5 MFC对ActiveX文档服务器的支持 790
32.2 ActiveX文档服务器示例程序EX32A 791
32.2.1 EX32A第一阶段——简单的服务器 792
32.2.2 调试ActiveX文档服务器 792
32.2.3 EX32A第二阶段——加入WinInet调用 792
32.3 ActiveX文档服务器示例程序EX32B 794
32.3.1 在程序控制下产生POST请求 799
32.3.2 EX32B视图类 800
32.3.3 编译并测试EX32B 802
32.3.4 ActiveX文档服务器和VB Script 802
32.4 进一步使用ActiveX文档服务器 803
附录A Microsoft基本类(MFC)库中的消息映射函数 804
附录B MFC库运行时类识型和动态对象创建 810