第1部分 用户界面 1
1.1 Visual Studio环境概览 2
第1章 MFC应用程序初接触 2
1.2 创建第一个Visual Studio项目 4
1.2.1 视图简介 7
1.2.2 为按钮添加事件处理程序 8
1.2.3 使用Dialog Editor和Toolbox添加控件 10
1.2.4 创建DDX变量 11
1.3 更正生成错误 13
1.4 在Visual Studio环境中调试代码 14
1.4.1 设置断点 15
1.4.2 步进执行MFC源代码 16
1.5 处理消息 18
1.6 处理子事件 22
1.8 小结 23
1.7 重载基类函数 23
2.2 文档/视图体系结构设计 24
2.1 文档、视图及其相互关系 24
第2章 了解文档、视图和单文档界面 24
2.3 CDocument类 25
2.3.1 声明文档类 26
2.3.2 CDocument类的成员函数 27
2.3.3 处理消息 28
2.3.5 复杂文档数据的处理 29
2.3.4 重载虚文档函数 29
2.3.6 CCmdTarget和CDocItem类 32
2.4 InitInstance函数 33
2.4.1 文档和视图管理 34
2.4.3 文档模板资源 35
2.4.2 框架窗口 35
2.4.4 字符串资源和文档模板 36
2.4.5 常用视图资源 37
2.4.7 使用多个模板 38
2.4.6 文档模板的生命周期 38
2.4.8 CDocManager类 39
2.5 CView类 40
2.4.9 删除模板 40
2.5.1 声明视图类 41
2.5.2 CView类的成员函数 42
2.5.4 CView类的派生类 43
2.5.3 视图和消息 43
2.5.6 返回框架窗口 44
2.5.5 CForm视图与基于对话框的应用程序 44
2.5.7 OnCreate函数 45
2.6.1 去掉文档名 46
2.6 控制标题栏文本 46
2.7 HexViewer SDI应用程序 47
2.6.2 格式化标题栏文本 47
2.7.1 打开和读取文件 48
2.7.2 视图编码 52
2.8 小结 55
3.1 MDI结构和 SDI结构之比较 56
第3章 多文档界面应用程序 56
3.2.2 使用文档的多个视图 57
3.2.1 使用多文档类型 57
3.2 文档、视图和框架窗口的组合 57
3.2.3 CMDIFrameWnd类 59
3.2.4 CMDIChildWnd类 60
3.2.7 MDI应用程序 61
3.2.6 使CDocument类的开销 61
3.2.5 CMultiDocTemplate类 61
3.3 PaintObj程序 62
3.4 拆分窗口 69
3.4.1 CSplitterWnd类 70
3.4.2 动态拆分器 71
3.4.3 在动态窗格中使用不同的视图 72
3.4.5 对与多个文档关联的视图使用拆分器 73
3.4.4 CRuntimeClass 对象 73
3.4.7 创建静态拆分器 74
3.4.6 静态拆分器 74
3.4.8 共享滚动条简介 75
3.5 Dynsplit程序 76
3.4.10 拆分器的性能考虑 76
3.4.9 确定实际尺寸和理想尺寸 76
3.6 小结 81
4.1 创建和编辑菜单 82
第4章 菜单和快捷键 82
4.1.1 定义菜单 83
4.1.2 编写菜单事件处理程序 87
4.1.3 编写简单的菜单代码 89
4.1.4 组合菜单处理程序 90
4.2.1 检查键盘输入 91
4.2 快捷键 91
4.2.3 创建快捷键表资源 92
4.2.2 定义快捷键 92
4.2.5 选择适当的快捷键 93
4.2.4 创建快捷键菜单提示 93
4.2.6 原始Windows API的快捷键支持 94
4.2.7 将快捷键表连接到窗口类 95
4.3.1 菜单命令范围 96
4.3 动态更改菜单 96
4.3.3 更改弹出菜单 97
4.3.2 在运行时更改菜单 97
4.3.4 久句柄映射和临时句柄映射 99
4.4 上下文菜单 100
4.5 小结 101
5.2.1 创建鼠标消息处理程序 102
5.2 鼠标输入 102
第5章 鼠标和键盘输入处理 102
5.1 事件 102
5.2.2 在屏幕坐标和窗口坐标之间转换 103
5.2.3 创建处理鼠标事件的MFC程序 104
5.2.4 非工作区鼠标事件 110
5.2.5 更改鼠标光标的形状 111
5.2.6 创建更改鼠标光标的MFC程序 112
5.2.7 捕获鼠标 115
5.3.1 物理键盘 116
5.3 键盘输入 116
5.3.3 可打印字符消息 117
5.3.2 Windows逻辑键盘 117
5.3.4 回显键盘焦点 118
5.4 小结 123
6.1 创建和控制状态栏 124
第6章 状态栏和工具栏 124
6.1.1 默认的状态栏行为 125
6.1.2 对齐状态栏 126
6.1.3 给状态栏添加文本窗格 127
6.1.4 在对话框上放置状态栏 128
6.1.5 状态栏示例程序 131
6.1.6 给状态栏添加进度条 133
6.2.1 MFC控件栏 142
6.2 创建和控制工具栏 142
6.2.2 创建并初始化工具栏 143
6.2.4 显示和隐藏工具栏 144
6.2.3 停靠和浮动工具栏 144
6.2.5 添加“工具提示”和“浮动文本” 145
6.2.7 更新非按钮控件 146
6.2.6 添加非按钮控件 146
6.2.9 添加ReBar支持 147
6.2.8 使ReBar控件 147
6.3 小结 148
第7章 树视图控件和列表视图控件 149
7.1.1 相关基础知识 150
7.1 树视图控件 150
7.1.2 CTreeCtrl类 151
7.1.4 处理CTreeCtrl消息 152
7.1.3 创建CTreeCtrl对象 152
7.1.5 在CTreeCtrl中插入项 157
7.1.6 编辑标签 158
7.1.7 在编辑CTreeCtrl项的同时处理Esc键和Enter键 160
7.1.8 上下文菜单 161
7.1.9 展开和折叠树视图控件分支 163
7.1.10 CTreeCtrl示例程序 164
7.2 列表视图控件 171
7.2.2 创建和关联CImageList对象 172
7.2.1 CListCtrl类 172
7.2.3 设置和更改视图风格 173
7.2.4 向CListCtrl 中添加列 174
7.2.5 调整列表视图的列的宽度 175
7.2.6 插入列表视图项 177
7.3 小结 178
8.1.1 图形类型 179
8.1 图形设备界面简介 179
第8章 图形设备界面编程 179
8.1.2 GDI设备 180
8.2 设备上下文 181
8.1.3 GDI设备类型 181
8.2.1 DC绘图属性 182
8.2.3 绘制坐标 184
8.2.2 WM PAINT消息 184
8.2.5 响应WM PAINT 以外的消息进行绘图 185
8.2.4 触发WM PAINT消息 185
8.3 控制文本 186
8.3.1 GDI颜色支持 187
8.3.2 文本颜色 188
8.3.3 对齐文本 189
8.4.1 将对象选入 DC 190
8.4 字体 190
8.3.4 调整文本 190
8.4.3 选择非常备字体 191
8.4.2 选择常备字体 191
8.5 使用画笔和画刷 194
8.5.1 画笔 195
8.5.2 画刷 197
8.6 映射模式 198
8.7 栅操作 199
8.7.1 文本绘制函数 200
8.7.2 计算文本坐标 201
8.8 剪辑区域 205
8.9 小结 206
9.1 位图和视频内存 207
第9章 位图和调色板 207
9.2 创建CBitmap 对象 208
9.3 加载和设置位图内容 209
9.4 把CBitmap绘制到屏幕上 210
9.4.1 绘制位图 211
9.4.2 创建和显示位图 212
9.5 光栅操作 214
9.6 BlitDemo程序 216
9.7 调色板和颜色 222
9.7.1 其他颜色空间 223
9.7.2 逻辑调色板 225
9.7.4 SetSystemPaletteUse 数 227
9.7.3 调色板事件 227
9.8.1 DIB文件剖析 228
9.8 设备无关位图 228
9.8.2 CDib类 229
9.8.3 ShowDIB示例程序 235
9.9 缓冲 237
9.10 小结 240
第2部分 对话框 241
10.1.1 定义CDialog派生类 242
10.1 从对话框和控件开始 242
第10章 对话框基础知识及常用控件简介 242
10.1.2 CDialog的主要成员 243
10.1.3 显示和控制模态对话框 244
10.1.4 命令处理路由和默认处理 245
10.1.5 控件也是窗口 247
10.1.6 把MFC类与控件关联起来 248
10.2 使用CButton类 255
10.2.1 下压按钮 256
10.2.2 单选按钮 257
10.2.3 复选框控件 261
10.2.4 位图按钮 262
10.2.5 使用BS_BITMAP 风格 264
10.3.1 使用DDX传送数据 267
10.3 使用CEdit类 267
10.3.2 使用编辑控件 269
10.3.3 修改示例程序 271
10.4 使用CListBox类 273
10.4.2 选择和查找选项 274
10.4.1 添加和删除选项 274
10.4.3 使用选项数据 275
10.5 使用CComboBox类 277
10.6.1 改变控件的颜色 278
10.6 修改控件运行时的属性 278
10.6.2 设置控件的字体 279
10.6.3 循环遍历对话框中的控件 280
10.7 小结 281
11.1 模态对话框 282
第11章 对话框和窗体视图 282
11.1.1 创建和显示无模态对话框 283
11.1.2 交换数据和状态 284
11.1.3 示例程序 287
11.2 CommandUI和KickIdle 293
11.3 键盘快捷键 296
11.4 截获键盘输入 297
11.5 串行化基于对话框的应用程序 298
11.5.3 从磁盘读取数据 299
11.5.2 实现Serialize虚函数 299
11.5.1 让每个类可串行化 299
11.5.5 基于对话框的串行化示例程序 300
11.5.4 将数据保存到磁盘 300
11.6 为SDI和MDI应用程序创建窗体视图 304
11.6.1 创建SDI窗体视图应用程序 305
11.6.2 在文档的多个视图之间进行切换 306
11.7 MFC控件视图 309
11.7.2 CListView的工作原理 310
11.7.1 常见误解 310
11.7.3 创建CListBoxView类 311
11.8 小结 313
11.7.4 使用CListBoxView类 313
12.1 CPropertySheet类和CPropertyPage类 315
第12章 属性单和属性页 315
12.1.3 显示模态属性单 316
12.1.2 创建CPropertyPage类 316
12.1.1 创建属性页 316
12.1.4 显示无模态属性单 317
12.1.5 在对话框内显示属性单 318
12.2 模态属性单示例程序 321
12.3.1 去除标准按钮 324
12.3 高级技巧和提示 324
12.3.2 重定位标准按钮 326
12.3.4 禁用选项卡 327
12.3.3 更改标准按钮的标题 327
12.3.5 重新启用属性页 330
12.3.6 动态设置CPropertyPage选项卡的标题 332
12.3.7 更改选项卡的字体 334
12.3.8 利用CPropertyPage选项卡的助记符 335
12.4 小结 336
第3部分 高级编程 337
13.1.1 处理NMCUSTOMDRAW通知 338
13.1 自己绘制和自定义绘制 338
第13章 自定义绘制控件 338
13.2.1 创建类 340
13.2 创建自定义绘制控件 340
13.1.2 为什么要进行自定义绘制 340
13.2.2 CListCtrlWithCustomDraw类 341
13.2.3 使用CListCtrlWithCustomDraw类 349
13.3 小结 351
14.1.1 修改基类 352
14.1 添加行为 352
第14章 为控件添加自定义行为 352
14.1.2 多重继承 353
14.1.3 消息映射 356
14.1.4 模板类 357
14.1.5 结合使用多重继承和模板 358
14.1.6 消息映射的问题 359
14.1.7 错误 361
14.2.2 模板友好的消息映射 364
14.2.1 问题 364
14.2 调整对话框和属性页 364
14.2.3 多重继承 366
14.2.4 模板类 368
14.2.6 调整对话框中控件的尺寸 371
14.2.5 将代码集中到一起 371
14.2.7 使用TXResizable 377
14.3 小结 378
15.1 使用Win32 SDK实现打印 379
第15章 打印和打印预览 379
15.1.1 简单的打印示例程序 380
15.1.2 退出打印作业 382
15.2.1 打印过程中开发人员和框架的作用 387
15.2 用MFC进行打印 387
15.2.2 理解MFC打印序列 388
15.2.3 “所见即所得”打印示例程序 390
15.3.1 打印预览过程 394
15.3 打印预览的体系结构 394
15.3.3 增强应用程序的打印预览功能 395
15.3.2 修改打印预览 395
15.4 CPrintDialog类 397
15.5 小结 398
16.1.2 加载DLL 399
16.1.1 动态库和静态库 399
第16章 动态链接库 399
16.1 DLL概述 399
16.2 常规DLL 400
16.2.1 创建常规DLL 401
16.2.3 实现自己的DllMain函数 402
16.2.2 理解常规DLL内核 402
16.2.4 动态加载DLL 403
16.2.5 编写Windows挂钩函数 409
16.2.6 使用DLL的全局C++对象 415
16.3 MFC扩展DLL 421
16.3.3 导出资源 422
16.3.2 通过MFC扩展DLL导出类 422
16.3.1 理解MFC扩展DLL内核 422
16.3.4 编写在DLL中封装文档和视图的示例程序 423
16.4 小结 427
17.1 使用线程 428
第17章 多线程编程 428
17.1.1 创建辅助线程 429
17.1.2 编写线程函数 431
17.1.3 创建UI线程 432
17.1.5 使线程睡眠 434
17.1.4 挂起和继续执行线程 434
17.1.6 从一个线程终止另一个线程 435
17.1.7 线程、进程和优先级 438
17.3 多线程示例程序 439
17.2 在线程之间共享MFC对象 439
17.1.8 进程优先级类 439
17.4 小结 444
18.1.1 抛出异常 445
18.1 异常处理语法 445
第18章 MFC异常处理 445
18.2 CException类 446
18.1.2 捕获异常 446
18.2.2 从CException对象中检索错误信息 447
18.2.1 创建和删除CException对象 447
18.2.3 捕获多种异常类型 448
18.3 定义CException派生类 449
18.3.1 了解CFileException类 450
18.3.2 CFileException示例程序 451
18.3.3 定义自己的CException派生类 453
18.4.1 确定应该捕获异常的函数 456
18.4 高级异常处理技术 456
18.4.2 确定放置在try块中的代码 457
18.4.3 确定放置在catch块中的代码 458
18.4.4 从虚函数中抛出异常 459
18.5 小结 462
第4部分 数据输入/输出 463
19.1.1 为数据分配内存空间 464
19.1 使用Windows剪贴板API 464
第19章 剪贴板 464
19.1.2 把数据复制到全局内存中 465
19.1.6 设置剪贴板数据 466
19.1.5 清空剪贴板 466
19.1.3 解除对全局内存的锁定 466
19.1.4 打开剪贴板 466
19.2.1 创建SimpleTextTransfer示例程序 468
19.2 传递纯文本的示例程序 468
19.1.7 关闭剪贴板 468
19.2.2 把文本复制到剪贴板上 469
19.2.4 粘贴剪贴板上的文本 470
19.2.3 把文本剪切到剪贴板上 470
19.2.5 测试SimpleTextTransfer示例程序 471
19.3.1 创建BitmapTransfer示例程序 472
19.3 转移位图图像的示例程序 472
19.3.2 粘贴剪贴板中的位图图像 473
19.3.4 把位图图像复制到剪贴板上 474
19.3.3 对Paste Bitmap按钮的功能进行测试 474
19.3.5 测试把位图复制到剪贴板上的功能 477
19.4.2 把自定义数据格式复制到剪贴板上 478
19.4.1 创建CustomDataTransfer示例程序 478
19.4 转移自定义数据的示例程序 478
19.4.3 把自定义数据复制到剪贴板上 479
19.4.4 从剪贴板上粘贴自定义数据 480
19.5 接收剪贴板上内容已被修改的通知消息 482
19.4.5 测试CustomDataTransfer示例程序 482
19.6 小结 487
20.1 ODBC定义和数据库术语 488
第20章 ODBC 488
20.2.1 ODBC的工作方式 490
20.2 ODBC:标准化需求的产物 490
20.2.3 ODBC SQL一致性层 491
20.2.2 ODBCAPI一致性层 491
20.3.1 配置ODBC 492
20.3 实现ODBC 492
20.3.2 连接数据源 493
20.3.4 准备和执行SQL请求 495
20.3.3 查询数据和数据源 495
20.3.5 检索数据 496
20.3.6 断开与数据源的连接 497
20.4 使用ODBC获取数据 498
20.4.2 为Visual C++项目添加对ODBC的支持 499
20.4.1 创建ODBC DSN 499
20.4.3 修改ODBCDemo对话框 500
20.4.4 添加初始化程序和数据库代码 501
20.5 使用ODBC动态查询数据源 505
20.5.1 CODBCDynamic类声明 506
20.5.2 了解CODBCDynamic类的工作方式 507
20.5.3 使用CODBCDynamic类 512
20.6 小结 513
21.1 CDatabase 对象 514
第21章 MFC数据库类 514
21.1.1 使用CDatabase∷Open函数 515
21.1.2 使用CDatabase∷OpenEx函数 516
21.2 CRecordset对象 517
21.1.3 事务和CDatabase 对象 517
21.2.1 构造记录集 522
21.2.3 使用RFX读写数据 523
21.2.2 打开记录集 523
21.2.4 过滤记录 524
21.2.6 使用通配符进行搜索 526
21.2.5 对记录集返回的记录进行排序 526
21.2.7 在结果集中移动 527
21.3 MFC数据库类编程 528
21.2.9 删除记录 528
21.2.8 保存记录 528
21.3.1 UserMaintenance示例程序 529
21.3.2 参数化记录集与查询 538
21.4 小结 547
22.1.1 通用数据访问的基础知识 548
22.1 ADO概览 548
第22章 ADO 548
22.1.2 ADO结构 549
22.1.4 ADO类库 551
22.1.3 ADO的接口 551
22.2.1 导入 ADO类库 552
22.2 使用ADO进行编程 552
22.2.3 连接数据源 554
22.2.2 初始化和结束COM 554
22.2.5 执行返回数据的命令 556
22.2.4 创建命令 556
22.2.6 对数据进行筛选和排序 557
22.2.7 遍历记录集 559
22.2.8 更新数据 560
22.3.1 初始化连接 561
22.3 ADO示例程序 561
22.3.2 显示用户 562
22.3.3 更新用户信息 565
22.3.4 添加一些用户界面装饰 568
22.4 小结 569
23.1 CFile类概览 570
第23章 CFile类和文件输入/输出 570
23.1.2 打开文件 571
23.1.1 实例化CFile 对象 571
23.1.4 将数据写入文件 573
23.1.3 从文件中读取数据 573
23.1.5 定位文件中的数据 574
23.2 打开和显示二进制文件 575
23.3 使用文本文件 578
23.4 以逗号进行分隔的文件类 580
23.5 打开和显示CSV文件 584
23.6.1 CompressDemo示例程序 586
23.6 压缩文件 586
23.6.2 CCompressedFile类函数 587
23.6.3 剖析CompressDemo示例程序 589
23.7 小结 591
24.2 XML术语和语法 592
24.1 XML概述 592
第24章 在Visual C++中使用XML 592
24.3 XML DOM简介 595
24.4.1 创建VisualC++项目和对话框 596
24.4 上载和查看XML文档 596
24.4.2 合并XML支持 597
24.4.3 上载XML文档 598
24.4.4 遍历XML文档 599
24.4.5 使用户界面更友好 602
24.5 小结 604
第5部分 COM 605
25.1.1 n层系统 606
25.1 基于组件的软件 606
第25章 基于接口的程序设计 606
25.1.2 接口与实现 607
25.1.3 抽象类和接口 609
25.1.4 C++的VTBL 610
25.2 使用IUnknown 611
25.1.5 对象管理 611
25.2.1 生命周期管理 612
25.2.3 发现身份 614
25.2.2 GUID,CLSID和IID 614
25.2.4 使HRESULT值 616
25.2.5 接口不变性 618
25.2.6 接口继承 619
25.3 IDL简介 621
25.4 小结 624
26.1 COM的优势 625
第26章 创建和使用组件 625
26.2 对象和服务器 626
26.3 创建COM对象 627
26.4 注册表 629
26.4.1 DLL必须输出的函数 630
26.4.2 IClassFactory 631
26.4.3 使用RegSvr32 634
26.5 小结 639
27.2 封送处理 640
27.1 类型库概述 640
第27章 类型库 640
27.2.2 IDL,ODL和MkTypeLib 642
27.2.1 类型库封送处理 642
27.3 C++编译器扩展 645
27.3.1 EXE服务器和封送处理 648
27.3.2 自定义接口和代理-存根DLL 651
27.4 小结 652
第6部分 .NET编程 653
28.1 .NET概述 654
第28章 .NET简介 654
28.2 BCL和System名字空间 655
28.3.1 MSIL和JITter 656
28.3 生成执行代码 656
28.3.3 程序集清单数据 658
28.3.2 程序集 658
28.4 小结 659
29.1 开始使用VisualC++ 660
第29章 编写托管C++代码 660
29.2 作为智能域的属性 662
29.2.1 定义和使用属性 663
29.2.2 编译器真正在做什么 665
29.2.3 指定只读、只写和读/写特性 666
29.4 用委托作为回调函数 667
29.3 委托和事件句柄 667
29.2.4 属性的高级用法 667
29.5 小结 673
30.2 使用线程类创建辅助线程 674
30.1 线程概述 674
第30章 托管C++的多线程 674
30.3 向辅助线程传递数据 677
30.4.1 暂停和恢复线程的执行 681
30.4 线程的生命周期管理 681
30.4.2 退出线程 683
30.4.3 结合使用所有方法 686
30.5 线程的优先级 690
30.6 同步线程 694
30.6.1 用Monitor类来保护代码 695
30.6.2 用Mutex类来同步代码 698
30.7 小结 699
31.1 创建第一个Windows Forms程序 700
第31章 使用Windows Forms 700
31.2 向窗体中添加控件 703
31.3 在Windows Forms 应用程序中集成菜单 708
31.4 用托管C++编写图像浏览器 711
31.5 小结 717