第1部分 入门指南 1
序 1
第1章 C++Builder导论 1
1.1 本书面向的对象 1
1.2 如何阅读本书 2
1.2.1 本书的指导思想 2
1.2.2 分布式计算 3
1.3 新的调试工具 4
1.3.1 调试一个DLL 8
1.3.2 在EXE文件内部调试DLL 9
1.3.3 在DLL中设置断点以及其他的技巧 10
1.3.4 与C++Builder 1.0版本的区别 11
1.4 VCL的概念 12
1.4.1 可视化组件的时代 12
1.4.2 组件的优点 12
1.4.3 核心技术:组件、属性、委托模型 13
1.5 为什么使用VCL 14
1.5.1 保留OWL和MFC中的代码 15
1.6 准备工作 15
1.6.1 版权说明 15
1.6.2 代码中的错误 16
1.6.3 有关引用Delphi的问题 16
1.7 小结 17
1.6.5 配套的光盘 17
1.6.4 优化代码 17
第2章 事件 18
2.1 事件:C++Builder委托模型 18
2.1.1 委托和Windows API函数 18
2.1.2 在C++Builder中创建事件 19
2.1.3 委托与继承 19
2.1.4 免协议编程(Contract-Free Programming) 20
2.1.5 委托模型的小结 20
2.2 使用委托模型 20
2.2.1 C++Builder的事件:EVENTS1程序 21
2.2.2 处理OnClick事件 22
2.2.3 处理MouseDown事件 23
2.2.4 响应KeyDown事件 24
2.2.5 处理OnKeyPress事件 24
2.3 了解事件 24
2.3.1 为什么Windows是面向事件的 26
2.4 从事件中提取信息 26
2.4.1 使用集合跟踪消息 27
2.4.2 SETEXP程序 27
2.4.3 使用TShiftState 29
2.4.4 并集、交集和差集 30
2.5 EVENTS2程序:事件的详细内容 31
2.5.1 移动鼠标事件的详细情况 36
2.5.2 捕捉虚拟键 37
2.5.3 直接处理事件 38
2.6 MENUDEF程序:菜单、WM_COM_MAND和WndProc 41
2.6.1 了解MENUDEF程序 41
2.6.2 获取菜单项的ID值 45
2.6.3 捕捉WM_COMMAND消息 46
2.6.4 将WndProc作为程序的主函数 47
2.7 小结 48
第3章 异常 50
3.1 如何使用异常 50
3.2 有关异常的理论 51
3.2.1 异常的作用 51
3.2.3 整个程序是一个try模块 52
3.2.2 缺省的异常处理程序 52
3.2.4 未处理的异常所造成的危险 53
3.3 异常类 53
3.4 异常的基本语法 55
3.4.1 一个简单的try..catch模块 57
3.4.2 将异常与出错字符串相对应 58
3.4.3 查找出错的位置 59
3.4.4 异常处理的小结 60
3.5 发送异常 61
3.5.1 发送一个整数 63
3.5.2 发送VCL异常类 64
3.5.3 了解VCL异常类 65
3.5.4 多重catch语句 66
3.5.5 在通用的catch语句中捕获异常 67
3.6 创建和生成自己的异常 68
3.7 再次发送异常 72
3.8 异常和析构函数 73
3.9 流、异常和释放内存 78
3.10 代替缺省的异常处理程序 81
3.11 使用资源跟踪出错字符串 84
3.12 小结 90
第4章 C++类和可视化组件模型 91
4.1 多重继承 91
4.1.1 处理其他类型的继承 92
4.2 不使用多重继承的类库设计 93
4.2.1 输出流 93
4.2.2 一般性和特殊性 94
4.2.3 多重继承和多文档 94
4.2.4 如何使用多重继承 96
4.3 异常处理 96
4.3.1 操作系统的异常 96
4.3.2 混合异常模型 98
4.3.3 VCL异常 98
4.4 运行时的类型信息 99
4.5 纯虚拟函数 101
4.6 接口与实现 102
4.7 静态分配 104
4.8 构造对象 106
4.9 小结 106
第2部分 关系数据库 107
第5章 数据库基础知识 107
5.1 建立数据库工具 108
5.2 数据库基础知识 108
5.3 命名和结构约定 110
5.4 使用TQuery对象开发SQL 112
5.4.1 数据模块 112
5.5 TDataModule的用途 115
5.5.1 TDataModule的习惯用法 116
5.6 Object Repository 117
5.7 Database Explorer 118
5.8 使用SQL Monitor 119
5.9 了解BDE和别名 121
5.10 别名 123
5.11 TCP/IP安装的一些说明 123
5.12 与ODBC的连接 126
5.13 TBatchMove组件 128
5.14 小结 129
第6章 使用TTable和TDataSet 130
6.2 了解修订后的TDataSet类 131
6.1 可视化数据库控件与非可视化数据库控件 131
6.2.1 TDataSet的主要子类 132
6.2.2 数据集(Dataset)的含义 132
6.3 TDataSet的核心方法 133
6.3.1 打开和关闭数据集 133
6.3.2 导航例程 134
6.3.3 检查数据集的开始或结束部分 136
6.3.4 通过MoveBy方法导航记录 138
6.4 字段(Fields) 138
6.4.1 字段对象的常用方法 139
6.4.2 访问字段名 139
6.4.4 FIELDOBJECT样本程序 140
6.4.3 访问字段内容 140
6.4.5 FIELDER样本程序 141
6.5 修改数据 142
6.5.1 编辑数据集的重要方法 142
6.5.2 编辑和寄送记录的编程问题 143
6.5.3 插入、添加和删除记录 145
6.6 查找 147
6.6.1 使用SetKey或FindKey进行查找 147
6.6.2 使用SetKey和GotoKey 147
6.6.3 使用FindKey和FindNearest 149
6.6.4 按辅助索引查找 149
6.7 范围的确定 150
6.7.1 选择记录的范围 150
6.6.5 使用模糊查找 150
6.7.2 RANGER样本程序 151
6.7.3 RANGER2样本程序 153
6.8 过滤 153
6.8.1 OnFilterRecord事件 153
6.8.2 FILTER样本程序 154
6.9 书签 155
6.10 使用Refresh(刷新)函数 156
6.11 关于TDataSet和TTable更多的内容 157
6.12 一对多关系:链接指针(Linked Cursors) 157
6.13 TDataSource基础知识 159
6.13.1 检查数据集的状态 161
6.14 跟踪数据集的状态 163
6.15 使用TDatabase 166
6.16 不使用可视化工具创建数据库 167
6.17 小结 172
第7章 SQL和TQuery对象 174
7.1 SQL属性 175
7.1.1 使用TQuery对象编程 175
7.1.2 从磁盘上装入通配符查询 176
7.2 TQuery和参数 178
7.2.1 编写用于参数化查询的SQL语句 178
7.2.2 编写参数化查询代码 178
7.2.3 参数化查询例子EASYSQL2 180
7.2.4 采用多连接变量查询 182
7.3 SQL属性和Format函数 184
7.3.1 PARAMSI程序中的Session对象 185
7.4 使用TQuery建立一对多关系 188
7.5 建立多个表之间的连接 190
7.6 RequestLive属性 192
7.7 参数化查询和连接语句 193
7.8 ExecSQL、Delete和Insert语句 194
7.8.1 使用SQL删除记录 195
7.8.2 使用SQL插入记录 196
7.9 特殊的TQuery属性 197
7.10 SQL的一些有趣内容 197
7.11 小结 200
第8章 使用字段对象 201
8.1 Fields Editor 201
8.1.1 启用Fields Editor 202
8.1.2 计算字段(Calculated Field) 205
8.1.3 Columns属性编辑器 207
8.2 查找字段(Lookup Fields) 207
8.2.1 使用Lookup程序 209
8.2.2 有关计算字段 215
8.2.3 有关查找字段 215
8.2.4 TDBLookupComboBox和TDBLookupListBox 216
8.2.5 在Lookup程序中插入和编辑数据 216
8.3 程序运行状态下的TDBGrid 217
8.3.1 在程序运行状态下控制TDBGrid的Options属性 226
8.3.2 在程序运行状态下显示DBGrid的选项 228
8.4 使用TDBGrid列 229
8.4.1 改变TDBGrid对象中的标题 230
8.4.2 改变TDBGrid对象中的一个单独列 231
8.4.3 改变TDBGrid对象中行的颜色 232
8.4.4 改变列的宽度 232
8.4.5 隐藏或移动TDBGrid中的列 233
8.4.6 在程序运行状态下移动列 235
8.5 多记录对象 235
8.6 小结 236
第9章 了解关系数据库 238
9.1 关系数据库入门 238
9.1.1 关系数据库模型的优点 239
9.1.2 简单的集合逻辑:关系数据库的基础 240
9.1.3 在DBD或Explorer中显示索引和关键字 241
9.2 非数字化规则:为每个表创建一个主码 245
9.2.1 一对多关系:数据和索引 246
9.2.2 使用主码 247
9.2.3 使用辅助索引和外码 248
9.2.4 关键字是数据库中的重点 249
9.3 在BCDEMOS数据库中浏览关键字和索引 249
9.3.1 使用Database Desktop创建索引 253
9.3.2 使用Database Desktop创建主码和外码 254
9.4 为什么要使用参照完整性 255
9.5 一对多关系:代码 256
9.5.1 关系数据库和Join 257
9.5.2 Join和QBE 258
9.5.3 使用SQL Builder 261
9.6 应该使用什么样的数据库 262
9.7 小结 263
第10章 实际的平面文件数据库 264
10.1 综述 264
10.2 本章中的样本程序 264
10.3 设计一个应用程序 265
10.3.1 定义数据 265
10.3.2 设计程序:索引 268
10.4 设计程序的外观 270
10.5 查找:使用Category字段 273
10.6 为程序建立命令结构 275
10.7 检测应用程序的“草图” 276
10.8 创建最终的程序 277
10.9 设置只读模式 293
10.10 数据排序 296
10.11 数据搜索 297
10.12 数据过滤 298
10.13 字段的标记 299
10.14 颜色设置 302
10.15 使用注册表 305
10.16 导航注册表 312
10.17 从Run菜单下运行程序 314
10.18 在ADDRESS2程序中使用注册表 315
10.19 剪贴板:剪切、复制和粘贴 316
10.20 小结 317
第11章 会话和实际的关系数据库 318
11.1 实际的数据 318
11.3 KDADDS程序的代码 323
11.3.1 使用KDADD程序 332
11.3.2 设置KDADD程序的索引 333
11.3.3 搜索记录 335
11.3.4 插入数据和取消操作 335
11.3.5 删除数据:第一次查看程序的数据模块 336
11.3.6 数据模块:级联删除(Cascading Deletes) 339
11.3.7 数据模块:整体寄送 340
11.3.8 在字符串资源中放置出错字符串 341
11.3.9 About框 342
11.4 使用KDADDEXPLORE程序 343
11.4.1 使用TSession 343
11.4.2 KDADDEXPLORE程序的代码 345
11.4.3 使用TTreeView显示系统中的数据库 352
11.4.4 扩充TTreeView的节点 353
11.4.5 在TTreeView中添加可用表的列表 354
11.4.6 查找索引和字段 355
11.4.7 显示别名和别名参数 356
11.5 迁移数据、TBatchMove、临时表和NULL字段 357
11.6 小结 358
第12章 使用本地InterBase服务器 359
12.1 关于IterBase 359
第3部分 客户机/服务器和多层数据库 359
12.2 数据库与人才需求 360
12.3 配置本地InterBase 360
12.4 配置InterBase别名 363
12.5 创建数据库 365
12.6 用WISQL浏览数据库 367
12.7 事务处理 368
12.8 高速缓冲更新(cached updates) 372
12.9 多对多关系 376
12.10 安全性与InterBase服务器管理器 384
12.10.1 定义表的访问权限 385
12.10.2 通过服务器管理器备份表 385
12.11 小结 386
第13章 高级InterBase概念 387
13.1 MUSIC程序 388
13.2 设计MUSIC程序 388
13.2.1 创建数据库方案 389
13.2.2 改变表:Null或Not to Null 390
13.2.3 更名已有表中的字段 391
11.2 检查关系地址程序 391
13.2.4 创建Blob字段 392
13.2.5 主码与外码 392
13.3 创建MUSIC表的索引 395
13.4 生成器、触发器与存储过程 396
13.4.1 不要在激活的索引中使用触发器 397
13.4.2 使用存储过程 398
13.4.3 C++Builder端的存储过程 398
13.5 服务器端规则与客户端规则 400
13.6 MUSIC程序口综述 401
13.7 使用子窗体 401
13.8 MUSIC程序代码 405
13.8.1 使用MUSIC程序 408
13.8.2 屏蔽口令:TDatabase对象 409
13.8.3 FormCreate事件 409
13.9 使用MUSIC程序数据 413
13.9.1 查找 413
13.9.2 查询数据库问题:初级SQL 414
13.9.3 不返回数据集的存储过程 418
13.9.4 浏览确定范围内的数据 419
13.10 小结 420
第14章 快速报表、图形与电子报表工具 421
14.1 Windows打印综述 421
14.2 QuickReport基础 422
14.3 行、列、组和一对多 423
14.4 使用样本程序 424
14.5 ADDRESS2样本程序 424
14.5.1 ADDRESS2:打印地址 424
14.5.2 ADDRESS2:对报表中数据进行分组 427
14.6 MUSIC程序的报表 428
14.6.1 一对多报表 429
14.6.2 使用查询进行报表分组 430
14.7 打印窗体 432
14.7.1 Tprinter:打印文本、图形和位图 433
14.7.2 打印图形 441
14.7.3 打印位图 442
14.8 小结 443
第15章 客户机与服务器之间的连通性 444
15.1 连接到服务器 444
15.2 使用Microsoft SQL 6.5 445
15.2.1 创建一个MS SQL别名 446
15.2.2 访问你的数据库 447
15.2.3 将一个Paradox数据库程序转换到MS SQL 449
15.3 使用Oracle 7.32 452
15.3.1 访问你的Oracle数据库 453
15.4 使用Informix 7.20 455
15.4.1 访问Informix数据库 456
15.5 使用Sybase 11.02 458
15.6 使用DB2的2.1.2版本 460
15.6.1 连接DB2时可能出现的连接错误 461
15.6.2 访问你的DB2数据库 463
15.7 小结 465
第16章 多层数据库设计 466
16.1 多层数据库应用程序概述 466
16.2 C++Builder和Internet 467
16.3 分布式体系的三种类型 469
16.4 为什么DCOM会引起争论 470
16.5 DCOM是什么 470
16.5.1 在Windows 95下运行DCOM服务程序 471
16.6.1 应用服务程序 474
16.6 将已有的程序转变为多层应用程序 474
16.6.2 设置DCOM 476
16.6.3 客户应用程序 477
16.6.4 VCL对象浏览器程序代码的修改 479
16.6.5 发送客户应用程序 479
16.7 介绍Active Forms 480
16.7.1 建立一个Active Form 481
16.7.2 了解OCCACHE 484
16.7.3 安装附加文件 484
16.8 使用CAB文件和程序包 486
16.8.1 有关许可的问题 489
16.8.2 使用带有Active Forms的模板 489
16.9.2 使用套接字创建Midas Active Form 490
16.9 套接字和Active Forms 490
16.9.1 关于套接字的概述 490
16.9.3 创建基于Midas的Active Form 492
16.10 小结 494
第4部分 创建组件 495
第17章 继承性 495
17.1 对象 496
17.2 创建简单的对象 497
17.2.1 与VCL类特征的区别 499
17.3 继承性 502
17.3.1 类的引用 503
17.4 虚拟方法 506
17.4.1 反复设计 511
17.4.2 集成:VCL编程的层次 515
17.4.3 创建友元对象 520
17.4.4 使用集成 520
17.4.5 可视窗体继承性 522
17.4.6 可视窗体继承性的优点 525
17.5 小结 526
第18章 封装 527
18.1 综述 527
18.2 封装 527
18.2.1 隐藏数据 529
18.2.2 内联方法 530
18.3 简单性:一个好的对象设计的秘诀 531
18.4 一个具体的实例 532
18.4.1 TWidget和其析构函数 533
18.4.2 使用Widgets 535
18.5 属性 542
18.6 流控制类 544
18.6.1 从流中读取一组件 545
18.7 关于属性的其他内容 546
18.7.1 使用StringLists 550
18.7.2 用字符串索引数组 551
18.7.3 只读属性 553
18.7.4 易使人误解的default指示符 554
18.8 小结 555
第19章 多态性 556
19.1 综述 556
19.2 多态性 556
19.3 多态性的简单例子 557
19.4 多态赋值的兼容性 558
19.4.1 子对象与父对象赋值的兼容性 558
19.4.2 从另一角度看多态性 560
19.5 虚拟方法与多态性 561
19.5.1 ClassicShapeDemo程序 564
19.5.2 使用TCustomControl 567
19.6 VCL中的多态性 568
19.7 封装的多态性要点综述 571
19.8 小结 572
第20章 创建已有组件的继承类 573
20.1 组件理论 573
20.2 创建一个已有组件的继承类 574
20.2.1 创建组件 576
20.2.2 程序包简介 580
20.2.3 组件构造函数 580
20.2.4 测试组件 581
20.2.5 安装组件 582
20.3 扩展Unleash单元 583
20.4 从底层创建组件 592
20.4.1 时钟组件 593
20.5 时钟组件的代码 603
20.5.1 时钟的启动 604
20.5.2 时钟的绘制 604
20.5.3 TColor-Clock对象 606
20.5.4 GOLDCLOCK程序 607
20.6 为组件创建图标 608
20.7 使用API工具 608
20.7.1 单一类型的属性编辑器 609
20.7.2 类属性编辑器 611
20.7.3 类型Class的流属性 612
20.7.4 测试DsgnIntf.cpp 613
20.7.6 使用组件编辑器 614
20.7.5 注册属性编辑器 614
20.8 Clock2:扩展组件和属性编辑器 616
20.8.1 安装组件 626
20.8.2 创建组件编辑器 627
20.9 小结 629
第21章 程序包 631
21.1 什么是程序包 631
21.2 程序包如何工作 631
21.3 程序包与DLL 632
21.4 使用程序包的优点 633
21.5 与程序包相关的文件 633
21.7 创建程序包 635
21.6 安装程序包 635
21.7.1 System Tray Icon程序包(TTrayIcon) 636
21.7.2 TTrayIcon的属性 638
21.8 Scroll Panel程序包(TScrollPanel) 650
21.9 小结 658
第22章 创建组件 659
22.1 仓库 659
22.1.1 接口 660
22.2 Widgct和Pallet组件的层次 679
22.2.1 了解TWidget, TPentium和TPentiumPro 681
22.3 Pallet控件 683
22.3.1 TDataPallet和拖曳 684
22.3.2 TDataPallet和数据库 687
22.4 查询数据库 689
22.5 查看层次 691
22.6 小结 692
第5部分 C++ Builder和Internet 693
第23章 NetMasters因特网组件 693
23.1 Internet简介 694
23.1.1 UUCP:历史的回顾 694
23.1.2 TCP/IP:历史简介 694
23.1.3 以太网(Ethernet):把我们连接起来的硬件平台 695
23.1.4 IP:网际协议 695
23.1.5 TCP:传输控制协议 695
23.2 NetMaster因特网组件简介 696
23.1.6 UDP:用户数据报协议 696
23.1.7 端口:基本的连接单元 696
23.2.1 组件列表 697
23.3 例子 697
23.3.1 例子1:离线组件 698
23.3.2 例子2:简单的调试组件 702
23.3.3 例子3:发送和接收数据 704
23.3.4 例子4:基于Web的组件 707
23.3.5 例子5:新闻、文件和Fingers 709
23.3.6 例子6:基于邮件的组件 714
23.3.7 例子7:UDP消息 717
23.4 小结 719
23.3.8 例子中未涉及到的问题 719
第24章 WebBroker组件 720
24.1 TClientSocket组件 721
24.2 TServerSocket组件 721
24.3 TWebDispatcher组件 726
24.4 TPageProducer组件 727
24.5 TQueryTableProducer组件 727
24.6 TDataSetTableProducer组件 728
24.7 使用WebBroker组件的例子 728
24.7.1 运行CGI程序的HTML文件 728
24.7.2 创建简单的CGI程序 728
24.8 TServerSocket组件的其他用法 732
24.8.2 AWChatServer的实现 733
24.8.1 AWChatServer的初步设计 733
24.8.3 AWChatServer客户程序 741
24.9 小结 741
第25章 使用WININET创建FTP应用程序 742
25.1 准备工作 742
25.2 确定FTP在系统中正常运行 743
25.3 使用WININET的FTP 743
25.3.1 使用InternetOpen 745
25.3.2 使用InternetConnect 746
25.4 连接以后 748
25.5 检索文件 750
25.6 向FTP服务器发送文件 751
25.7 删除文件 752
25.8 建立和删除目录 752
25.9 一个简单的FTP控件 753
25.10 建立用户自绘(Owner-Draw)的列表框 765
25.11 小结 769
第6部分 ActiveX、DCOM和OLE 770
第26章 Automation 770
26.1 关于语言的说明 770
26.2 C++ Builder和ATL 771
26.3.3 即插即用应用程序 772
26.3.2 COM和Windows 772
26.3.1 COM的概念 772
26.3 COM基础知识 772
26.3.4 COM存在的问题 774
26.3.5 COM与UNIX 775
26.3.6 COM+ 775
26.4 创建一个简单的COM服务程序和客户程序 776
26.4.1 创建一个简单的服务程序 776
26.4.2 建立一个简单的客户程序 780
26.5 接口 787
26.5.1 IDispatch、双重接口和Dispinterfaces 789
26.5.2 VTables 790
26.6 类型库(Type Libraries) 791
26.6.1 什么是类型库 792
26.6.2 创建类型库 793
26.6.3 使用coclass 794
26.6.4 使用接口 795
26.6.5 定义接口的实现部分 795
26.6.6 合法的Automation类型 799
26.7 忽略TNoParams中的参数 800
26.8 有关注册的问题 800
26.9 对数据进行自动编组 802
26.10 使用WideStrings 803
26.11 从一个CoClass获取两个或多个接口 804
26.11.1 调用CoCreateInstance 812
26.12 小结 813
第27章 DCOM和OLEnterprise 814
27.1 一个简单的DCOM客户和服务器 814
27.1.1 建立DCOM客户 820
27.1.2 使用远程对象 825
27.2 变量数组 826
27.2.1 什么是变量数组 826
27.2.2 对数组的锁定和解锁 828
27.2.3 一个变量数组的样本程序 830
27.3 权衡远程数据集 833
27.3.1 ServerData程序 841
27.3.2 GETDATA:远程数据集的客户程序 845
27.4 程序数据和Automation数据 853
27.5 OLEnterprise的基本概念 859
27.5.1 OLEnterprise的使用对象 860
27.5.2 使用OLEnterpris 861
27.5.3 OLEnterprise故障排除 862
27.5.4 RPCSS 863
27.5.5 OLEnterprise和Midas 867
27.5.6 OLEnterprise小结 867
27.6 小结 868
第28章 创建新的ActiveX组件 869
28.1 ActiveX控件 869
28.2 C++Builder 3中用来创建ActiveX控件的工具 869
28.2.2 OLE的功能 870
28.2.1 OLE的定义 870
28.2.3 OLE SDK,OCF和MFC 872
28.2.4 Active Templata Library(ATL)和ATLVCL 872
28.3 准备工具 873
28.3.1 OLE包容器各不相同 873
28.3.2 OLE的确不错,但有时结果却不可预知 873
28.4 使用传统方法建立ActiveX控件 874
28.4.1 步骤1:创建GUID 874
28.4.2 步骤2:编写.IDL文件 874
28.4.3 步骤3:运行MIDL.EXE 877
28.4.4 步骤4:编写.REG文件 877
28.4.5 步骤5:在包容器插入的对象列表中查看OCX 880
28.4.6 步骤6:综述 882
28.4.7 步骤7:准备头文件 883
28.4.8 步骤8:编写类工厂 886
28.4.9 步骤9:初始化对象 888
28.4.10 步骤10:回答QueryInerface 890
28.4.11 步骤11:从剪贴板获取数据 891
28.4.12 步骤12:激活对象 894
28.4.13 步骤13:建立控件窗口 896
28.4.14 步骤14:实现Odds和Ends 899
28.4.15 步骤15:在窗体中放入OCX控件 901
28.5 通过VCL组件创建ActiveX控件 901
28.5.1 Object Repository 902
28.5.2 创建ActiveX控件 903
28.6 使用ATL编写ActiveX控件 906
28.6.1 ATL的优点 906
28.6.2 ActiveX线程模型 906
28.6.3 建立Microsoft ATL样本 907
28.7 使用ATL创建OCX 909
28.7.1 ATL与VCL的区别 909
28.7.2 创建项目 910
28.7.3 添加DllEntryPoint和导出COM函数 910
28.7.4 添加类库 912
28.7.5 添加ATL头文件 915
28.7.6 添加继承来的OLE接口 916
28.7.7 添加对QueryInterface的支持 918
28.7.8 添加消息映射 920
28.7.9 添加属性 920
28.7.10 添加事件 920
28.7.11 添加注册表的支持 921
28.7.12 控件的初始化 921
28.7.13 添加自定义方法 921
28.7.14 添加.RC文件 927
28.7.15 添加.RGS文件 928
28.7.16 建立ActiveX控件 928
28.8.1 使用TD32调试OCX 929
28.8 调试ActiveX控件 929
28.8.2 使用C++ Builder的集成调试器调试OCX 930
28.8.3 将C++ Builder3配置为即时调试器 935
28.9 小结 936
第7部分 图形 937
第29章 VCL的图形类 937
29.1 Windows的GDI和VCL的TCanvas 937
29.1.1 什么是GDI 938
29.1.2 VCL能使你的图形编程更简单 938
29.2 使用TCanvas 939
29.3 使用画刷(Brushes) 939
29.3.1 TBrush::Color属性 940
29.3.2 TBrush::Style属性 940
29.3.3 TBrush::Assign方法 942
29.4 使用画笔(Pens) 943
29.4.1 TPen::Style属性 943
29.4.2 TPen::Width属性 943
29.4.3 TPen::Mode属性 943
29.5 使用字型(Fonts) 944
29.5.1 TPont::Height属性 945
29.5.2 TPont::Size属性 945
29.5.3 TPont::Name属性 946
29.5.4 TPont::Style属性 946
29.5.5 旋转字型 947
29.8 TCanvas::CopyMode属性 948
29.7 TCanvas::ClipRect属性 948
29.6 TCanvas::PenPos属性 948
29.9 使用TCanvas::Pixels 949
29.10 掌握TCanvas方法 950
29.11 BRUSHMAIN例程源码 950
29.11.1 OnCreate事件 957
29.11.2 FormShow方法 958
29.11.3 设置Pen的模式(Mode) 959
29.11.4 使用字型(Fonts) 961
29.11.5 在Canvas上绘制图形 962
29.11.6 使用CopyModes 964
29.11.7 改变ClipRect 964
29.12 使用其他形式的线形 965
29.13 小结 968
第30章 颜色、调色板和图像 969
30.1 深入了解TColor 969
30.1.1 颜色样本方案 970
30.1.2 OnChange事件处理程序 972
30.2 调色板 974
30.3 再论Windows的图像文件格式 978
30.3.1 使用位图和DIB 978
30.3.2 使用图标 978
30.3.3 使用元文件 978
30.4 使用TImage和TPaintBox 983
30.5 关于位图的补充说明 984
30.5.1 旋转位图 985
30.5.2 动态显示 990
30.5.3 淡入淡出 995
30.6 小结 998
第31章 在C++ Builder中使用DirectDraw 999
31.1 何谓DirectDraw 999
31.2 设置DirectDraw 1000
31.2.1 DirectDrawCreate 1000
31.2.2 SetCooperativeLevel 1001
31.2.3 SetDisplayMode 1001
31.2.4 独占模式与Windowed模式 1001
31.3 DirectDrawSurface接口 1003
31.2.5 关于DirectDraw2的问题 1003
31.3.1 Lock函数 1004
31.3.2 IDirectDrawSurface2或IDirectDrawSurface3的问题 1006
31.4 在DirectDraw中使用GDI 1006
31.4.1 使用TBitmap 1007
31.5 IDirectDrawPalette接口 1008
31.5.1 创建一个自定义调色板 1009
31.6 使用DirectDraw 1010
31.6.1 动画制作 1011
31.7 多表面和翻页技术 1012
31.7.1 在背景上制作动画 1013
31.9 小结 1020
31.8 创建DirectDraw组件 1020
第32章 在C++ Builder中使用Direct3D 1021
32.1 什么是Direct3D 1021
32.2 初始化Direct3D应用程序 1021
32.2.1 创建Direct3DRM对象 1023
32.2.2 DirectDrawClipper 1023
32.2.3 Direct3D着色选项 1024
32.2.4 HandleActivate和HandlePaint 1025
32.3 设置一个Direct3D场景 1026
32.3.1 IDirect3DRMFrame 1026
32.3.2 光源 1027
32.4 用IMeshBuilder创建模型 1028
32.3.3 摄影机 1028
32.4.1 在磁盘上保存模型 1029
32.4.2 复杂的网络 1030
32.4.3 变换模型 1031
32.4.4 从磁盘调入网格对象 1033
32.5 纹理贴图 1033
32.5.1 包装一个模型 1034
32.6 一个三维模型和纹理浏览 1036
32.7 小结 1047
第8部分 高级话题 1048
第33章 使用Delphi文件 1048
33.1 如何使用Delphi代码 1048
33.3 在C++Builder 3 中使用Delphi组件 1049
33.2 在C++Builder中使用Delphi代码 1049
33.4 关于Pascal编译器 1050
33.4.1 什么时候可以使用is 1051
33.4.2 Real数据类型 1051
33.4.3 继承Pascal对象模型 1051
33.4.4 空集 1051
33.4.5 Pascal和C++类型 1052
33.5 头文件生成 1052
33.5.1 多重构造函数 1052
33.5.2 数组属性 1053
33.5.3 变体记录 1054
33.6.2 Delphi中的句柄与C++Builder3中的句柄比较 1055
33.6 链接错误 1055
33.6.1 Pascal类中的方法 1055
33.6.3 字节与字对齐问题 1057
33.7 项目示例:Monster Hunt 1057
33.7.1 创建主窗体 1057
33.7.2 关于Monster Hunt 1059
33.7.3 游戏 1060
33.8 Delphi和C++Builder的结合 1071
33.9 小结 1073
第34章 OWL和Microsoft DLL的互用性 1074
34.1 不能使用Microsoft Visual C++6的DLL情况 1074
34.1.1 不要导出C++函数 1074
34.1.2 不能导出类 1076
34.1.3 不要发送脱离DLL的C++异常 1078
34.1.4 不要在一端动态分配内存,而在另一端又将其释放掉 1078
34.1.5 不要将RTL文件句柄传递给DLL 1078
34.2 从Microsoft DLL中导入函数 1078
34.2.1 为VC++的DLL创建一个工作文件.DEF 1079
34.2.2 为VC++DLL创建一个实际的导入库 1079
34.3 创建DLL的结束语 1080
34.4 OWL支持 1080
34.4.1 idetobpr:IDE转换成项目文件的工具 1081
34.4.2 OWL动态设置 1081
34.4.4 简单的Borland C++ 5的OWL应用程序转变成C++Builder3应用程序 1082
34.4.3 OWL、ClassLib和OCF库 1082
34.6 标准C++库 1085
34.5 支持MFC 1085
34.7 如何处置以前的C++Builder应用程序 1086
34.8 混合使用OWL和VCL 1086
34.8.1 OWL/VCL模板类 1087
34.8.2 含有VCL窗体的OWL MDI应用程序 1090
34.8.3 作为客户应用程序的OWL对话框 1096
34.9 小结 1098
第35章 动态/静态链接库和第三方问题 1099
35.1 库链接和DLL加载概述 1099
35.3 创建DLL库 1100
35.2 理解DLL库 1100
35.4 创建一个加载静态库的可执行程序 1103
35.5 一个加载动态DLL的可执行演示程序 1105
35.6 第三方DLL问题 1107
35.7 名字分解 1108
35.8 调用的约定 1109
35.8.1 解决调用约定问题 1110
35.9 使用别名 1111
35.10 静态库 1111
35.11 第三方静态库 1115
35.12 小结 1115