商家名称 |
信用等级 |
购买信息 |
订购本书 |
|
 |
开发巨匠:VisualC++6.0高级编程技术精粹 |
 |
|
 |
开发巨匠:VisualC++6.0高级编程技术精粹 |
 |

基本信息·出版社:科学出版社,北京科海电子出版社
·页码:608 页
·出版日期:2008年11月
·ISBN:7030229355/9787030229359
·条形码:9787030229359
·版本:第1版
·装帧:平装
·开本:16
·正文语种:中文
·图书品牌:科海培中
内容简介 《VisualC++6.0高级编程技术精粹》从应用程序开发的三个发展阶段出发,用大量实例系统地介绍了Visual C++ 6.0的编程基础、高级编程方法和技巧。《VisualC++6.0高级编程技术精粹》中主要内容包括Visual C++编程基础、集成开发环境、对话框和各种常见控件、消息机制、文档和视图、图形图像、文件处理、注册表操作、ActiveX编程、多媒体、多线程、数据库编程、动态链接库、COM编程、网络编程、钩子技术和托盘技术等。
《VisualC++6.0高级编程技术精粹》中在讲解各开发技术要点时,辅以大量源自工程实践的案例,同时,作者将从业8年以来的开发经验与技巧,以及大公司的先进开发理念融入到对技术的讲解与案例的分析中,以提高读者的开发效率。
《VisualC++6.0高级编程技术精粹》可用于自学或培训教材,适合有一定VC编程基础的读者。书中大量从实际项目开发中提取的具有工程实用价值的代码,对编程人员具有很好的参考意义。
编辑推荐 《开发巨匠:VisualC++6.0高级编程技术精粹》针对软件开发的实际技术需求,依据作者多年的编程实践。将VisualC++编程技术有序地归纳整理成三个部分:基础篇、提高篇和高级篇。书中详细讲解了日常开发所需的几乎所有关键技术要点,不仅如此,还重点介绍了一些高级主题,包括多线程编程、操作注册表、动态链接库、使用ADO操作数据库、COM编程、钩子(Hook)和托盘技术等等。掌握这些技术,读者就完全具备了从事VC高端编程的能力。为配合技术要点的讲解,书中给出了丰富的源自工程实践的案例,同时,作者将从业8年以来的开发经验与技巧,以及大公司的先进开发理念融入到对技术的讲解与案例的分析中。这些案例精彩而实用,读者可在此基础上直接进行二次开发。
目录 第1部分 基础篇
第1章 Visual C++编程基础 3
1.1 Windows编程基础 3
1.1.1 Windows基础 3
1.1.2 Windows API 6
1.2 C++语言基础 7
1.2.1 基本数据类型 8
1.2.2 表达式 11
1.2.3 控制语句 12
1.2.4 数组 15
1.2.5 指针 15
1.2.6 函数 16
1.2.7 类 19
1.3 MFC基础 26
1.3.1 MFC类库简介 26
1.3.2 MFC应用程序框架 27
1.3.3 MFC消息映射 28
1.3.4 程序实例:绘制直线 29
第2章 Visual C++ 6.0集成开发环境 37
2.1 菜单 37
2.1.1 File菜单 37
2.1.2 Edit菜单 38
2.1.3 View菜单 39
2.1.4 Insert菜单 40
2.1.5 Project菜单 41
2.1.6 Build菜单 41
2.1.7 Tools菜单 42
2.1.8 Window菜单 43
2.1.9 Help菜单 44
2.2 工具栏 45
2.2.1 工具栏的显示与隐藏 45
2.2.2 工具栏的定制与修改 46
2.3 项目面板 46
2.4 代码编辑器 47
2.5 调试窗口 48
第3章 基本控件 49
3.1 静态控件 49
3.1.1 静态控件概述 49
3.1.2 程序实例:用Static Text控件显示滚动文字 49
3.2 文本框 76
3.2.1 文本框概述 76
3.2.2 程序实例:输入格式化字符串的文本框 77
3.3 按钮 82
3.3.1 按钮概述 82
3.3.2 程序实例:Windows XP风格的按钮 83
3.4 列表框 97
3.4.1 列表框概述 98
3.4.2 程序实例:选项的左右移动 98
3.5 组合框 106
3.5.1 组合框概述 106
3.5.2 程序实例:三种风格的组合框 106
3.6 进度条 110
3.6.1 进度条概述 110
3.6.2 程序实例:显示文字的进度条 110
第4章 对话框 115
4.1 对话框的基础知识 115
4.2 模态对话框 115
4.2.1 模态对话框概述 115
4.2.2 程序实例:创建和显示模态对话框 116
4.3 非模态对话框 119
4.3.1 非模态对话框概述 119
4.3.2 程序实例:创建和显示非模态对话框 119
4.4 通用对话框 126
4.4.1 通用对话框概述 126
4.4.2 程序实例:显示9种通用对话框 126
第2部分 提高篇
第5章 文档和视图 133
5.1 文档和视图的基础知识 133
5.1.1 文档和视图的概念 133
5.1.2 文档和视图的关系 133
5.1.3 两类文档视图程序(SDI和MDI) 134
5.1.4 与文档视图程序相关的五个重要的类 134
5.1.5 有关文档类和视图类的五个重要的成员函数 137
5.1.6 与文档视图程序相关的三种基本组件 138
5.2 单文档 138
5.2.1 单文档概述 138
5.2.2 程序实例:让应用程序一启动就打开最近使用的文件 138
5.3 多文档 141
5.3.1 多文档概述 141
5.3.2 程序实例:实现在多个文档中位图的复制和粘贴操作 142
5.4 菜单 162
5.4.1 菜单概述 162
5.4.2 创建菜单 163
5.4.3 在应用程序中控制菜单 163
5.4.4 菜单消息处理 163
5.4.5 程序实例:实现弹出式菜单 163
5.5 工具栏 167
5.5.1 工具栏概述 167
5.5.2 创建工具栏 167
5.5.3 常见工具栏函数 168
5.5.4 程序实例:在工具栏中图标下面显示文本 171
5.6 状态栏 173
5.6.1 状态栏概述 173
5.6.2 创建状态栏 173
5.6.3 常见状态栏函数 174
5.6.4 程序实例:在状态栏中显示滚动的文本 175
第6章 消息机制 181
6.1 鼠标消息 181
6.1.1 鼠标消息分类 181
6.1.2 鼠标消息处理函数 181
6.1.3 程序实例:显示用户操作鼠标事件 182
6.2 键盘消息 188
6.2.1 键盘消息分类 188
6.2.2 键盘消息处理函数 188
6.2.3 虚拟键码 189
6.2.4 程序实例:显示用户操作键盘事件 190
6.3 定时器消息 198
6.3.1 定时器概述 198
6.3.2 与定时器相关的三个函数 199
6.3.3 程序实例:倒计时 199
6.4 自定义消息 203
6.4.1 消息的组成 203
6.4.2 消息号的范围及其含义 203
6.4.3 消息的发送 204
6.4.4 自定义消息处理的过程 204
6.4.5 程序实例:显示鼠标光标的坐标位置 205
第7章 图形图像 211
7.1 图形和图像的基础知识 211
7.1.1 图形和图像的概念 211
7.1.2 图形图像文件 212
7.1.3 颜色 213
7.1.4 分辨率 213
7.2 图形设备接口和设备上下文 215
7.2.1 图形设备接口 215
7.2.2 设备上下文 216
7.3 绘图操作类和窗口重画函数 216
7.3.1 三个重要的绘图操作类 216
7.3.2 三个支持窗口重画的函数 216
7.4 OnPaint()函数和OnDraw()函数 217
7.5 绘图工具的创建 217
7.5.1 画笔 217
7.5.2 画刷 219
7.5.3 字体 222
7.6 绘图工具的使用 225
7.6.1 绘图工具的使用步骤 225
7.6.2 程序实例1:创建3种类型的画笔 226
7.6.3 程序实例2:创建3种类型的画刷 229
7.6.4 程序实例3:创建4种类型的字体 231
7.7 文本操作 234
7.7.1 文本操作概述 234
7.7.2 程序实例:测试鼠标光标所在的Region 236
7.8 位图操作 241
7.8.1 位图的创建 241
7.8.2 设置位图的内容 242
7.8.3 位图的显示 243
7.8.4 程序实例:在SDI中显示指定的位图 243
第8章 文件处理 253
8.1 文件操作 253
8.1.1 6个重要的文件操作类 253
8.1.2 打开文件 256
8.1.3 读写文件 257
8.1.4 文件定位 257
8.1.5 关闭文件 257
8.1.6 查找文件 257
8.1.7 复制文件 258
8.1.8 删除文件 258
8.1.9 文件重命名 258
8.2 ini文件 258
8.2.1 ini文件的结构 258
8.2.2 两个重要的存取ini文件的函数 258
8.3 序列化 259
8.3.1 CArchive类 259
8.3.2 Serialize函数 261
8.4 程序实例 261
8.4.1 实例1:通过读写文件实现登录对话框 261
8.4.2 实例2:在文件打开对话框中选择多个文件 267
8.4.3 实例3:文件加密 275
8.4.4 实例4:用ini文件实现保留上一次打开过的文件 283
8.4.5 实例5:对画图文档实行序列化处理 287
第9章 注册表操作 303
9.1 注册表的基础知识 303
9.2 注册表的访问和修改 304
9.2.1 注册表的打开 304
9.2.2 注册表的修改 305
9.2.3 注册表的关闭 305
9.3 程序实例 306
9.3.1 实例1:限定软件的使用次数 306
9.3.2 实例2:修改IE主页 308
第3部分 高级篇
第10章 ActiveX编程 317
10.1 ActiveX控件基础知识 317
10.1.1 ActiveX的定义 317
10.1.2 ActiveX的核心内容 317
10.1.3 ActiveX控件的优点 318
10.1.4 ActiveX控件的组成 318
10.1.5 ActiveX控件的方法 318
10.1.6 ActiveX控件的属性 320
10.1.7 ActiveX控件的事件 321
10.1.8 ActiveX控件的两种操作模式 322
10.2 创建ActiveX控件 323
10.3 注册ActiveX控件 325
10.4 使用ActiveX控件 326
10.5 程序实例:电子时钟控件 327
第11章 多媒体编程 347
11.1 多媒体技术的基础知识 347
11.1.1 什么是多媒体技术 347
11.1.2 多媒体技术的特性 347
11.1.3 多媒体技术涉及的内容 348
11.2 音频技术 348
11.2.1 音频技术概述 348
11.2.2 程序实例:一款简洁实用的Mp3播放器 348
11.3 视频技术 357
11.3.1 视频技术概述 357
11.3.2 程序实例:用Media Player组件制作的视频播放器 357
11.4 图像压缩技术 362
11.4.1 图像压缩技术概述 362
11.4.2 程序实例:将BMP文件压缩成JPG文件 362
第12章 数据库编程 369
12.1 利用Visual C++开发数据库的优势 369
12.2 Visual C++提供的数据库访问技术 370
12.2.1 ODBC数据库访问技术 370
12.2.2 DAO数据库访问技术 370
12.2.3 ADO数据库访问技术 372
12.3 程序实例 376
12.3.1 实例1:通过ODBC读写Excel表格文件 376
12.3.2 实例2:通过DAO读写Access文件 387
12.3.3 实例3:通过ADO操作Access数据库 397
第13章 多线程 411
13.1 进程、线程和多线程的概念 411
13.1.1 基本概念 411
13.1.2 进程和程序的关系 412
13.1.3 进程和线程的关系 412
13.1.4 程序实例:进程管理器 412
13.2 多线程的基本工作原理 433
13.3 线程的分类 433
13.3.1 工作者线程 433
13.3.2 用户界面线程 434
13.3.3 程序实例1:使用工作者线程查找局域网内在线用户 435
13.3.4 程序实例2:使用用户界面线程实现软件的片头效果 449
13.4 线程的优先级 452
13.4.1 优先级类 453
13.4.2 优先级层 453
13.5 线程的基本操作 454
13.6 线程的同步 454
13.6.1 线程同步问题的产生 454
13.6.2 解决线程同步问题的方法 454
13.6.3 程序实例:使用4种方法解决线程同步问题 457
13.7 线程的通信 464
13.7.1 线程间的通信方式 464
13.7.2 程序实例:使用消息实现线程通信 465
第14章 动态链接库 469
14.1 动态链接库的基础知识 469
14.1.1 为何要使用动态链接库 470
14.1.2 动态链接库的调用方式 471
14.2 创建动态链接库 471
14.2.1 Win32 DLL的创建 472
14.2.2 程序实例1:获取最大和最小数(使用导出函数关键字) 473
14.2.3 程序实例2:获取最大和最小数(使用.def文件) 474
14.2.4 MFC DLL的创建 475
14.2.5 程序实例:显示问候信息 476
14.2.6 DllMain函数 480
14.2.7 在DLL中使用资源 481
14.3 调用动态链接库 487
14.3.1 隐式链接概述 488
14.3.2 程序实例:通讯录 488
14.3.3 显示链接概述 496
14.3.4 程序实例:关闭计算机 496
14.4 查看动态链接库导出信息的方法 502
第15章 COM编程 503
15.1 组件 503
15.1.1 什么是组件 503
15.1.2 使用组件的优点 503
15.2 接口 504
15.2.1 什么是接口 504
15.2.2 接口的作用 504
15.3 COM的基础知识 504
15.3.1 什么是COM 504
15.3.2 开发COM的目的 504
15.3.3 COM的本质 504
15.3.4 返回值HRESULT 505
15.3.5 GUID 505
15.3.6 IDL 505
15.3.7 IUnknown接口 507
15.3.8 类厂 508
15.3.9 引用计数 511
15.3.10 智能指针 511
15.4 COM的实现 512
15.5 程序实例:利用COM实现四则运算 515
第16章 网络编程 535
16.1 网络的基础知识 535
16.1.1 协议 535
16.1.2 分层模型 535
16.1.3 IP地址 536
16.1.4 端口 537
16.1.5 数据封装 537
16.1.6 套接字 537
16.2 WinSock编程 538
16.2.1 WinSock编程原理 538
16.2.2 WinSock常用函数 539
16.2.3 程序实例1:基于UDP的网络通信 545
16.2.4 程序实例2:基于TCP的聊天室 553
第17章 钩子技术 569
17.1 钩子的基础知识 569
17.1.1 钩子的原理 569
17.1.2 钩子的类型 570
17.2 钩子的实现 572
17.3 程序实例 573
17.3.1 实例1:类似金山词霸屏幕取词功能的鼠标钩子 573
17.3.2 实例2:利用键盘钩子屏蔽任意按键 581
第18章 托盘技术 589
18.1 托盘的基础知识 589
18.1.1 托盘的概述 589
18.1.2 托盘的访问 589
18.2 托盘的实现 590
18.3 程序实例:定时关机 591
附录 简明MFC类库参考列表 601
……
序言 Visual C++ 6.0是微软(Microsoft)公司开发的基于C/C++的集成开发工具,它综合了微软的基本类库(MFC),使开发Windows应用程序得以简单化,还提供了多种资源编辑器,可以对菜单、位图、对话框、工具栏等资源进行编辑。编辑器拥有自动代码生成功能,可自动提示函数的参数、对象的成员等内容。Visual C++ 6.0提供了很多向导,使得编程过程更加容易,另外还有强大的调试(Debug)工具,可以从各个角度检查程序运行的每一步结果。
一般用户利用Visual C++ 6.0以两种方式编写Win32应用程序,一种方式是基于Windows API的C编程方式,另一种则是基于MFC的C++编程方式。C编程方式比较传统,它是面向过程的,代码的效率较高,但是开发难度和开发的工作量大。C++编程方式是面向对象的,代码运行效率相对较低,但是开发难度小,开发工作量也较小。利用C编程方式的用户已经很少,本书将以C++方式向用户介绍利用Visual C++ 6.0进行Win32应用程序的开发。
本书导读
本书在内容组织上循序渐进、由浅入深,在知识讲解上注重原理与实践的结合。全书包含3个部分,共18章。下面给出每一部分、每一章的简要内容。
● 第1部分“基础篇”包括4章:Visual C++编程基础、集成开发环境、基本控件和对话框。
第1章介绍Windows编程基础、C++语言基础和MFC基础。初学者通过本章的学习可以了解C++的编程思想、特点及基本概念。
第2章介绍Visual C++ 6.0的编程环境——菜单、工具栏、项目面板、代码编辑器和调试窗口,使用户尽快熟悉Visual C++ 6.0集成开发环境。
第3章介绍常用控件——静态控件、文本框、按钮、列表框、组合框和进度条。
第4章介绍可视化编程中常用的对话框,包括模态、非模态和通用对话框。
● 第2部分“提高篇”包括5章:文档和视图、消息机制、图形图像、文件处理和注册表操作。
第5章介绍Visual C++中的基本思想——文档和视图,还包括与之相关的菜单、工具栏和状态栏。
第6章介绍Visual C++中的重要概念——消息。Windows应用程序采用消息驱动机制,深入理解消息机制,对Windows应用程序的编写有很大的帮助。
第7章介绍图形图像编程,重点讲述GDI、DC、常用的绘图工具、文本操作和位图操作,以及OnPaint()函数和OnDraw()函数的区别。
第8章介绍文件操作,包括文件的读写、查找和复制等,还介绍了ini文件和文档的序列化编程。
第9章介绍有关注册表的操作。包括注册表的访问、修改和关闭。
● 第3部分“高级篇”包括9章:ActiveX、多媒体、数据库、多线程、动态链接库、COM编程、网络编程、钩子技术和托盘技术。
第10章介绍ActiveX编程技术,用实例说明ActiveX控件的创建、注册和使用。
第11章介绍多媒体编程技术,包括常见的3种技术——音频、视频和图像压缩。
第12章介绍数据库编程,详细讲述Visual C++中3种数据库访问技术——ODBC、DAO和ADO。提供的实例生动鲜明,很有代表性。
第13章介绍多线程编程的基本原理和具体实现。多线程编程是Visual C++ 6.0编程中的热点话题之一,代表高级编程技术,采用多线程编程能使应用程序运行效率更高。
第14章介绍动态链接库的创建和调用,并提供具体的实例。
第15章介绍Visual C++ 6.0编程中的顶级编程技术——COM编程。系统讲述与COM相关的概念,并用实例说明COM的实现。
第16章介绍基于网络的编程技术,包括与网络相关的一些概念,重点讲解WinSocket编程,并附有两个典型的实例。
第17章介绍钩子的基本原理及其具体的实现。
第18章用实例说明系统托盘程序的具体实现过程。现在市面上很少有书提到该技术,本书弥补了这一点。
另外,本书附录简明地介绍了MFC的类库。
本书约定
(1)书中提到的“用粗体标注的代码”和“添加具体函数的实现代码”都属于新增加的代码。
(2)书中提到的“……”表示在此可以添加别的内容。
学习建议
为了能够直观、详细地说明整个MFC应用程序的开发过程,本书提供了大量的源程序,这些源程序在Windows XP + Visual C++ 6.0 + SP5下都已编译和调试成功。
本书配套光盘的Examples文件夹中包括各章示例程序的全部源代码,这对于读者掌握MFC应用程序的开发有很大帮助,在此基础上读者可以进行二次开发。下面给出几点学习建议:
(1)对初学者而言,学习应该由浅入深,逐个掌握。
(2)学习每一章时,最好先仔细阅读基础知识或概要内容,为编程打好基础,然后再阅读程序代码。
(3)建议读者不要一上来就看光盘中的源程序,最好跟随本书中的基础知识和实例代码来完成相关功能,实在调试不通或实现不了,再参考光盘中的源程序。
致谢
本书由飞扬科技策划,根据作者多年的Visual C++项目实践经验精心编写而成。在本书的编写过程中,我们力求精益求精,但难免存在一些不足之处,敬请广大读者批评指正。
知识无止境,欢迎对Visual C++感兴趣的朋友加入我们,让我们共同进步!
Visual C++ 6.0是微软(Microsoft)公司开发的基于C/C++的集成开发工具,它综合了微软的基本类库(MFC),使开发Windows应用程序得以简单化,还提供了多种资源编辑器,可以对菜单、位图、对话框、工具栏等资源进行编辑。编辑器拥有自动代码生成功能,可自动提示函数的参数、对象的成员等内容。Visual C++ 6.0提供了很多向导,使得编程过程更加容易,另外还有强大的调试(Debug)工具,可以从各个角度检查程序运行的每一步结果。
一般用户利用Visual C++ 6.0以两种方式编写Win32应用程序,一种方式是基于Windows API的C编程方式,另一种则是基于MFC的C++编程方式。C编程方式比较传统,它是面向过程的,代码的效率较高,但是开发难度和开发的工作量大。C++编程方式是面向对象的,代码运行效率相对较低,但是开发难度小,开发工作量也较小。利用C编程方式的用户已经很少,本书将以C++方式向用户介绍利用Visual C++ 6.0进行Win32应用程序的开发。
本书导读
本书在内容组织上循序渐进、由浅入深,在知识讲解上注重原理与实践的结合。全书包含3个部分,共18章。下面给出每一部分、每一章的简要内容。
● 第1部分“基础篇”包括4章:Visual C++编程基础、集成开发环境、基本控件和对话框。
第1章介绍Windows编程基础、C++语言基础和MFC基础。初学者通过本章的学习可以了解C++的编程思想、特点及基本概念。
第2章介绍Visual C++ 6.0的编程环境——菜单、工具栏、项目面板、代码编辑器和调试窗口,使用户尽快熟悉Visual C++ 6.0集成开发环境。
第3章介绍常用控件——静态控件、文本框、按钮、列表框、组合框和进度条。
第4章介绍可视化编程中常用的对话框,包括模态、非模态和通用对话框。
● 第2部分“提高篇”包括5章:文档和视图、消息机制、图形图像、文件处理和注册表操作。
第5章介绍Visual C++中的基本思想——文档和视图,还包括与之相关的菜单、工具栏和状态栏。
第6章介绍Visual C++中的重要概念——消息。Windows应用程序采用消息驱动机制,深入理解消息机制,对Windows应用程序的编写有很大的帮助。
第7章介绍图形图像编程,重点讲述GDI、DC、常用的绘图工具、文本操作和位图操作,以及OnPaint()函数和OnDraw()函数的区别。
第8章介绍文件操作,包括文件的读写、查找和复制等,还介绍了ini文件和文档的序列化编程。
第9章介绍有关注册表的操作。包括注册表的访问、修改和关闭。
● 第3部分“高级篇”包括9章:ActiveX、多媒体、数据库、多线程、动态链接库、COM编程、网络编程、钩子技术和托盘技术。
第10章介绍ActiveX编程技术,用实例说明ActiveX控件的创建、注册和使用。
第11章介绍多媒体编程技术,包括常见的3种技术——音频、视频和图像压缩。
第12章介绍数据库编程,详细讲述Visual C++中3种数据库访问技术——ODBC、DAO和ADO。提供的实例生动鲜明,很有代表性。
第13章介绍多线程编程的基本原理和具体实现。多线程编程是Visual C++ 6.0编程中的热点话题之一,代表高级编程技术,采用多线程编程能使应用程序运行效率更高。
第14章介绍动态链接库的创建和调用,并提供具体的实例。
第15章介绍Visual C++ 6.0编程中的顶级编程技术——COM编程。系统讲述与COM相关的概念,并用实例说明COM的实现。
第16章介绍基于网络的编程技术,包括与网络相关的一些概念,重点讲解WinSocket编程,并附有两个典型的实例。
第17章介绍钩子的基本原理及其具体的实现。
第18章用实例说明系统托盘程序的具体实现过程。现在市面上很少有书提到该技术,本书弥补了这一点。
另外,本书附录简明地介绍了MFC的类库。
本书约定
(1)书中提到的“用粗体标注的代码”和“添加具体函数的实现代码”都属于新增加的代码。
(2)书中提到的“……”表示在此可以添加别的内容。
学习建议
为了能够直观、详细地说明整个MFC应用程序的开发过程,本书提供了大量的源程序,这些源程序在Windows XP + Visual C++ 6.0 + SP5下都已编译和调试成功。
本书配套光盘的Examples文件夹中包括各章示例程序的全部源代码,这对于读者掌握MFC应用程序的开发有很大帮助,在此基础上读者可以进行二次开发。下面给出几点学习建议:
(1)对初学者而言,学习应该由浅入深,逐个掌握。
(2)学习每一章时,最好先仔细阅读基础知识或概要内容,为编程打好基础,然后再阅读程序代码。
(3)建议读者不要一上来就看光盘中的源程序,最好跟随本书中的基础知识和实例代码来完成相关功能,实在调试不通或实现不了,再参考光盘中的源程序。
致谢
本书由飞扬科技策划,根据作者多年的Visual C++项目实践经验精心编写而成。在本书的编写过程中,我们力求精益求精,但难免存在一些不足之处,敬请广大读者批评指正。
知识无止境,欢迎对Visual C++感兴趣的朋友加入我们,让我们共同进步!
文摘 插图: