第1篇 C++关键语法及其在MFC中的应用
第1章 重载 2
1.1 函数重载 2
1.1.1 问题的提出 2
1.1.2 如何区分重载函数 2
1.1.3 重载函数使用实例 3
1.1.4 编译器调用重载函数的规则 4
1.1.5 在父类和子类中定义重载函数 5
1.2 运算符重载 7
1.2.1 运算符重载的定义 7
1.2.2 运算符重载的特点 8
1.2.3 将运算符重载为友元和成员函数 9
1.2.4 operator调用形式 11
1.2.5 重载运算符的相关问题 12
1.3 函数重载在MFC中的应用举例 15
1.4 运算符重载在MFC中的应用举例 16
第2章 虚拟函数 18
2.1 问题的提出:静态联编与动态联编 18
2.2 引入虚拟函数 20
2.2.1 实例:定义虚拟函数 20
2.2.2 实例:编写通用函数 21
2.2.3 实例:定义主函数 21
2.3 虚拟函数的实现机制 22
2.3.1 类和对象的内存分配机制 22
2.3.2 基类与派生类的内存分配关系 23
2.3.3 非虚拟函数的内存分配机制 25
2.3.4 深入:虚拟函数的内存分配机制 25
2.4 虚拟函数的应用 27
2.4.1 不改变父类的代码,可以改变父类的行为 28
2.4.2 不知道对象的类型,可以执行对象的特定操作 30
2.4.3 如果类包含虚拟成员函数,则将此类的析构函数也定义为虚拟函数 37
2.5 纯虚拟函数 39
2.6 虚拟函数在MFC中的应用举例 41
第3章 静态成员和类模板 43
3.1 静态成员 43
3.1.1 C语法中的静态变量 43
3.1.2 C++中的静态成员变量 44
3.1.3 静态成员函数 46
3.1.4 静态成员变量在MFC中的应用举例 47
3.1.5 静态成员函数在MFC中的应用举例 48
3.2 类模板 49
3.2.1 问题的提出 49
3.2.2 类模板的定义 51
3.2.3 使用类模板和模板类 58
3.2.4 模板在MFC中的应用举例 62
第4章 多重继承和内嵌类 64
4.1 继承方式与访问权限 64
4.1.1 派生类的继承权限 64
4.1.2 在基类中定义数据成员的原则 65
4.1.3 以公有方式派生子类 66
4.2 多重继承和虚拟基类 67
4.2.1 一个例子 67
4.2.2 多重继承的二义性 68
4.2.3 使用虚拟基类解决二义性问题 70
4.2.4 使用虚拟基类需要注意的问题 71
4.3 内嵌类与类合成 74
4.3.1 内嵌类的定义 74
4.3.2 内嵌类的使用方法 75
4.3.3 内嵌类的应用价值 77
4.3.4 类合成 85
4.4 类继承与类合成的应用 86
4.4.1 构造初始化和赋值操作 86
4.4.2 继承与合成的选择 90
4.5 多重继承和内嵌类在COM中的应用 92
第2篇 MFC核心机制
第5章 MFC类结构 98
5.1 CObject类 99
5.1.1 支持类诊断 99
5.1.2 提供运行时类信息 102
5.1.3 支持类的连载 106
5.2 CCmdTarget类 108
5.3 CWinThread类 109
5.3.1 虚函数InitInstance 110
5.3.2 虚函数Run 110
5.3.3 虚函数ExitInstance 112
5.4 CWnd类 112
5.4.1 绘制窗口 112
5.4.2 操作窗口子控件 113
5.4.3 窗口定时器 113
5.4.4 窗口消息的相关函数 113
5.4.5 默认的消息处理函数 113
第6章 CWnd类与Windows窗口的关系 116
6.1 使用WIN32 API创建窗口 116
6.2 亲自动手创建窗口封装类 119
6.2.1 实例代码 119
6.2.2 原理分析 132
6.3 CWnd类如何封装Windows窗口 132
6.3.1 使用操作映射的函数 132
6.3.2 CWnd如何处理窗口消息 134
第7章 CWnd的派生类 137
7.1 CFrameWnd类 137
7.1.1 CFrameWnd的创建 137
7.1.2 管理视图对象 139
7.1.3 管理控制条 140
7.1.4 分发命令消息 141
7.1.5 必要的消息处理 142
7.2 CView类 142
7.2.1 关联文档对象 142
7.2.2 视图的绘制 143
7.2.3 虚函数virtual void OnUpdate(CView* pSender,LPARAM,CObject*) 144
7.2.4 虚函数virtual void OnInitialUpdate() 144
7.2.5 虚函数virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 144
7.2.6 虚函数virtual void PostNcDestroy(); 145
7.2.7 虚函数virtual BOOL OnCmdMsg(UINT, int, void*, AFX_CMDHANDLERINFO* ) 145
7.2.8 虚函数virtual void OnActivateView(BOOL, CView*,CView*) 146
7.3 CDialog类 146
7.4 模态对话框的消息循环 146
7.4.1 模态对话框的创建与模式循环 147
7.4.2 结束模式循环 150
7.4.3 创建普通的模态窗口 151
7.5 对话框的命令路由 151
第8章 窗口操作 153
8.1 检索窗口 153
8.1.1 根据标题和窗口类查找窗口 153
8.1.2 根据窗口的相对位置或所属关系查找窗口 154
8.1.3 检索窗口的应用 155
8.2 屏幕坐标与客户区坐标 157
8.3 窗口之间的层次关系 158
8.3.1 窗口实例的信息结构 158
8.3.2 桌面窗口(第一层窗口) 158
8.3.3 顶级窗口(第二层窗口) 158
8.3.4 子窗口(第三层以下窗口) 159
8.3.5 重叠窗口与弹出窗口的区别 159
8.4 父窗口与子窗口 159
8.4.1 子窗口的刷新 159
8.4.2 子窗口的显示设备上下文 160
8.4.3 处理WM_CTLCOLOR消息 161
8.4.4 顶级窗口向子窗口转发系统消息 162
8.4.5 子窗口向父窗口发送通知消息 163
8.4.6 父窗口向子窗口发送反射消息 164
8.4.7 检索父窗口 165
8.5 Windows窗口类 166
8.5.1 窗口类的结构 167
8.5.2 系统定义的窗口类 169
8.6 窗口的子类化和超类化 170
8.6.1 实例子类化和全局子类化 170
8.6.2 子类化的规则与局限 172
8.6.3 使用超类化代替子类化 173
第9章 消息映射与消息处理 174
9.1 MFC的消息映射 174
9.1.1 消息映射机制 174
9.1.2 消息映射的宏定义 176
9.2 非窗口消息:命令消息 179
9.2.1 命令ID 179
9.2.2 命令消息映射项宏定义 179
9.3 非窗口消息:通知消息 180
9.3.1 通过WM_COMMAND发送的通知消息 180
9.3.2 WM_NOTIFY通知消息与ON_NOTIFY宏 180
9.3.3 几个特殊的通知消息 182
9.4 非窗口消息:反射消息 183
9.5 非窗口消息:非窗口消息的传递路由 184
9.6 非窗口消息:非窗口消息的扩展 197
9.6.1 处理对象扩展 197
9.6.2 发送对象扩展 198
第10章 特殊消息和处理函数 200
10.1 空闲消息处理 200
10.1.1 UI线程的空闲处理 200
10.1.2 主框架窗口的空闲处理 202
10.1.3 对话框的空闲处理 203
10.2 命令状态更新消息 203
10.2.1 命令状态更新的实现机制 203
10.2.2 在主框架窗口中实现命令状态更新 205
10.2.3 在对话框中实现命令状态更新 206
10.3 使用OnCmdMsg()函数分发非窗口消息 211
第3篇 窗口编程
第11章 控件子窗口 216
11.1 控件的创建 216
11.1.1 使用API函数创建控件 216
11.1.2 使用MFC封装类创建控件 217
11.1.3 使用对话框模板创建控件 219
11.2 控件的子类化 220
11.3 控件的属主画与自定义画概述 223
11.4 属主画消息处理和虚拟函数 223
11.4.1 属主画消息的处理 224
11.4.2 属主画反射消息的处理实例 225
11.4.3 自画虚拟函数DrawItem() 226
11.4.4 自画虚拟函数MeasureItem() 227
11.4.5 自画虚拟函数CompareItem() 227
11.4.6 自画虚拟函数DeleteItem() 228
11.5 几个控件的属主画特性 228
11.5.1 LISTBOX的属主画特性 228
11.5.2 BUTTON的属主画特性 231
11.5.3 COMBOBOX的属主画特性 234
11.5.4 LISTCTRL的属主画特性 237
11.6 控件的自定义绘图 237
11.6.1 绘制方式 237
11.6.2 CDDS_PREPAINT阶段 239
11.6.3 CDDS_ITEMPOSTPAINT阶段 240
第12章 自定义控件 242
12.1 窗口类 242
12.2 通知消息 244
12.3 绘制 245
12.4 分隔条控件 246
12.4.1 基本功能 246
12.4.2 控件的封装类以及相应函数代码 247
第13章 开发使用控制条 255
13.1 为控制条按需分配客户区 255
13.1.1 API函数HDWP::BeginDeferWindowPos() 255
13.1.2 API函数HDWP DeferWindowPos() 256
13.1.3 API函数BOOL EndDeferWindowPos() 256
13.1.4 具体代码 256
13.2 控制条基类CControlBar 259
13.2.1 绘制控制条 259
13.2.2 空闲处理 262
13.2.3 向父窗口传递特殊消息 263
13.2.4 操作控制条风格 264
13.3 控制条的停靠与浮动 265
13.3.1 控制条的停靠 265
13.3.2 控制条的浮动 268
13.4 实现停靠浮动子窗口 271
第14章 工具栏和菜单优化 281
14.1 添加按钮文本 281
14.2 创建工具栏的子控件 283
14.3 动态创建菜单 287
14.3.1 菜单封装类CMenu 287
14.3.2 编辑菜单条目 289
14.3.3 为窗口关联主菜单 291
14.3.4 创建浮动的弹出菜单 292
14.4 菜单的属主画 293
14.4.1 菜单的属主画机制 293
14.4.2 菜单的自画实现机制 293
14.4.3 自绘弹出菜单 295
第15章 单文档和多文档编程 303
15.1 CWinApp类全局对象 303
15.2 注册表和INI文件操作 304
15.3 命令行参数处理 305
15.3.1 MFC预定义的参数 305
15.3.2 自定义命令行参数 308
15.4 单文档(SDI)模板框架 309
15.4.1 构造文档模板类 310
15.4.2 命令行参数的解析与处理 311
15.4.3 直接创建相应对象的成员函数 313
15.4.4 单文档非拆分视图的切换 315
15.5 多文档(MDI)模板框架 317
15.5.1 概述 317
15.5.2 MDI主框架窗口的创建过程 318
15.5.3 MDI主框架窗口的消息传递 321
15.5.4 CMDIChildWnd子框架 322
15.6 CDocument类的文档管理功能 324
15.6.1 文档对象的连载 324
15.6.2 新建文件 325
15.6.3 打开文件 325
15.6.4 保存文件 327
15.6.5 关闭文件 328
15.6.6 文档的“修改”标志 330
15.6.7 文档对象与文档模板实例及视图的关联 330
第16章 编写多框架的应用程序 333
16.1 创建多框架的必要性 333
16.2 自动创建的多框架程序 334
16.2.1 一个实例 334
16.2.2 多框架的秘密 337
16.3 改进自动创建的多框架程序 339
16.3.1 通过文档模板指针改进程序 339
16.3.2 重载CWinApp::OnFileNew()接口改进程序 340
16.4 手工创建多框架程序 344
16.5 拆分视图:认识CSplitterWnd类 349
16.5.1 概述 349
16.5.2 动态拆分和静态拆分 350
16.6 应用CView::OnCreate()消息处理函数实现拆分 353
16.7 创建非视图的拆分子窗口 355
16.8 拆分视图的创建删除和隐藏显示 357
第4篇 高级技术
第17章 屏幕绘图 364
17.1 基类CDC 364
17.1.1 CDC类的封装机制 364
17.1.2 应用CDC类绘图 366
17.2 CWindowDC与CClientDC 367
17.3 WM_PAINT窗口消息与CPaintDC类 370
17.3.1 窗口的无效区域产生WM_PAINT窗口消息 370
17.3.2 设置设备上下文的剪裁区 370
17.3.3 绘图前处理WM_ERASEBKGND消息 371
17.3.4 主动刷新窗口绘图 371
17.3.5 WM_PAINT消息的发送时机 371
17.3.6 在WM_PAINT消息处理中使用CPaintDC类 371
17.4 使用设备上下文的剪裁区提高刷新效率 373
17.4.1 通过设备上下文的当前路径选择剪裁区域 373
17.4.2 通过区域对象选择剪裁区域 374
17.4.3 为曲线选择剪裁区域 374
17.4.4 定时刷新曲线的程序示例 375
第18章 打印 383
18.1 准备打印设备和打印参数 383
18.2 单页打印 385
18.3 分页打印 387
18.4 调整图文打印尺寸 394
18.5 窗口的自动打印 397
18.5.1 自动打印的消息处理 397
18.5.2 自动打印客户区和非客户区 398
第19章 多线程的创建与控制 404
19.1 工作者线程和界面线程 404
19.1.1 创建工作者线程 404
19.1.2 用户界面线程与消息循环 407
19.1.3 主线程与辅线程 407
19.1.4 用户界面线程的创建 409
19.2 线程和进程的优先级 417
19.2.1 进程的优先级类 418
19.2.2 线程的优先级别 418
19.2.3 线程优先级值 419
19.3 线程的终止 419
19.3.1 线程的正常终止 419
19.3.2 线程的强行终止 420
19.4 线程间的互斥 420
19.4.1 临界区 421
19.4.2 互斥 422
19.5 线程间的同步 425
19.5.1 线程之间的间接制约和直接制约 425
19.5.2 线程的同步运行 425
19.6 线程间的资源共享 428
19.6.1 共享对象句柄 428
19.6.2 共享对象句柄的操作局限 429
19.6.3 共享MFC对象 430
19.6.4 多线程示例 431
第20章 操作Web网页 438
20.1 了解HTML超文本标记语言 438
20.2 DHTML的定义 439
20.2.1 窗口对象 440
20.2.2 事件对象 440
20.2.3 子框架对象 441
20.2.4 屏幕对象 441
20.2.5 文档对象 441
20.2.6 全集对象(all) 441
20.2.7 集合对象 442
20.3 了解JavaScript和VBScript脚本语言 442
20.4 将Web浏览器嵌入应用程序 443
20.4.1 使用MSIE ActiveX控件 443
20.4.2 应用CHtmlView视图类 445
20.5 操作单框架网页元素 447
20.5.1 COM接口与DHTML对象的关系 447
20.5.2 访问文档元素 448
20.5.3 访问单框架文档元素的程序示例 450
20.6 操作多框架网页元素 453
第21章 异常处理 460
21.1 C++异常处理 460
21.1.1 异常处理的关键字 460
21.1.2 不进行异常处理的代码 460
21.1.3 增加异常处理代码以后 462
21.2 结构化异常处理 464
21.3 异常处理中的资源释放 465
21.3.1 局部对象的自动析构 465
21.3.2 抛出对象的释放处理 466
21.3.3 必要的资源清理和系统复位 468
21.3.4 清理没有捕获的异常 469
21.4 何时使用异常处理 469
21.4.1 集中处理错误信息 469
21.4.2 化简返回值的传递过程 470
21.4.3 在构造函数中抛出异常 470
21.5 MFC的异常处理 470
21.5.1 MFC的异常类CException 470
21.5.2 MFC的CException派生类:CArchiveException 472
21.5.3 MFC的CException派生类:CFileException 473
21.5.4 MFC的CException派生类:CDBException、CDaoException 475
21.5.5 MFC的CException派生类:CResourceException 、CUserException、 CMemoryException、CNotSupportException 475
21.5.6 自定义CException的派生类