本书从对Windows,Visual C++ 和应用程序框架的技术性概述入手,讨论了下列课题:
基础知识:事件处理,GDI,对话框,内存管理,SDI和MDI,打印,以及帮助
高级课题:多线程,DIB,ODBC,DLL
ActiveX:创建文档对象和ActiveX控件,COM,自动化,实用支持COM的各种向导和编译器扩展
Internet的C++编程:Windows,MFC WinInet,以及为Microsoft Internet Information Server进行ISAPI扩展编程
前 言
第一部分 Windows、Visual C++和应用程序框架基础
第一章 Microsoft Windows和Visual C++
1.1 Windows的编程模式
1.1.1 消息处理
1.1.2 Windows的图形设备接口(GDI)
1.1.3 基于资源的程序设计
1.1.4 内存管理
1.1.5 动态连接库(DLL)
1.1.6 Win32应用程序编程接口
1.2 Visual C++的组成
1.2.1 Microsoft Developer Studio 97和创建过程
1.2.2 资源编辑器——Workspace Resource View
1.2.3 C/C++编译器
1.2.4 资源编译器
1.2.5 连接器
1.2.6 调试器
1.2.7 AppWizard
1.2.8 C1assWizard
1.2.9 源程序浏览器
1.2.10 联机帮助
1.2.11 Windows诊断工具
1.2.12 源代码控制
1.2.13 Gallery
1.2.14 Microsoft基本类库4.21版
1.2.15 Microsoft ActiveX模板库
第二章 Microsoft基本类库应用程序框架
2.1 为什么要使用应用程序框架
2.1.1 学习曲线
2.2 什么是应用程序框架
2.2.1 应用程序框架和MFC库
2.2.2 应用程序框架示例
2.3 MFC库消息映射
2.3.1 文档和视图
第二部分 MDC库中的视图类
第三章 从“Hello,world!”着手学习AppWizard
3.1 什么是视图
3.2 单文档界面(SDI)和多文档界面(MDI)
3.3 “不做任何事情”的应用程序
3.4 CEx03aView视图类
3.5 在视窗内绘图——Windows的图形设备接口
3.5.1 0nDraw成员函数
3.5.2 Windows设备环境
3.5.3 往EK03A程序中加入绘制代码
3.6 资源编辑器简介
3.6.1 ex03a.rc的内容
3.6.2 运行对话框资源编辑器
3.7 Win32 Debug目标和Win32 Release目标
3.8 允许诊断宏
3.9 对预编译头文件的理解
3.10 两种方法运行程序
第四章 基本事件处理、映射模式和滚动视图
4.1 获取用户输入——消息映射函数
4.1.1 消息映射
4.1.2 保存视图的状态—类数据成员
4.1.3 初始化视图类数据成员
4.1.4 使矩形区域无效
4.1.5 Windows的客户区域
4.1.6 CRect,CPoint和CSize类的运算
4.1.7 一个点是否在矩形内
4.1.8 CRect的LPRECT操作符
4.1.9 一个点是否在椭圆内
4.2 EX04A示例程序
4.3 对EX04A使用ClassWizard
4.3.1 同时使用AppWizard和ClassWizard
4.4 映射模式
4.4.1 MM_TEXT映射模式
4.4.2 “固定比例”映射模式
4.4.3 “可变比例”映射模式
4.4.4 坐标变换
4.4.5 EX04B示例程序——转换到MM_HIMETRIC映射模式
4.5 滚动视窗
4.5.1 窗口比人们所见到的要大
4.5.2 滚动条
4.5.3 滚动方式的选择
4.5.4 OnInitialUpdate函数
4.5.5 接收键盘输入
4.5.6 EX04C滚动示例程序
4.6 其他Windows消息
4.6.1 WM_CREATE消息
4.6.2 WM_CLOSE消息
4.6.3 WM_QUERYENDSESSION消息
4.6.4 WM_DESTROY消息
4.6.5 WM_NCDESTROY消息
第五章 图形设备接口(GDI)、颜色及字体
5.1 设备环境类
5.1.1 显示设备环境类CClienDC和CWindowsDC
5.1.2 构造和析构CDC对象
5.1.3 设备环境的状态
5.1.4 CPaint DC类
5.2 GDI对象
5.2.1 GDI对象的构造与析构
5.2.2 跟踪GDI对象
5.2.3 库存的GDI对象
5.2.4 GDI选择的有效期
5.3 Windows的颜色映射
5. 3.1 标准视频图形阵列(VGA)显示卡
5.3.2 256色显示卡
5.3.3 16位颜色显示卡
5.3.424位颜色显示卡
5.4 字体
5.4.1 字体是GDI对象
5.4.2 选择字体
5.4.3 打印字体
5.4.4 显示字体
5.4.5 显示器的逻辑英寸和物理英寸
5.4.6 计算字符高度
5.5 EX05A示例程序
5.5.1 EX05A程序的组成元素
5.6 EX05B程序
5.6.1 EX05B程序的组成元素
5.7 EX05C示例程序——再次使用CScrollView
5.7.1 EX05C程序的组成元素
5.7.2 CScrollView的SetScaleToFitSize模式
5.7.3 在滚动视图中使用逻辑twips映射模式
第六章 模式对话框和Windows通用控件
6.1 模式和无模式对话框
6.2 资源和控件
6.3 模式对话框的编程
6.4 包罗万象的对话框——EX06A示例程序
6.4.1 创建对话框资源
6.4.2 C1assWizard和对话框类
6.4.3 将对话框与视图相连接
6.4.4 深入理解EX06A应用程序
6.5 对话框程序的改进
6.5.1 获得OnOK退出控制
6.5.2 OnCancel处理
6.5.3 和滚动条控件挂上钩
6.6 控件的标识:CWnd指针和控件ID
6.7 设置对话框的背景色和其中控件的颜色
6.8 在对话框窗口内绘图
6.9 在运行时加入对话框控件
6.10 利用其他的控件特性
6.11 Windows通用控件
6.11.1 进度指示器控件
6.11.2 滑杆条(Trackbar)控件
6.11.3 微调按钮控件
6.11.4 列表控件
6.11.5 树状控件
6.11.6 WM_NOTIFY消息
6.12 EX06B示例程序
6.13 其他Windows通用控件
第七章 无模式对话框和Windows通用对话框类
7.1 无模式对话框
7.1.1 创建无模式对话框
7.1.2 用户定义的消息
7.1.3 对话框的归属
7.1.4 无模式对话框的例子——EX07A
7.2 CrormView类——另外一种可供选择的无模式对话框
7.3 Windows通用对话框
7.3.1 直接使用CFileDialog类
7.3.2 从通用对话框类进行派生
7.3.3 嵌套对话框
7.3.4 使用CFileDialog的一个例子——EX07B
7.3.5 CFileDialog的其他可定制特性
第八章 使用ActiveX控件
8.1 Activex控件和普通的Windows控件
8.1.1 普通的Windows控件——参考体系
8.1.2 Activex控件与普通控件的相同点
8.1.3 Activex控件与普通控件的不同点——属性和方法
8.2 安装Activex控件
8.3 日历控件
8.4 Activex控件包容器编程
8.4.1 属性访问
8.4.2 C1assWizard为Activex控件产生的C++类
8.4.3 AppWizard对ActiveX控件的支持
8.4.4 C1assWizard和包容器对话框
8.4.5 对话框类数据成员和控件类的用法
8.4.6 映射ActiveX控件事件
8.4.7 把ActiveX控件锁定在内存里
8.5 EX08A示例程序——Activex控件对话框包容器
8.6 Activex控件在HTML文件中的使用
8.7 在运行时创建ActiveX控件
8.8 EX08B示例程序——Web浏览器ActiveX控件
8.9 EX08C示例程序——一个完整的双窗口浏览器
8.10 图形属性
8.11 约束属性——改变通知
8.12 其他的Activex控件
第九章 Win32内存管理
9.1 进程和内存空间
9.1.1 Windows 95进程地址空间
9.1.2 Windows NT进程地址空间
9.2 虚拟内存如何工作
9.3 VirtualAlloc函数——占用和保留内存
9.4 Windows堆和G1obalAlloc函数族
9.5 小内存堆,C++的new和delete操作符,_heapmin
9.6 内存映射文件
9.7 访问资源
9.8 管理动态内存的一些提示
9.9 常量数据的优化存储
第十章 位图
10.1 GDI位图和与设备无关的位图
10,2 彩色位图和单色位图
10.3 使用GDI位图
10.3.1 从资源中装入GDI位图
10.3.2 显示映射模式的作用
10.3.3 对位进行伸缩处理
10.3.4 EXl0A示例程序
10.4 利用位图改进屏幕显示
10.4. 1 EXl0B示例程序
10.4.2 Windows动画
10.5 DIB和CDib类
10.5.1 关于调色板编程的术语
10.5.2 DIB、象素和颜色表
10.5.3 BMP文件中DIB的结构
10.5.4 DIB访问函数
10.5.5 CDib类
10.5.6 DIB显示性能
10.5.7 EXl0C示例程序
10.6 进一步使用DIB
10.6.1 LoadImage函数
10.6.2 DrawDibDraw函数
10.7 在按钮上设置位图
10.7.1 EXl0D示例程序
10.7.2 进一步使用位图按钮
第十一章 Windows消息处理和多线程编程
11.1 Windows消息处理
11.1.1 单线程程序处理消息的过程
11.1.2 交出控制
11.1.3 计时器
11.1.4 EX11A示例程序
11.2 空状态处理
11.3 多线程编程
11.3.1 编写辅助线程函数和启动线程
11.3.2 主线程如何和辅助线程通话
11.3.3 辅助线程如何和主线程通话
11.3.4 EX11B示例程序
11.3.5 用事件使线程同步
11.3.6 EXllC示例程序
11.3.7 线程阻塞
11.3.8 排斥区
11.3.9 互斥体(mutex)和信号(semaphore)
11.3.10 用户界面线程(UI线程)
第三部分 文档—视图结构
第十二章 菜单、键盘加速键、复文本编辑控件和属性表
12.1 主框架窗口和文档类
12.2 Windows的菜单
12.3 键盘加速键
12.4 命令处理
12.4.1 派生类中的命令消息控制
12.4.2 更新命令用户界面消息控制函数
12.4.3 对话框发送的命令
12.5 应用程序框架的内含菜单项
12.6 菜单项的允许/禁用
12.7 MFC文本编辑选择
12.7.1 CEditView类
12.7.2 CRichEditView类
12.7.3 CRichEditCtrl类
12.8 EXl2A示例程序
12.9 属性表
12.9.1 创建属性表
12.9.2 属性表数据交换
12.10 改进EXl2A示例程序
12.11 Apply按钮的处理过程
12.12 CMenu类
12.13 创建浮动的弹出式菜单
12.14 扩展命令处理
第十三章 工具栏和状态栏
13.1 控制栏和应用程序框架
13.2 工具栏
13.2.1 工具栏位图
13.2.2 按钮的状态
13.2.3 工具栏和命令消息
13.2.4 工具栏更新命令UI消息控制函数
13.3 工具提示
13.4 寻找主框架窗口
13.5 EXl3A工具栏示例程序
13.6 状态栏
13.6.1 状态栏的定义
13.6.2 信息行
13.6.3 状态指示器
13.6.4 获得对状态栏自
13.7 EXl3B状态栏示例程序
第十四章 可重用框架窗口基类
14.1 为什么可重用基类难以设计
14.2 CPelsistentFrame类
14.3 CFrameWnd类和ActivateFrame成员函数
14.4 PreCreateWindow成员函数
14.5 Window注册表
14.6 使用CString类
14.7 最大化窗口的位置
14.8 控制栏状态和注册表
14.9 静态数据成员
14.10 默认窗口矩形
14.11 EXl4A示例程序
14.12 MDI应用程序中的持续框架
第十五章 文档与视图的分离
15.1 文档—视图之间的相互作用函数
15.1.1 CView::GetDocument函数
15.1.2 CDocumeat::UpdateViews函数
15.1.3 CView::OnUpdate函数
15.1.4 CView::0nInitialUpdate函数
15.1.5 CDocument::0nNewDocument函数
15.2 最简单的文档—视图应用程序
15.3 CFormView类
15.4 C0bject类
15.5 诊断信息转储
15.5.1 TRACE宏
15.5.2 afxDump对象
15.5.3 信息转储环境及CObject类
15.5.4 未被删除对象的自动信息转储
15.6 EX15A示例程序
15.7 更加高级的文档—视图之间的相互作用
15.8 CDocument::Deletdontents函数
15.9 C0bList集合类
15.9.1 对先入先出列表使用C0bList类
15.9.2 在CObList中进行迭代——POSITION变量
15.9.3 CTypedPtrList模板集合类
15.9.4 信息转储环境及集合类
15.10 EX15B示例程序
15.10.1 资源要求
15.10.2 代码要求
15.10.3 CStudentDoc
15.10.4 CStudentView
15.10.5 测试EXl5B应用程序
15.11 留给读者的两个练习
第十六章 读和写文档———SDI应用程序
16.1 什么是序列化
16.1.1 磁盘文件和归档(Archives)
16.1.2 使类可序列化
16.1.3 编写Selldize函数
16.1.4 从归档中载入——内嵌对象和指针
16.1.5 使集合序列化
16.1.6 Serialize函数和应用程序框架
16.2 SDI应用程序
16.2.1 Windows应用程序对象
16.2.2 文档模板类
16.2.3 文档模板资源
16.2.4 SDI文档的多视图
16.2.5 创建空文档——CWinApp::OnFileNew函数
16.2.6 文档类的OnNewDocument函数
16.2.7 连接Fi1eOpen与序列化代码——OnFileOpen函数
16.2.8 文档类的DeleteContents函数
16.2.9 将FileSave和FileSave As与序列化代码相连接
16.2.10 文档的“脏”标志
16.3 EXl6A———序列化SDI示例程序
16.3.1 CSudent
16.3.2 CEx16aApp
16.3.3 CFrameWnd
16.3.4 CStudentDoc
16.3.5 CShdentView
16.3.6 测试EXl6A应用程序
16.4 从Explorer启动及拖放
16.4.1 程序注册
16.4.2 在文档上双击鼠标
16.4.3 允许拖放
16.4.4 程序启动参数
16.4.5 试验用Explorer启动程序及拖放功能
第十七章 读和写文档———MDI应用程序
17.1 MDI应用程序
17.1.1 一个典型的具有MFC库风格的MDI应用程序
17.1.2 MDI应用程序对象
17.1.3 MDI文档模板类
17.1.4 MDI框架窗口和MDI子窗口
17.1.5 主框架和文档模板资源
17. 1.6 创建空文档——CWinApp::OnFileNew函数
17.1.7 为现有文档创建新的视图
17. 1.8 载入和存储文档
17. 1.9 多文档模板
17. 1.10 Explorer启动及拖放
17.2 EXl7A示例程序
17. 2.1 CEx17aApp
17.2.2 CMainFrame
17. 2.3 CChiLdFrame
17.2.4 测试EX17A应用程序
露十八章 打印和打印预览
18.1 Windows的打印
18.1.1 标准打印对话框
18.1.2 交互选择打印页码
18.1.3 显示页和打印页
18.2 打印预览
18.3 有关打印机的程序设计
18.3.1 打印机设备环境和CViev::0nDraw函数
18.3.2 CView::0nPrint函数
18.3.3 准备设备环境——CView::OnPrepareDC函数
18。3.4 打印任务的开始和结束
18.4 EX18A示例程序——一个所见即所得的打印程序
18.5 读取打印机矩形框
18.6 再看模板集合类——CArray类
18.7 EXl8B示例程序——多页打印程序
第十九章 切分窗口和多视图
19.1 切分窗口
19.2 多视图选择
19.3 动态和静态切分窗口
19.4 EXl9A示例程序——具有单个视图类的SDI动态切分
19.4.1 与切分有关的资源
19.4.2 CMainFrame
19.4.3 测试EXl9A应用程序
19.5 EXl9B示例程序——双视图类别I静态切分
19.5.1 CHexView
19.5.2 CMainFrame
19.5.3 测试账19B应用程序
19.6 EXl9C示例程序——切换没有切分的视图类
19.6.1 资源要求
19.6.2 CMainFrame
19.6.3 测试EXl9C应用程序
19.7 EXl9D示例程序——多视图类MDI应用程序
19.7.1 资源要求
19.7.2 CEx19dApp
19.7.3 CMainFrame
19.7.4 测试EX19D应用程序
第二十章 上下文相关帮助
20.1 Windows的WinHelp程序
20.1.1 复文本格式(RTF)
20.1.2 编写简单的帮助文件
20.1.3 改进的Table of Contents
20.2 应用程序框架与WinHelp
20.2.1 调用WidHelp
20.2.2 使用搜索字符串
20.2.3 从应用程序的菜单调用WinHelp
20.2.4 帮助上下文别名
20.2.5 确定帮助上下文
20.2.6 F1帮助
20.2.7 Shift—F1帮助
20.2.8 消息框帮助——AfxMessageBox函数
20.2.9 一般的帮助
20.3 帮助示例——不需要任何编程
20.4 MAKEHELP处理
20.5 帮助命令处理
20.5.1 F1处理过程
20.5.2 Shift—F1处理过程
20.6 帮助命令处理示例程序——KK2OB
20.6.1 头文件要求
20.6.2 CStringView
20.6.3 CHexView
20.6.4 资源要求
20.6.5 帮助文件要求
20.6.6 测试EX20B应用程序
第二十一章 动态连接库
21.1 基本DLL理论
21.1.1 导入如何与导出相匹配
21.1.2 隐式连接和显式连接
21.1.3 符号连接和序号连接
21.1.4 DLL入口点——DllMain
21.1.5 实例句柄——装载资源
21.1.6 客户程序如何找到DLL
21.1.7 调试DLL
21.2 MFC DLL——扩展的和正规的
21.2.1 共享的MPC DLL和Windows DLL
21.2.2 MFC扩展DLL——导出类
21.2.3 MFC扩展DLL资源搜索的顺序
21.2.4 EX21A示例程序——MFC扩展DLL
21.2.5 EX21B示例程序——DLL测试客户程序
21.2.6 MFC正规DLL——CWinApp派生类
21.2.7 使用AFX_MANAGE_STATE宏
21.2.8 MPC正规DLL资源搜索顺序
21.2.9 EX21C示例程序——MFC正规DLL
21.2.10 修改EX21B示例程序——加入代码以测试
21.3 自定义控件DLL
21.3.1 什么是自定义控件
21.3.2 自定义控件的窗口类
21.3.3 MFC库和WndProc函数
21.3.4 自定义控件通知消息
21.3.5 发送给控件的用户定义消息
21.3.6 EX21D示例程序——自定义控件
21.3.7 再修改EX21B示例程序——加入代码以测试
第二十二章 不带文档或视图类的MFC程序
22.1 EX22A示例程序——一个基于对话框的应用程序
22.1.1 应用程序类InitInstance函数
22.1.2 对话框类和程序图标
22.2 EX22B示例——一个别I应用程序
22.2.1 应用程序类InitInstance函数
22.2.2 CMainFrame类
22.3 EX22C示例程序——一个MDI应用程序
22.3.1 应用类程序InitInstance函数
22.3.2 CMainFrame类
22.3.3 CChildFrame类
22.3.4 资源要求
22. 4 定制(Custom)AppWizard
第四部分 ActiveX:组件对象模型、自动
第二十三章 组件对象模型
23.1 ActiveX技术背景
23.2 组件对象模型(COM)
23.2.1 COM所解决的问题
23.2.2 COM的本质
23.2.3 什么是COM接口
23.2.4 IUnknown接口和QueryInterface成员函数
23.2.5 引用计数:AddRef和Release函数
23.2.6 类厂(c1assfactory)
23.2.7 CCmdTarget类
23.2.8 EX23A示例程序——一个模拟的COM
23.3 MFC库中实际的COM
23.3.1 COM的CoGetClassObject函数
23.3.2 COM和Windows注册表
23.3.3 运行时对象注册
23.3.4 COM客户程序如何调用进程内组件
23.3.5 COM客户程序如何调用进程外组件
23.3.6 MFC接口宏
23.3.7 MFC的CO1dbjectFactory类
23.3.8 AppWizard/C1assWizard对COM进程内组件的支持
23.3.9 MFC COM客户程序
23.3.10 EX23B示例程序——MFC COM进程内组件
23.3.11 EX23C示例程序——MFC COM客户
23.4 包容、集合和继承
第二十四章 自动化
24.1 C++与Visual Basic for Applications(VBA)之间的连接
24.2 自动化客户和自动化组件
24.3 Microsoft Excel———一种比Visual Basic还好的VisualBasic
24.4 属性(property)、方法(method)和集合(collection)
24.5 自动化所解决的问题
24.6 IDispatch接口
24.7 自动化程序设计的选择
24.8 MFC IDispatch的实现
24.9 一个MFC自动化组件
24.10 一个MFC自动化客户程序
24.11 使用编译器#import指令的自动化客户程序
24.12 VARIANT类型
24.13 C01eVariant类
24.14 Invoke的参数和返回值的类型转换
24.15 自动化示例
24.15.1 EX24A自动化组件EXE示例——不带任何用户界面
24.15.2 EK24B自动化组件DLL示例程序
24.15.3 EX24C SDI自动化组件EXE示例——带用户界面
24.15.4 EX24D自动化客户示例程序
24.15.5 EX24E自动化客户示例程序
24.16 VBA早绑定
24.16.1 注册类型库
24.16.2 组件如何注册自己的类型库
24.16.3 ODL文件
24.16.4 Excel如何使用类型库
24.16.5 为什么使用早绑定
24.16.6 客户—组件的快速连接
第二十五章 统一数据传输——剪贴板传输以及oI及拖放
25.1 IDataObject接口
25.2 IDataObject如何增强标准剪贴板的支持
25.3 FORMATETC和STGMEDIUM结构
25.3.1 FORMATETC
25.3.2 STGMEDIUM
25.3.3 IDataObject接口成员函数
25.4 MFC统一数据传输支持
25.4.1 C01eDahlSource类
25.4.2 C0leabObject类
25.4.3 MFC数据对象剪贴板传输
25.5 MFC CRectTracker类
25.5.1 CRectTracker类成员函数
25.5.2 CRectTracker类矩形坐标转换
25.6 EX25A示例程序——数据对象剪贴板
25.6.1 CMainFrame类
25.6.2 CEx25aDoc类
25.6.3 CEx25aView类
25.7 MFC拖放
25.7.1 传输的源方
25.7.2 传输的目标方
25.7.3 拖放的顺序
25.8 EX25B示例程序——OLE拖放
25.8.1 CEx25bDoc类
25.8.2 CEx25View类
25.9 Windows应用程序和拖放——Dobjview
第二十六章 结构化存储
26.1 复合文件
26.2 存储(Storage)和IStorage接口
26.2.1 获取IStorage指针
26.2.2 释放STATSTG内存
26.2.3 对存储对象的元素进行枚举
26.2.4 进程间共享存储
26.3 流(Stream)和IStream接口
26.3.1 IStream接口成员函数
26.3.2 IStream编程
26.4 ILockBytes接口
26.5 EX26A示例程序——结构化存储
26.5.1 菜单
26.5.2 CEx26View类
26.5.3 辅助线程
26.6 结构化存储和持久COM对象
26.6.1 IPersistStorage接口
26.6.2 IPersisdStream接口
26.6.3 IPersistStream编程
26.7 EX26B示例程序——一个持久DLL组件
26.8 EX26C示例程序——一个持久存储客户程序
26.9 复合文件碎片的处理
26.10 复合文件的其他优点
第二十七章 OLE嵌入组件和包容器
27.1 嵌入和实地激活(可视编辑)
27.2 最小服务器和完备服务器(组件)——链接
27.3 可视编辑前景暗淡的一面
27.4 Windows图元文件和内线对象
27.5 组件程序的MFC 0LE结构
27.6 EX27A示例程序——MFC实地激活最小服务器
27.6.1 MDI嵌入组件
27.6.2 实地组件调整大小的思路
27.7 包容器—组件相互作用
27.7.1 使用组件的IOleObject接口
27.7.2 装入和保存组件自身的数据——组件文档
27.7.3 剪贴板数据传输
27.7.4 获得组件的图元文件
27.7.5 进程内控制器的角色
27.8 组件状态
27.8.1 包容器接口
27.8.2 通报连接
27.8.3 剪贴板图元文件
27.9 接口简要说明
27.9.1 IOleObject接口
27.9.2 IViewObject2接口
27.9.3 I01eClieHtSite接口
27.9.4 IAdviseSink接口
27.10 0LE辅助函数
27.11 0LE嵌入包容器应用程序
27.11.1 MFC对LEE包容器的支持
27.11.2 一些包容器限制
27.11.3 包容器特性
27.12 EX27B示例程序——嵌入包容器
27.12.1 CEx27bView类
27.12.2 CEx27bDoc类
27.13 EX27C示例程序——0LE嵌入组件
27.13.1 CEx27cView类
27.13.2 CEx27cDDc类
第五部分 数据库管理
第二十八章 Microsoft 0DBC数据库管理
28.1 数据库管理的优势
28.2 结构化查询语言
28.3 0DBC标准
28.3.1 0DBC结构
28.3.2 ODBC SDK编程
28.4 MFC ODBC类——CRecodset和CDah加以
28.4.1 记录集中关于行的计数
28.4.2 处理0DBC异常
28.5 学生注册数据库
28.6 EX28A记录集示例程序
28.7 EX28A示例程序中的元素
28.7.1 记录集类与应用程序之间的连接
28.7.2 CEx28aView类的0nIntialUpdate成员函数
28.7.3 CEX28aView类的OnDraw成员函数
28.8 筛选器和排序字符串
28.9 连接两个数据库表
28.10 MFC CRecordView类
28.11 EX28B记录查看示例程序
28.12 多记录集
28.12.1 EX28C多记录集示例程序
28.12.2 参数化查询
28.13 ODBC多线程
28.14 大批行数据获取(bulk fetch)
28.15 使用不带绑定的记录集
第二十九章 Microsoft Data Acces Objects数据库管理
29.1 DA0、COM和Microsoft数据库引擎
29.2 DA0和VBA
29.3 DAO和MFC
29.4 利用DA0可以打开什么样的数据库
29.5 按ODBC模式使用DAO———快照和动态集
29.6 DAO表类型记录集
29.7 DAOQueryDef和TableDef
29.8 DAO多线程情况
29.9 在滚动窗口中显示数据库的行
29.9.1 滚动显示方法
29.9.2 一个行—视图类
29.9.3 基类和派生类的分工处理
29.9.4 CRowView的纯虚成员函数
29.9.5 其他的CRowView函数
29.10 动态记录集的编程
29.11 EX29A示例程序
29.11.1 CEx29aApp
29.11.2 CMainFrame和CChildFrame
29.11.3 CEx29aDoc
29.11.4 CEx29aView
29.11.5 CTableSelect
29.11.6 CIsamSelect
29.12 EX29A资源文件
29.13 运行EX29A程序
第六部分 Internet程序设计
第三十章 TCP/IP、Winsock和WinInet
30.1 既针对COM也可以不需要COM
30.2 Internet基础
30.2.1 网络协议——层
30. 2.2 Internet协议
30. 2.3 用户报文协议
30.2.4 IP地址格式——网络字节顺序
30.2.5 传输控制协议
30.2.6 域名系统(Domain Name System)
30.2.7 HTTP基础
30.2.8 FTP基础
30.2.9 Internet和Intranet
30.3 建立自己的价值$99的Intranet
30.3.1 NT文件系统和文件分配表
30.3.2 网络硬件
30.3.3 对Windows进行网络配置
30.3.4 Intranet的主机名——HOSTS文件
30.3.5 测试Intranet—Ping程序
30.3.6 只有一台计算机的Intranet—TCP/IP环形地址
30.4 Winsock
30.4.1 同步和异步Winsock编程
30.4.2 MFC Winsock类
30.4.3 Blocking Socket类
30.4.4 一个简化了的HTTP服务器程序
30.4.5 一个简化了的HTTP客户端程序
30.5 用CHttpBlockingSocket创建一个Web服务器程序
30.5.1 EX30A服务器限制
30.5.2 EX30A服务器结构
30.5.3 使用Win32TransmitFile函数
30.5.4 编译和测试EX30A
30.5.5 使用Telnet
31.4.1 第一步——获取定单
31.4.2 第二步——处理确认窗体
31.4.3 编译并测试ex3la.dl1
31.4.4 调试EX31A DLL
31.5 ISAPI数据库访问
31.6 使用HTTP Cookie来连接事务
31.6.1 Cookie如何工作
31.6.2 ISAPI服务器扩展如何处理Cookie
31.6.3 使用Cookie的一些问题
31.7 WWW鉴定
31.7.1 基本鉴定
31.7.2 Windows NT问讯/应答鉴定
31.7.3 安全套接字层(SSL)
31.8 ISAPI过滤器
31.8.1 编写ISAPI过滤器DLL
31.8.2 MFC ISAPI过滤器类
31.9 ISAPI过滤器示例——exlb.dH、e61c.exe
31.9.1 选择通知
31.9.2 把事务数据发送到显示程序
31.9.3 显示程序
31.9.4 编译并测试EX3lB ISAPI过滤器
第三十二章 ActiveX文档服务器和Internet
32.1 Activex文档理论
32.1.1 ActiveX文档服务器和OLE嵌入服务器
32.1.2 从IE3中运行Activex文档服务器
32.1.3 Actiex文档服务器和Achvex控件
32.1.4 Activex文档服务器和包容器的0M接口
32.1.5 MFC对Activex文档服务器的支持
32.2 Activex文档服务器示例程序D(32A
32.2.1 EX32A第一阶段——简单的服务器
32.2.2 调试Activex文档服务器
32.2.3 EX32A第二阶段——加入WinInet调用
32.3 ActiveX文档服务器示例程序EX32B
32.3.1 在程序控制下产生POST请求
32.3.2 EX32B视图类
32.3.3 编译并测试EX32B
32.3.4 ActiveX文档服务器和VBScript
32.4 进一步使用ActiveX文档服务器
附录A Microsoft基本类(MDC)库中的消息映射函数
附录B MFC库运行时类识型和动态对象创建
在这本书即将出版之际,我坐飞机去San Franscisco参加Software Development 97会议。对软件开发者来说,这是最主要的会议,同时也是一个内部演示会。在此之前,我期望Java语言在展示会上将会很重要,但当我到达后,我感觉到了“Java Revolution”(Java革命)的对抗,有10000多名热心者认为Visual Basic和C++现在成了“自然馈赠的语言”(legacy language)。我是否要像许多其他的C++作者那样转换到Java上来呢?我决定不做这种转换,这倒不是因为市场上已经有了成打的Java书籍,而是因为我相信像C++这样的编译语言在将来会更重要。
C++和Java
为什么C++超过Java首先,一种编译语言总是比一种解释语言要快。想象一个带有单元公式和宏的高性能电子数据表格。现在假定由Java虚拟机来解释公式和宏的代码,则翻译公式和宏不会很灵快,是不是?用这种实时编译的方法,不仅在每次装载时都必须编译程序,而且编译代码是否真的能够跟C什编译器的优化结果相比呢?
执行速度是一个因素;对操作系统的访问是另一个因素。因为安全的原因,Java小应用程序(Java Applets)不能处理像写磁盘和串口访问这样的任务。为了做到平台的独立性,Java应用程序被限制到操作系统性能的最低公共部分。而一个Microsoft Windows的C++程序则更加灵活,因为它任何时候都可以调用所有的Win32函数。
Java仍将是一种重要的语言,但我相信它只是另外一种语言而已,而不是一场革命。如果您需要一个Internet小程序或者一个真正与平台无关的应用程序,那就选择Java;但如果您需要的是效率和灵活性,就应选择C++。
本书的适用对象
产品名字“Visual C++”误导了很多人,他们认为自己买了一个完全可视的编程系统,类似于Microsoft visual Basic,并在刚开始的几天总这样幻想。然而不久,人们认识到他们必须实际编写和阅读C++代码。Visual C++向导可以节约时间和提高准确性,但程序员必须理解向导所产生的代码,最主要的,还必须理解Microsoft Foundation Class(MFC)Library(我们称为MPC库)的结构和Windows佃操作系统的内部工作方式。
VisuaI C++和它复杂的应用程序框架(application framework)是为专业程序员准备的,本书也是如此。我假定读者已经精通了C语言——您不用参考手册就可以编一个if语句。
我还假定您已经接触过C++语言——至少学过这门课程或者读过C++的书籍,但可能还没写过太多的代码。比较一下C++语言的学习和法语的学习。您可以在学校里学习法语,但您不能说得很流利,除非您去法国开始与法国人谈话。而阅读这本书就像是您去法国旅行一样。
不过,我并不假定您已了解Windows编程。从我的教学经验来看,我知道精通C的程序员能够以MFC的方式学习Windows。此外,虽然了解C++比了解Win32API更重要,但您还是应该知道如何运行Windows及运行基于Windows的应用程序。
即使您已经对Win32 API或者MFC库有经验了,这本书仍然可供您学习。首先,它可以帮助您转换到Win32编程上来,然后您可以学到一些新的特征,如Data Access Objects(数据访问对象,简称为DA0)、Activex控件包容器支持,和一些Windows95提供的新控件。如果您尚未领会Component Object Model(组件对象模型,简称为COM),则本书介绍的一些重要理论会让您理解Activex控件。最后,您可以学习Internet上的C++编程。
本书没有包括的内容
在一本书里涉及基于Windows的编程的所有方面是不可能的,因此我把一些依赖于特定用途的硬件和软件的主题排除了,如MAPI,TAPI和通讯口的访问等。我也排除了Activex Tenlplate Library(Activex模板库,简称为ATL),因为它主要是针对Apple Macintosh计算机和源码控制(source contml)的。尽管我介绍了如何在一个应用程序中使用Actlvex控件,但编写Activex控件的内容我则推荐Adam Denning和他的书《Activex Controls Inside Out》(Microsoft Press,1997)。我建议您从32位内存管理、DLL理论和多线程编程技术开始,但如果您对这些内容缺少了解的话,您还需要参阅Jeffrey Richter写的第三版的《Advanced Windows》(Microsoft Press, l997);另一本有用的书是GeorgeShepherd和Scot Wingo写的《MFC Internals》(Addison—Wesley,1996)。
怎样使用本书
当读者开始学习使用Visual C++的时候,最好首先从头到尾阅读此书,它会给您提供最好的学习指导。然后读者就可以将此书作为一本参考手册,通过目录来经常查阅一些内容。由于许多应用程序框架元素之间是彼此紧密相关的,而且许多概念也难以按章节完全分离开来,因此本书不可能像百科全书那样包罗万象。在使用本书时,您最好打开联机帮助(on1ine help),以备查找类和成员函数;如果您更喜欢使用印刷制品的话,那么就可以买一本《Microsoft Visual C++ MFC Library Reference》(Microsoft Press,1997)。
如果您对Visual C++的Winl6版本很有经验的话,则可以浏览一下第一部分以对新特征有个大致的了解,然后可以跳过第二部分的前三章,但请阅读第六章到第十一章,因为这些章里包含了针对Win32的一些内容。
本书的组织
正如本书的目录中所列出的那样,本书主要包括六大部分和附录。
第一部分:Windows、Visual C++和应用程序框架基础
在这部分中,既有理论阐述,又有实际应用,我力求使这两者达到一种平衡。在这部分中,我对Win32和Visual C++的基本组成作了一番评论,进而逐步将应用程序框架以及文档—视图结构(document——view architecture)展现在读者面前。同时,在这部分中还给出了一个通过MFC类库中的类来构造的简单的“Hello,world!”程序,该程序只需30行代码。
第二部分:MFC库中的视图类
在假定读者已经熟悉使用基本的Windows API的前提下,类库文档材料简捷而又完整地介绍了应用程序框架的基本元素。在第二部分中,我将把读者的注意力集中在应用程序框架的主要构成元素之一——“视图”(view)上,“视图”实际上是一个窗口。在这里,我们将从C++和类库中的类的角度来学习和掌握熟练的Windows程序员早已熟知的有关窗口的一些特性。您还将使用Visual C++工具,而这些工具避免了以前Windows程序员不得不忍耐的一些繁杂的代码编写工作。
第二部分介绍了很多内容,包括用位图进行图形编程、对话框数据交换、Activex控件使用、32位内存管理,以及多线程编程。其中的练习将帮助您编写比较复杂的基于Windows的程序,但这些程序并没有充分利用应用程序框架的高级特性。
第三部分:文档—视图结构
这一部分介绍了应用程序框架的核心——文档-视图结构。在这部分中,读者将会了解什么是“文档”(document)(在这里,“文档”并不是指文字处理工作中通常所说的文档,它有更进一步的含义),也将学习如何将文档同第二部分中所介绍的视图联系起来。一旦读者动手编写出了一个自己的文档类,就会禁不住对类库简化文件I/0及打印的方式感到非常的惊讶。
另外,读者在这部分中也会接触到命令消息处理(command message processing)、工具栏(toolbar)、状态栏(status bar)、切分框架(splitter frame)以及上下文相关帮助(context-sensitive help)。同时,读者还将学习Windows的多文档界面(MDI),这是当前基于Windows的应用程序的标准。
第三部分还讨论了如何用MFC库编写动态连接库。您将知道在扩展DLL(extension DLL)和正规DLL(regular DLL)之间的区别。如果您过去习惯于Winl6的DLL,那么请注意在移到Win32时会有一些变化。
第四部分:Activex:组件对象模型、自动化和OLE
要介绍COM不是一本书能够完成的。第四部分从MFC的角度出发,使您开始学习基本的COM理论。接下来您将学习Automation(自动化),这是连接C++和VisualBasic for Applications(VBA)的纽带。您还将熟悉统一数据传输(uniform data transfer)和结构化存储(structured storage),还要学习复合文档(compound document)和嵌入对象(embedded object)的基础知识。
第五部分:数据库管理
基于Windows的程序常常要访问大型数据库的信息。Visual C++现在支持两种独立的数据库管理方式:Open Database Connectivity (开放数据库连接性,简称为ODBC)和Data Access Objects(AD0)。第五部分对每种方式各设有一章。您将学习对这两种方式的更广泛的MFC和向导支持,还将看到在ODBC和DAO之间的相似和不同之处。
第六部分:Internet程序设计
这部分是第四版的新内容。它从Internet的技术指南开始,涉及了TCP/IP协议和Winsock及WinInet API。您可以学到如何为Internet和intranet(内联网)编写C什服务端程序和客户端程序,您还可以学到如何编写ISAPI DLL以便扩展Microsoft Internet Information Server。
附 录
附录A列出了消息映射宏和对应的消息控制函数原型的列表。C1ass Wizard通常会为您生成这些代码,但有时您必须手工添加一些宏和函数条目。
附录B描述了MFC应用程序框架的运行时类信息和动态创建系统。这是独立于RTTI(runtime type information,运行时类型信息)的特征,而RTTI现在已经成了ANSI C++的一部分。
Win32和Win16
我再提一下关于Winl6编程的问题,因为有很多老的过时的计算机仍然在使用Windows 3.1。然而,再花费钱去为老的平台编写新程序有些不太值得。本版《Visual C++技术内幕》是关于32位编程的,使用的是Microsoft Windows 95和Microsoft Windows NT平台上的Win32 API。如果您实在需要16位编程的话,您可以去看本书的第二版。
Windows 95和Windows NT
Visual C++ 5.0以Windows 95、WindowsNT 4.0或者更高版本作为平台,这些平台使用同样的用户界面。我建议您使用WindowsNT作为开发平台,因为它的稳定性好——您可以长时间工作,几个月都不用重启动机器。如果您只用到了MFC编程接口,那么编译后的程序在Windows 95和WindowsNT上都可以运行;但如果一个程序调用了特定的Windows NT的特性,那就只能在Windows NT上运行了。
对Windows的进一步探讨:
“致Win32程序员”这一附栏的目的
本书并没有给出最近一些新的关于Win 32的专门书籍中所提供的一些技巧和隐含特性。这些书籍大都是针对使用C语言的程序员编写的。为了能有效地使用这些书籍,读者必须理解和掌握底层Win32API以及它和类库之间的关系。而且,您还必须懂得Windows的消息分发机制和窗口类(Window classes)的概念。
书中的“致Win32程序员”这一附栏可帮助读者将类库同Windows的底层编程联系起来。这些特殊格式的方框中所包含的内容能够帮助熟练的C程序员将新的类库概念同他们所熟知的原理联系起来。如果读者还不熟悉底层编程,那么第一遍阅读此书时可跳过这些注释,但当第二遍阅读此书时则应该仔细阅读这些内容。例如,即使您并不需要用WinMain函数写一个底层的Windows程序,但知道Windows操作系统和您的程序是如何相互作用的还是有必要的。
随附的CD—ROM光盘的使用
在本书封底的内封还附带着一张光盘,本书中所有示例程序的源文件都在该光盘中。该光盘中还包含可执行文件,因此,您不必再去编译感兴趣的示例程序的可执行文件。为了安装光盘中的文件,请将该光盘插入CD—ROM驱动器中,运行Setup程序,然后只需按照屏幕提示进行操作即可。
说明:Setup程序大约将拷贝10MB的文件到您的硬盘上。如果您喜欢,也可以手工拷贝单个项目的文件。简单地用目录拷贝(tree-copy)的方法把相应的目录连同其子目录一起从CD—ROM拷贝到c:\vcpP32下即可。因为每个项目单独在一个目录下,所以并不需要其他项目目录下的文件。(如果您用Windows Explorer或者File Manager拷贝文件的话,您还必须把文件的只读属性去掉。)说明:CD—ROM光盘上的大多数文件是长文件名的,如果您使用Windows 95且您的CD—ROM驱动器用的是实模式的驱动程序,则您可以看到这些文件名被截短了,不 再是原来的文件名或者目录名。然而,Setup程序仍然可以正常进行,它会从CD—ROM上特定的\SETUP目录下拷贝文件,并用长文件名重命名。您可以在硬盘上浏览这些文件。反过来,您也可以用8.3别名浏览CD—ROM上\SETUP目录下的文件。
对于传统的用C语言编写的Windows API程序,源程序会告诉人们一切,但对于类库应用程序框架来说,事情就没有这么简单了。在类库应用程序框架中,大部分的C++源代码都是由AppWizard产生的,而资源则是由资源编辑器生成的。前面几章的例子大都是一步一步地教读者如何使用有关工具来生成自己的源代码文件,建议读者最好能按照规定的步骤去试几个例子,在这些例子中需要用户自己动手编写的代码是很少的。中间几章的例子可以使用附带的光盘所提供的源代码,但也必须仔细阅读创建过程,以便对资源编辑器及WiMId的作用有更深的体会。在最后几章中则没有列出例子的所有源代码,读者只好从附带的光盘上去查找这些例子的完整源代码了。
技术说明及示例程序
Developer Studio的InfoView窗口中包含了本书提到的技术说明及示例程序。用数字进行标识的技术说明被包含在下面的标题中:
Developer Products
Visual C++
Microsoft Foundation Class Referene
MFC Technical Notes
Visual C++ 5.0的CD—ROM中还包含了许多MyC示例程序,其中包括本书中所提到的,这些示例程序用名字来标识。这些程序在下面的标题中:
DeveloDer Products
Visual C++
Visual C++ Samples
MFC Samples
支持信息
我们作了很大的努力来确保这本书和随附光盘上的内容的准确性。Microsoft出版社通过后面的web地址为本书提供了修正:http://mspress.microsoft.com/mspress/support。如果您对本书和随附光盘有任何意见、问题或者好的建议,请通过普通邮件或电子邮件发送给Microsoft Press:
Microsoft Press
Attn:Inside Visual C++ Editor
One Microsoft way
Redmond.NA 98052—6399
HSPINPUT@MICROSOFT.COM
请注意,对产品的支持信息请不要发送到上述邮件地址。要获得Microsoft Visual C++的支持信息,您可以打技术支持电话(425)635—7007,时间为每个工作日的上午6点到下午6点(美国西部标准时间)。Microsoft还在网上提供了关于Visual C++的信息http://www.microsoft.com/visualc/,和关于Microsoft Developer Network的信息http://www.microsoft.com/MSDN/。