第1章 综述 1
1.1本书结构 1
1.2本书约定 2
1.3特殊说明 2
第2章 C++重点回顾 3
2.1类、对象、实例 3
2.2构造函数Constructor 3
2.3匿名实例Nameless Instance 4
2.4虚函数 5
2.5异常处理 7
第3章 基本概念与简单的MFC类 10
3.1什么是Win32 API 10
3.2主控台模式应用程序(Win32 Console Mode) 11
3.3基本数据类型 12
3.3.1基本的数据结构 13
3.3.2使用TCHAR设计支持Unicode和SBCS的通用源程序 14
3.4使用MFC类库 16
3.4.1 MFC的根CObject 16
3.4.2功能强大的字符串类CString 16
3.4.3 CFile家族 18
3.4.4 CException异常类家族 21
3.4.5通用的列表类CList 24
第4章 窗口程序的基本概念 26
4.1终端接口与GUI接口 26
4.2组成要素 27
4.2.1应用程序 27
4.2.2窗口 28
4.2.3消息传递机制 32
第5章 建立第一个窗口程序 34
5.1使用Visual C++ 34
5.1.1创建新的工程文件 34
5.1.2设定工程文件选项 35
5.1.3建立新CPP文件 36
5.1.4编译与执行示例程序 37
5.1.5改错 38
5.2示例程序 39
5.2.1 HelloApp 39
5.2.2 MyFrameWindow 40
5.3增加资源文件 43
5.3.1建立新的资源文件 43
5.3.2符号与资源的包含文件(Include Files) 44
5.3.3插入资源 44
5.3.4编辑位图资源 46
5.3.5编辑图标资源 47
5.3.6编辑菜单资源 48
5.3.7引用资源 49
5.4用AppWizard产生类似的程序 54
5.4.1用AppWizard产生工程文件 54
5.4.2产生了什么代码 60
5.4.3在CChildView内显示文字 62
第6章 窗口的产生与处理 64
6.1窗口类 64
6.2产生CWnd对象 65
6.2.1 CWnd::Create() 66
6.2.2 CWnd::CreateEx() 68
6.2.3 WM_CREATE消息 69
6.2.4 CREATESTRUCT 69
6.3消息响应 70
6.3.1映射表 70
6.3.2给窗口发送消息 71
6.4关闭窗口 73
6.5窗口的位置及尺寸 75
6.5.1取得窗口的位置及大小 75
6.5.2如何移动窗口并改变大小 75
6.5.3移动窗口、改变其大小及垂直相对位置(z-order) 75
6.5.4移动与变更尺寸的消息 77
6.5.5改变窗口的显示状态 77
6.5.6工作区的相关信息 78
6.5.7坐标系统的转换 78
6.6窗口的状态与样式 79
6.6.1图标化(Iconic) 79
6.6.2可见性(Visible) 80
6.6.3放大(Zoomed) 80
6.6.4使能(Enabled) 80
6.6.5活动(Active)与非活动(Inactive) 80
6.6.6子窗口 81
6.6.7窗口的样式 81
6.7工作区显示 82
6.7.1与显示画面有关的消息 83
6.8有滚动条的窗口 83
6.8.1滚动条 83
6.8.2滚动条的范围 85
6.8.3滚动块的位置 85
6.8.4滚动条的消息 85
6.8.5滚动工作区 86
6.9 CWnd与句柄 86
6.10 Window Text 87
第7章 快速创建MFC应用程序 89
7.1基础知识 89
7.1.1对话框与一般窗口的差别 89
7.1.2控件 92
7.1.3控件的通知消息 93
7.2示例:编辑器与列表框的字符串交换 93
7.2.1建立工程文件 94
7.2.2对话框资源编辑器 95
7.2.3设计对话框的外观 97
7.2.4响应各种事件消息 100
7.2.5运行的细节 105
7.3信息框 109
7.3.1示例 111
第8章 键盘、鼠标与时间 112
8.1信息与输入焦点 112
8.1.1改变输入焦点 112
8.1.2与输入焦点有关的信息 113
8.2键盘的信息 113
8.2.1 ASCII码、虚拟键码与扫描码 114
8.2.2信息 114
8.3鼠标 116
8.3.1鼠标信息 116
8.3.2更换鼠标的光标 118
8.3.3显示等待光标 119
8.3.4取得鼠标的控制权 119
8.4 特殊的状况 120
8.4.1中文窗口下的文本输入 120
8.4.2 Windows95之后的新按键 121
8.5示例:打字模拟程序 122
8.5.1捕获消息 123
8.5.2文本光标 123
8.5.3鼠标光标 125
8.5.4显示键入的字符 125
8.6计时器消息与时间 130
8.6.1查询系统时间 131
8.7设计鼠标光标 131
8.7.1绘制手掌型光标 132
8.7.2光标的热点 132
8.7.3更换鼠标光标 132
第9章 菜单与快捷键 133
9.1菜单 133
9.1.1命令消息 134
9.1.2使用菜单 137
9.1.3系统菜单 137
9.1.4弹出式菜单 138
9.1.5 CMenu的成员函数 139
9.1.6示例 143
9.2快捷键 149
9.2.1快捷键的工作方式 149
9.2.2编辑快捷键表 149
9.2.3示例 150
第10章 文档、视图与框架窗口 153
10.1“文档/视图”(Document/View)模型 153
10.1.1“文档”与“视图” 153
10.1.2单文档界面与多文档界面 154
10.2 Document/View与框架窗口的关系 156
10.2.1一个标准的SDI示例 157
10.2.2编辑字符串表(String Table) 161
10.3 CDocument类 167
10.3.1 View的管理 167
10.3.2建立或打开文档 168
10.3.3储存文档 170
10.3.4关闭文档 171
10.3.5 Serialize 171
10.3.6应该被重载的函数 174
10.3.7其他成员 175
10.4 CView类 176
10.4.1应该被重载的函数 176
10.5 CScrollView类 177
10.5.1 CScrollView的工作原理 177
10.5.2 CScrollView的成员函数 177
10.6 SDI框架窗口CFrameWnd 178
10.6.1重要的成员函数 178
10.6.2菜单的自动enable/disable 179
10.7示例:拉线绘图 180
10.7.1 CList 180
10.7.2鼠标的操作 181
10.7.3 Serialize 181
10.7.4更换鼠标光标 182
10.7.5其他细节 182
10.7.6改用CScrollView 192
10.8 工具条与状态条 193
10.8.1建立工具条 194
10.8.2编辑工具条资源 196
10.8.3建立状态条 196
10.8.4在状态条中显示时间 197
10.8.5工具条与状态条的开关 198
10.8.6状态条与Tooltip中的辅助说明文字 198
10.9 MDI 202
10.9.1一个标准的MDI示例 203
10.9.2排列MDI子窗口 211
10.9.3管理MDI子窗口 211
10.9.4 CMDIFrameWnd的自动功能 212
10.9.5 Window选项 212
10.9.6最近使用的文档MRU 213
10.9.7与MDI有关的消息 213
10.10 MDI化的LineArt 214
10.11多视图类的MDI 226
10.12分裂式窗口(Splitter Window) 236
10.12.1内含“动态分裂窗口”的SDI标准示例 237
10.12.2内含“静态分裂窗口”的SDI示例 240
10.13更多不同的View类 249
10.13.1另一类对话框CFormView 250
10.13.2可以直接编辑文字的CEditView 250
第11章 文档视图模式与AppWizard 258
11.1 SDI工程文件 258
11.1.1使用AppWizard建立工程文件 258
11.1.2新工程文件中有哪些类 261
11.1.3用ClassWizard重做SDI版的LineArt 261
11.2 MDI工程文件 268
11.2.1使用AppWizard建立MDI工程文件 268
11.2.2新工程文件中有哪些类 269
11.3不用文档视图模式的工程文件 270
第12章 控件 272
12.1静态类 272
12.1.1 CStatic::Create() 272
12.1.2样式 272
12.1.3成员函数 274
12.1.4 CStatic的通知消息(Win95) 274
12.2按钮 275
12.2.1 CButton::Create() 275
12.2.2样式 275
12.2.3成员函数 278
12.2.4通知消息 279
12.2.5示例:计算器 280
12.3滚动条CScrollBar 292
12.3.1 CScrollBar::Create() 293
12.3.2样式 293
12.3.3成员函数 293
12.3.4通知消息 295
12.3.5示例:Multithread动画 296
12.4列表框 304
12.4.1样式 305
12.4.2成员函数 306
12.4.3通知消息 309
12.5编辑控件 310
12.5.1样式 310
12.5.2成员函数 310
12.5.3通知消息 313
12.6组合框 313
12.6.1样式 314
12.6.2成员函数 314
12.6.3通知消息 318
12.7信息交换与检查 318
12.7.1简单的示例 319
12.7.2常见的DDX函数 323
12.7.3常见的DDV检查函数 324
12.7.4在ClassWizard中增加DDX/DDV选项 325
第13章 设备上下文与基本绘图工具 327
13.1概述 327
13.2 CDC 327
13.2.1建立与删除CDC对象 327
13.2.2 CDC的内含资源对象 329
13.2.3查询DC的相关信息 330
13.2.4 CDC的其他成员函数 332
13.3 CWindowDC与CClientDC 333
13.3.1 CWindowDC的构造函数 333
13.3.2 CClientDC的构造函数 333
13.4画笔与画刷 333
13.4.1画笔 333
13.4.2画刷 335
13.5基本绘图函数 336
13.5.1点 336
13.5.2线 337
13.5.3弧线 337
13.5.4椭圆 339
13.5.5矩形 340
13.5.6饼图 340
13.5.7多边形 341
13.6色彩与调色板 342
13.6.1显卡的概念 342
13.6.2 16色与256色模式 342
13.6.3 32K,64K以及16M色模式 343
13.6.4逻辑调色板和硬件调色板 343
13.6.5常用来表示“颜色”的结构与宏定义 345
13.7使用调色板 347
13.7.1建立调色板对象 347
13.7.2将调色板对象指派给DC 347
13.7.3“实现”(Realize)调色板 347
13.7.4画图 347
13.7.5响应系统消息 347
13.7.6调色板的其他成员函数 348
13.8字体与文本输出 349
13.8.1基本知识 349
13.8.2如何描述“字体” 350
13.8.3 CFont类 353
13.8.4多样的文字输出方式 354
13.8.5文字输出的格式与属性 358
第14章 位图 363
14.1简介 363
14.1.1设备独立位图DIB 363
14.1.2设备相关位图DDB 364
14.2 CBitmap类 364
14.2.1建立DDB 364
14.2.2 CBitmap成员函数 365
14.2.3与DDB有关的函数 366
14.3设备无关位图类DIB 367
14.3.1 DIB的结构 367
14.3.2 BITMAPFILEHEADER 367
14.3.3 BITMAPINFO 368
14.3.4 BITMAPINFOHEADER 368
14.3.5 RGBQUAD 369
14.3.6 BMP文件的格式 369
14.3.7 Win32 API和DIB有关的函数 370
14.3.8 DIB与DDB的转换 371
14.4处理DIB的示例 371
14.4.1自己设计CDib类 371
14.4.2主程序 383
14.4.3多页对话框 395
第15章 打印与坐标系 401
15.1打印 401
15.1.1设定打印机的状态 401
15.1.2通过CView打印 403
15.1.3示例 406
15.2比例、原点与方向 409
15.2.1如何改变映射模式 410
15.2.2理想与现实 410
15.2.3示例 411
15.3更大的灵活性 415
15.4打印预览 417
第16章 通用控件 418
16.1概述 418
16.1.1通用控件的种类 418
16.1.2通用控件的共性 421
16.1.3通用控件的通知消息 421
16.1.4通用控件都会产生的通知消息 422
16.2 CSliderCtrl 422
16.2.1 CSliderCtrl的样式 423
16.2.2 CSliderCtrl的成员函数 423
16.2.3 CSliderCtrl的通知消息 425
16.3 CSpinButtonCtrl 425
16.3.1 CSpinButtonCtrl的样式 426
16.3.2 CSpinButtonCtrl的用法 426
16.3.3 CSpinButtonCtrl的其他成员函数 426
16.3.4 CSpinButtonCtrl的通知消息 427
16.4 CHeaderCtrl 427
16.4.1 CHeaderCtrl的样式 427
16.4.2如何使用CHeaderCtrl 427
16.4.3其他的成员函数 429
16.4.4 CHeaderCtrl的通知消息 429
16.5 CAnimateCtrl 429
16.5.1 CAnimateCtrl的样式 430
16.5.2 CAnimateCtrl的成员函数 430
16.5.3 CAnimateCtrl的通知消息 430
16.5.4示例 430
16.6 CProgressCtrl 432
16.6.1 CProgressCtrl的用法 432
16.6.2示例 432
16.7 CtreeCtrl,CTreeView与CImageList 433
16.7.1使用CimageList 433
16.7.2 CTreeCtrl的样式 434
16.7.3 CTreeCtrl的用法 435
16.7.4其他成员函数 437
16.7.5 CTreeCtrl的通知消息 439
16.7.6 CTreeView 441
16.7.7示例:显示磁盘的树状目录 441
16.8 CListCtrl与CListView 453
16.8.1 CListCtrl的样式 455
16.8.2 CListCtrl的用法 455
16.8.3 CListCtrl的成员函数 458
16.8.4 CListCtrl的通知消息 462
16.8.5 CListView 463
16.8.6示例:显示目录中的文件列表 463
16.9示例:程序管理器 475
第17章 使用ActiveX控件 479
17.1 ActiveX控件的由来 479
17.1.1面向组件的程序设计(Component-Oriented Programming) 480
17.2使用ActiveX控件 480
17.2.1安装ActiveX控件 481
17.2.2 MCI32.OCX简介 482
17.3设计ActiveX容器 482
17.3.1启动ActiveX 482
17.3.2插入ActiveX控件 483
17.3.3在对话框中使用MCI控件 485
17.3.4在程序中控制MCI控件 487
第18章 进程和线程 489
18.1 Win32的内存管理 489
18.1.1 Win32的内存分配函数 491
18.2 Process简介 494
18.2.1产生Child Process 494
18.2.2与process有关的信息 497
18.2.3结束process 498
18.3 Thread简介 498
18.3.1产生Child Thread 499
18.3.2 Thread的信息 499
18.3.3终止Thread 500
18.4同步(Synchronization) 500
18.4.1 Critical Section 502
18.4.2等待对象的状态改变 505
18.4.3 Mutex 507
18.4.4 Event 509
18.5进程间通信IPC 512
18.5.1共享内存与文件映射 513
18.6 CWinThread 516
18.6.1 GUI Thread与非GUI Thread 516
18.6.2利用CWinThread产生Thread的流程 516
18.6.3其他的CWinThread成员 517
第19章 Profile与Registry 518
19.1什么是Profile 518
19.2什么是Registry 519
19.2.1建立新的key 520
19.2.2打开已存在的entry 521
19.2.3写入信息 522
19.2.4读取信息 522
19.2.5删除key或entry 523
19.2.6关闭Key 523
附录 Internet上的MFC资源 524