第一部分 C++和MFC 2
第1章 起步 2
目录 2
1.1 句柄和消息技术内幕 3
1.2 C++精髓 4
1.3 Visual C++IDE和工作区 8
1.4 MFC基础 9
1.5 基于对话框的应用程序 10
1.6 SDI和MDI应用程序 11
1.7 数据查看器 12
1.8.1 引言 20
1.8.2 何谓线程 20
1.8 什么是线程 20
1.8.3 为什么要使用多线程 22
1.8.4 更复杂的情况 22
第2章 数组和集合 24
2.1 从变体型安全数组设置和获取值的函数 25
2.2 遍历表容器 26
2.3 可排序CObArray类 28
2.4 可排序CObList类 32
第3章 文档和视图 37
3.1 体验MFC:创建一个MFC应用程序 38
3.1.1 隐藏代码 38
3.1.2 一个简单的MFC应用程序 38
3.1.3 单文档界面应用程序 40
3.2 使用更理想跟踪来理解文档/视图结构 41
3.1.4 结论 41
3.2.1 目的 42
3.2.2 运行演示程序 42
3.2.3 在程序中使用CIndentedTrace 43
3.2.4 CIndentedTrace的工作方式 45
3.2.5 供更高级用户参考 46
3.3 分割框之上的命令传递 48
3.4 在文档-视图应用程序中替换视图 49
第二部分 Visual Studio 55
第4章 调试 55
4.1.2 使用调试窗口 56
4.1.4 阅读,阅读,再阅读 56
4.1.3 使用所有可用资源 56
4.1.1 以简单、“傻瓜”化方式亲密接触 56
4.1 一些常规调试技巧 56
4.2 为什么我的项目在发行模式下不工作 57
4.2.1 预处理器的差异 57
4.2.2 变量初始化差异 57
4.2.3 是否忽略了编译器警告 58
4.2.4 是否删除了任何资源 58
4.2.5 在发行模式中调试 58
4.2.6 补充 58
4.3 扩展Visual Studio 6.0调试器——利用未正式入档的功能 59
第5章 插件和宏 63
5.1 WM_COMMAND用户消息宏 64
5.2 插件Project Line Counter(v1.11) 67
5.2.4 新版本的更新 68
5.2.3 源代码 68
5.2.1 描述 68
5.2.2 特征 68
5.3 文件对话框宏 69
5.3.1 FileDialogHandler 69
5.3.2 对WriteLn的注释 73
5.4 注释/取消注释与其他宏 73
第三部分 Windows编程 80
第6章 Windows CE 80
6.1 CCeButtonST v1.2 81
6.1.1 摘要 81
6.1.2 如何在应用程序中集成CCeButtonST 82
6.1.3 类方法 83
6.1.5 补充 90
6.1.4 评论 90
6.2 CCeFileFind——Windows CE的文件查找类 92
6.3 检测WindowsCE中的内存泄漏 93
6.3.1 引言 93
6.3.2 调试技巧 93
6.3.3 工作方式 94
6.3.4 补充 94
第7章 剪贴板 96
7.1 基本复制/粘贴和拖/放支持 97
7.1.1 综述 97
7.1.2 在剪贴板上放置数据 97
7.1.3 串行化到剪贴板 97
7.1.4 从剪贴板读取数据 98
7.1.5 从剪贴板串行化 99
7.1.6 拖/放支持 100
7.1.7 维护的问题 102
7.1.8 补充 102
7.2 高级复制/粘贴和拖/放支持 102
7.2.1 引言 102
7.2.2 在剪贴板上放置多种格式 103
7.2.3 延迟实施 105
7.2.4 常见剪贴板格式 107
7.2.5 剪贴板优先顺序 110
第8章 动态链接库(.DLL) 111
8.1 MFC.DLL向导(一) 112
8.1.1 不同.DLL类型 112
8.1.2 构建.DLL 113
8.1.3 在客户应用程序中使用.DLL 115
8.1.4 警告 117
8.2 MFC.DLL向导(二) 117
8.2.1 MFC问题 117
8.2.2 编译器不兼容性问题 117
8.2.3 重新编译 118
8.2.4 解决方案 118
8.2.5 结论 121
8.3 MFC.DLL向导(三) 121
8.3.1 从.DLL中导出资源 121
8.3.2 建立客户应用程序 122
8.3.3 导出基于CDialog的类 123
第9章 文件和文件夹 125
9.1 GetFolder:Shell扩展文件夹浏览器函数 126
9.1.1 综述 126
9.1.2 代码 126
9.1.3 补充 127
9.2 SHFILEOPSTRUCT和SHFileOperation 129
9.2.1 引言 129
9.2.2 解决名字冲突与hNameMappings成员 129
9.2.3 获取文件名 130
9.2.4 示例代码 130
9.3 优化SHGetFileInfo获得最优性能 131
第10章 打印 133
10.1 生成WYSIWYG文本输出 134
10.2 改进打印预览工具栏 137
第11章 系统 140
11.1 进程和模块枚举类 141
11.2 从HWND获取模块(exe)文件名 141
11.3 NotQuiteNullDacl类 143
11.3.1 缺省的安全性并不总是完全令人满意 143
11.3.2 Null Dacl解决方案 144
11.3.3 求助于NotQuiteNullDacl 145
11.3.4 使用NotQuiteNullDacl类 146
11.3.5 一些副作用 148
11.3.6 参考文献 148
11.4 共享内存进程间通信(IPC) 148
第四部分 控件 165
第12章 Button控件 165
12.1.2 小结 166
12.1 从CStatic派生的平面按钮类 166
12.1.1 描述 166
12.2 标题栏界面 167
12.3 CXPStyleButtonST v1.0 171
12.3.1 摘要 171
12.3.2 如何在应用程序中集成CXPStyleButtonST 172
12.3.3 静态创建CSPStyleButtonST对象 172
12.3.4 动态创建CXPStyleButtonST对象 173
12.3.5 类方法 173
12.3.6 评论 174
12.3.7 致谢 174
12.4 CCharSetBtn控件 174
第13章 ComboBox控件 176
13.1.2 如何使用 177
13.1 包含选项历史的CComboBoxEx 177
13.1.1 摘要 177
13.1.3 函数 178
13.2 包含选项工具提示的ComboBox 179
13.3 具有树形下拉框的ComboBox 181
13.3.1 使用类 181
13.3.2 补充 182
13.4 CCheckComboBox:具有复选树形下拉框的ComboBox 183
第14章 Edit控件 186
14.1 自动填充编辑控件 187
14.2 综合提示文本和编辑控件的混合编辑控件 187
14.2.1 引言 187
14.2.3 使用CGreyEdit控件 188
14.2.2 显示规则 188
14.3 Masked Edit控件(3) 189
14.4 Numeric Edit和Numeric Spin控件 192
第15章 ImageList控件 194
15.1 作为32bpp位图在ImageList中载入8bpp(256色)位图 195
第16章 ListBox控件 198
16.1 双向ListBox选择管理器 199
16.2 类似Visual Studio的ListBox类 201
16.2.1 如何使用 202
16.2.2 其他改进 203
16.2.3 补充 203
第17章 ListView控件 208
17.2.1 第1步:实现类 209
17.2 使用回调排序列表(数字/文本) 209
17.1 通过编程的办法选择某一项 209
17.2.2 第2步:实际运用 213
17.2.3 补充 213
17.3 (无限制)多选项的CreateDragImage 214
17.4 可修改的属性列表控件 217
17.4.1 工作原理 218
17.4.2 如何使用 218
17.4.3 如何实现自定义属性项值类 218
17.5 如何自定义属性列表项值类 219
17.6 如果实现自定义属性项管理器类 220
17.7 改进的地方 222
第18章 菜单 227
18.1.1 版本3.0中的新变化 228
18.1 具有图标的自绘菜单(3) 228
18.1.3 安装(MDI应用程序) 229
18.1.2 引言 229
18.1.4 安装(SDI应用程序) 232
18.1.5 补充 233
第19章 对话框 236
19.1 更改编辑控件的背景色 237
19.2 可调节对话框基类 240
19.2.1 引言 240
19.2.2 用法 241
19.2.3 项目实例 241
19.3 不规则形状的位图对话框 241
19.3.1 用法 241
19.3.4 补充 243
19.3.2 技巧 243
19.3.3 工作原理 243
第20章 属性表 247
20.1 在属性页中使用ON_UPDATE_COMMAND_UI 248
第21章 状态栏 251
21.1 在状态栏显示光标位置 252
21.2 在状态栏窗格显示进度栏 253
第22章 工具栏 256
22.1 使用16M色图像的工具栏 257
22.2 全功能24位色工具栏 257
22.3 并排停靠工具栏 261
第23章 TreeView控件 264
23.1 查找项(匹配TV_ITEM的任何成员) 265
23.2 拖放改进——鼠标停留时自动展开 267
第24章 Splitter控件 270
24.1 最小化拆分器 271
24.2 能在任何窗格中切换视图的CSplitterWnd扩展 273
24.2.1 如何使用示例代码 274
24.2.2 要点 274
24.2.3 补充 275
24.3 在拆分器窗格内实现标尺 275
24.3.1 引言 276
24.3.2 代码 276
24.4.1 引言 277
24.4.2 代码 277
24.4 拆分器窗口内的工具栏 277
第25章 其他控件 280
25.1 内存查看器——包含一个针对任意文本编辑器类型的强大类 281
25.1.1 摘要 281
25.1.2 普通文本编辑器是如何工作的 281
25.1.3 CSW_EditorBase类成员 282
25.1.4 如何使用类CSW_EditorBase 283
25.2 系统映像列表 284
25.3 CMacButton、CMacCheckBox和CMacRadioButton 285
25.4 类似Macintosh的进度控件 286
25.4.1 公有成员函数 287
25.4.2 在对话框中添加CMacProgressCtrl的步骤 287
25.4.3 补充 287
第26章 位图和调色板 289
第五部分 图形和多媒体 289
26.1 在CBitmap中装载位图文件的快速方法 290
26.2 调整图像大小时如何保持长宽比例 290
26.3 透明位图:真正的屏蔽方法 292
26.3.1 代码的作用 292
26.3.2 MSDN 293
26.3.3 真正的屏蔽方法 293
26.3.4 如何使用 293
26.3.5 源代码 293
26.3.6 透明显示位图(Zafir Anjum) 294
26.3.7 直接透明blt操作 294
26.3.8 补充 295
26.4 CPicture:Yovav编写的显示图像的类 296
26.5 在MFC和ATL项目上添加GIF动画 299
第27章 DirectX 303
27.1 使用Direct3D8的基础知识 304
27.1.1 引言(#include〈windows.h〉) 304
27.1.2 关于例程 304
27.1.3 何谓Direct3D8(Direct3D8=2*(Direct3D7+DirectDraw7)) 305
27.1.4 初始化(即如何开始) 306
27.1.5 从f(x,y)=x+y+z到2D图像 308
27.1.6 光照管理(黑暗中的猫都是灰色) 310
27.1.7 材质管理(材质为什么是灰色) 311
27.1.8 结论 311
第28章 GDI 314
28.1.1 引言 315
28.1.2 检测字体大小的函数 315
28.1 检测显示字体大小 315
28.2 绘制箭头线 316
28.3 IPicture对象的流动 319
28.3.1 类 319
28.3.2 使用类 321
第29章 多媒体 323
29.1 直接从资源播放MIDI文件 324
29.1.1 引言 324
29.1.2 公有接口 324
29.1.3 可覆盖的方法 325
29.1.4 用法 325
29.1.5 补充 326
29.2 CDR.EXE——通过编程实现CD驱动器的打开/关闭 326
29.3 透明动画控件 328
29.4 简单混音器控件封装器 330
29.5 具有n道实时混音器的音频类库 332
第30章 OpenGL 335
30.1 简单OpenGL类 336
30.1.1 特征 336
30.1.2 历史 336
30.1.3 源代码 337
30.1.4 支持类 337
30.1.5 演示项目 337
30.1.6 关于作者 337
30.2 在对话框中启动OpenGL 338
30.3 启动渲染模式 340
第31章 ADO 342
第六部分 数据库 342
31.1.1 起步 343
31.1.2 _ConnectionPtr、_CommandPtr和_RecordsetPtr 343
31.1 ADO是AOK(简单ADI向导) 343
31.1.3 动态绑定与DFX 345
31.1.4 何谓_variant_t和_bstr_t 346
31.1.5 更新、插入和删除 346
31.1.6 示例代码 347
31.1.7 补充 348
31.2 ADO是AOK——第二部分 349
31.2.1 使用ATL创建泛型ADO COM对象 349
31.2.2 组件 354
31.2.3 技巧 367
31.3 使用ADOX创建数据库对象 369
31.2.4 结论 369
31.3.1 概述 370
31.3.2 步骤 370
31.3.3 补充 372
第32章 ODBC 373
32.1 交互式SQL工具(MFC) 374
第33章 存储过程 376
33.1 使用ADO执行存储过程 377
第34章 XML 381
34.1 从C++程序创建XML文件 382
34.2 使用微软XML解析器创建XML文档 383
34.2.1 MXXMLWriter组件基础知识 383
34.2.2 处理XML文档基础知识 384
34.2.3 使用MXXMLWriter创建XML文档 386
34.2.4 结论 388
第七部分 因特网与网络 392
第35章 Socket编程 392
35.1 具有新面孔的聊天室 393
35.1.1 前言 393
35.1.2 基础 393
35.1.3 使用CSocket的优点 394
35.1.4 图示和解释 394
35.1.5 如何测试程序 395
35.1.6 特征 395
35.1.8 改进建议 396
35.1.9 致谢 396
35.1.7 已知漏洞 396
35.1.10 声明 397
第36章 命名管道 399
36.1 Win32平台下命名管道封装器 400
36.1.1 背景 400
36.1.2 封装器 400
36.1.3 示例 400
36.1.4 补充 401
36.2 连接管道类 402
36.2.1 目的 403
36.2.2 主要特征 403
36.2.3 简介 403
36.2.4 客户-服务器架构 404
第37章 网络信息 406
37.1 获得本地计算机的主机名和IP地址 407
37.2 检验是否连接到因特网的函数 409
37.2.1 致谢 409
37.2.2 工作原理 409
37.2.3 函数 410
37.3 使用HTTP的PC时钟同步 411
37.3.1 引言 411
37.3.2 使用Windows API阅读WWW网站 412
37.3.3 世界时与本地时 413
37.3.4 链接 413
37.3.5 VC++源代码 413
第八部分 基于COM的技术 418
第38章 COM 418
38.1 基于MFC COM DLL的DllUnregisterServer 419
38.2 在COM中传递二进制数据 421
38.2.1 使用CBuffer Variant 422
38.2.2 补充 423
38.3 未在文档中说明的AFX函数:AfxGetClassIDFromString 424
38.3.1 综述 424
38.3.2 示例 424
38.4 使用COM通道钩子机制的COM委托 424
38.4.1 接口用法 427
38.4.2 源代码、演示程序、更新及其他 427
38.4.3 致谢 427
第39章 DCOM 430
39.1 COM安全性入门(第一部分) 431
39.1.1 激活安全性 431
39.1.3 访问安全性 432
39.1.2 COM编程技巧一 432
39.1.5 下一篇文章内容预告:介绍身份和认证 434
39.2 COM安全性入门(第二部分) 434
39.2.1 身份 434
39.1.4 COM编程技巧二 434
39.2.2 COM编程技巧三 437
39.2.3 认证 437
39.2.4 总结 439
39.3 远程实例化_com_ptr_t对象 440
39.4 RNSO——运用DCOM的远程通知者、主题和观察者服务器 442
39.4.1 何谓RNSO 442
39.4.2 RNSO的工作原理 442
39.4.4 例程 443
39.4.3 RNSO的二进制文件 443
39.4.5 为什么使用此框架 444
第40章 ActiveX 445
40.1 ActiveX控件向导 446
40.1.1 引言 446
40.1.2 创建ActiveX控件 446
40.1.3 关于作者 455
40.1.4 补充 455
40.2 ActiveX Shell注册 455
40.2.1 自动安装 456
40.2.2 手工安装 456
40.2.3 用法 457
40.3 ActiveX控件中的菜单 458
40.2.4 补充 458
40.3.1 ATL 459
40.3.2 MFC 461
第41章 ATL和WTL 463
41.1 一个查看类型库信息的ATL项目 464
41.1.1 Lib2Usr ATL组件 464
41.1.2 演示程序和更新过的源代码 464
41.2 ATLTear-Off接口 466
41.3 运用WTL进行DDX和DDV 473
41.3.1 引言 473
41.3.2 DDX/DDV的准确涵义 474
41.3.3 DDX实战 475
41.3.4 在WTL扩展DDX 478
41.3.5 缺省数据处理器 480
第42章 单元和线程 481
42.1 理解COM单元(第一部分) 482
42.1.1 单元基础知识 482
42.1.2 如何给线程分配单元 484
42.1.3 如何给进程中对象分配单元 485
42.1.4 如何给进程外对象分配单元 487
42.1.5 小结 487
42.2 理解COM单元(第二部分) 488
42.2.1 编写能正常工作的COM客户 488
42.2.2 编写能正常工作的COM服务器 490
42.2.3 小结 492
42.3 精通COM线程模型 493
索引 502