序言 1
第一章 何谓Windows程序 1
1.1Windows简史 2
1.2从用户观点看Windows 3
1.2.1图形用户接口(GUI) 3
1.2.2GUI概念和原理 4
1.2.3一致的用户接口 4
1.2.4多任务的优点 6
1.2.5内存管理 7
1.2.6与设备无关的图形接口 8
1.2.7MS-DOS应用程序 9
1.3从程序员观点看Wndows 10
1.3.1Windows和MS-DOS 10
1.3.2Windows的任务 11
1.3.3函数调用 11
1.3.4动态链接 12
1.3.5面向对象的程序设计 14
1.3.6消息驱动的体系结构 14
1.3.7窗口过程 15
1.4第一个Windows程序设计 16
1.4.1程序的问题 17
1.4.2HELLOWIN文件 18
1.4.3MAKE文件 23
1.4.4C源程序文件 26
1.4.5Windows函数调用 26
1.4.6大写标识符 27
1.4.7新数据类型 28
1.4.8获取句柄 30
1.4.9匈牙利表示法 30
1.4.10程序入口点 32
1.4.11注册窗口类 33
1.4.12建立窗口 37
1.4.13显示窗口 39
1.4.14消息循环 40
1.4.15窗口过程 43
1.4.16处理消息 44
1.4.17WM_PAINT消息 45
1.4.18WM_DESTROY消息 47
1.4.19模块定义文件 48
1.5Windows程序设计 49
1.5.1不同的调用方式 50
1.5.2排队和非排队消息 52
1.5.3非抢先多任务 54
1.5.4学习的过程 55
第二章 文本画面 57
2.1绘图和重画 58
2.1.1WM_PAINT消息 58
2.1.2有效矩形和无效矩形 59
2.2GDI简介 60
2.2.1设备环境 61
2.2.2获取环境句柄(方法一) 62
2.2.3绘图信息结构 63
2.2.4获取环境句柄(方法二) 66
2.2.5TextOut(细节) 66
2.2.6系统字模 68
2.2.7字符尺寸 69
2.2.8文本点阵(细节) 70
2.2.9格式文本 70
2.2.10示范程序 73
2.2.11SYSMETS1.C窗口过程 81
2.2.12空间不够 83
2.2.13工作区尺寸 84
2.3滚动条 85
2.3.1滚动条的范围和位置 87
2.3.2滚动条消息 88
2.3.3滚动条程序SYSMETS 90
2.3.4组织绘图程序 97
2.3.5建立更佳的滚动条 99
2.3.6无鼠标操作 108
第三章 键盘 109
3.1键盘基础知识 109
3.1.1键盘驱动程序 110
3.1.2舍弃某些键盘消息 111
3.1.3谁是输入点 112
3.1.4击键和字符 113
3.2击键消息 114
3.2.1系统击键与非系统击键 114
3.2.2lParam变量 116
3.2.3虚拟键码 118
3.2.4Shift状态 122
3.2.5使用击键消息 123
3.3在SYSMETS中增加键盘接口 124
3.3.1增加WM_KEYDOWN逻辑 125
3.3.2发送消息 127
3.4字符消息 138
3.4.1WM_CHAR消息 141
3.4.2死字符消息 142
3.5浏览键盘消息 143
3.6插入记号(不是光标) 152
3.6.1插入记号函数 152
3.6.2TYPE程序 154
3.7WINDOWS字符集 165
3.7.1OEM字符集 166
3.7.2ANSI字符集 168
3.7.3OEM、ANSI及字模 168
3.8国际化问题 169
3.8.1使用字符集 170
3.8.2与MS-DOS对话 171
3.8.3使用数字小键盘 173
第四章 鼠标 174
4.1鼠标基础知识 174
4.1.1快速定义 174
4.2工作区的鼠标消息 175
4.2.1简单鼠标处理举例 177
4.2.2POINT、RECT和1Param 184
4.2.3对Shift键的处理 186
4.2.4鼠标的双选 187
4.3非工作区的鼠标消息 188
4.3.1击中测试消息 190
4.3.2消息来源于消息 191
4.4程序中的击中测试 192
4.4.1一个假设的例子 193
4.4.2程序举例 194
4.4.3用键盘来模拟鼠标 199
4.4.4在CHECKER中增加键盘接口 202
4.4.5使用子窗口代替击中测试 209
4.4.6CHECKER中的子窗口 210
4.5捕获鼠标 219
4.5.1BLOWUP1程序 219
4.5.2改变鼠标光标形状 225
4.5.3StretchBlt调用 227
4.5.4画出捕获的块 227
第五章 计时器 229
5.1计时器基础知识 231
5.1.1SYSTEM.DRV和Windows计时器 231
5.1.2计时消息不是异步的 233
5.2使用计时器的三种方法 234
5.2.1第一种方法 235
5.2.2无计时器可用时如何处理 236
5.2.3程序举例 239
5.2.4第二种方法 245
5.2.5程序举例 248
5.2.6正确使用反调用函数 252
5.2.7第三种方法 255
5.3计时器用于状态报告 255
5.3.1有创造性地使用图标 261
5.3.2强制变成图标 262
5.3.3保持图标为图标 263
5.3.4计算可用内存 263
5.3.5使用浮点运算 264
5.4使用计时器作时钟 264
5.4.1对弹出窗口定位及给出大小 272
5.4.2获得日期和时间 272
5.4.3国际化 272
5.5Windows的标准时间 274
第六章 子窗口控制 276
6.1按钮类 278
6.1.1建立子窗口 284
6.1.2子窗口与父窗口对话 286
6.1.3父窗口与子窗口对话 287
6.1.4PUSH按钮 288
6.1.5检查框(check box) 290
6.1.6收音机按钮(radio button) 291
6.1.7GROUP框 292
6.1.8用户定义按钮 292
6.1.9改变按钮正文 292
6.1.10可见的与可用的按钮 293
6.1.11按钮与输入点 294
6.2控制及颜色 295
6.2.1系统颜色 296
6.2.2按钮颜色 298
6.2.3WM_CTLCOLOR消息 299
6.3静态类(static class) 302
6.4滚动条类(scrollbar class) 304
6.4.1COLORS1程序 306
6.4.2自动键盘接口 316
6.4.3窗口子类(windows subclassing) 317
6.4.4加背景色 318
6.4.5对滚动条上色 320
6.4.6处理多种事例 321
6.4.7将COLORS1作为图标 322
6.5编辑类(edit class) 322
6.5.1编辑类模式 327
6.5.2编辑控制通知单(Edit Control Notification) 328
6.5.3使用编辑控制 329
6.5.4向编辑控制发送的消息 329
6.6目录框类(listbox class) 331
6.6.1目录框样式 332
6.6.2在目录框中放入字符串 333
6.6.3选择和摘取输入 335
6.6.4从目录框接受消息 337
6.6.5目录框应用程序举例 338
6.6.6显示文件目录 344
6.6.7Windows的头 346
6.6.82KB的空间浪费 355
第七章 内存管理 356
7.1INTEL存储器的段模式 358
7.2Windows的内存组织 359
7.2.1固定段与可移动段 361
7.2.2可淘汰内存 362
7.2.3全局内存表 364
7.2.4局部内存 365
7.3代码段和数据段 367
7.3.1小型、中型、紧凑性、大型和巨型存储模式 367
7.3.2多代码段 369
7.3.3紧凑存储模式和大存储模式 371
7.3.4避免移动 373
7.3.5程序段属性 374
7.4Windows如何移动与重装入程序段 377
7.4.1远程函数的特殊处理 378
7.4.2Windows执行程序 382
7.4.3MakeProcInstance的作用 384
7.4.4动态链接库带来的差异 386
7.4.5栈探测 387
7.4.6扩充存储器 388
7.4.7保护方式 390
7.5在程序内部申请空间 391
7.5.1存储块锁定 392
7.5.2一个快速示例 393
7.5.3全局内存函数 394
7.5.4其它的内存函数 397
7.5.5使用可淘汰全局内存 399
7.5.6巨型全局内存块 400
7.5.7局部内存分配 403
7.5.8其它的局部内存函数 406
7.5.9锁定自己的数据段 407
7.5.10内存分配的“捷径” 408
7.5.11使用C的内存函数 410
7.5.12在保护方式下运行 411
第八章 图标、光标、位图和字符串 413
8.1资源编译 414
8.2图标与光标 417
8.2.1SDKPAINT工具 422
8.2.2取得图标句柄 426
8.2.3在程序中使用图标 428
8.2.4使用侯选光标的语句 429
8.3资源与内存 430
8.3.1位图:象素点图画 431
8.3.2使用位图和画刷 432
8.4字符串 438
8.4.1使用字符串资源 438
8.4.2在消息框中使用字符串 439
8.4.3字符串与内存空间 441
8.4.4用户自定义资源 442
第九章 菜单与加速键 456
9.1菜单 456
9.1.1菜单结构 457
9.1.2菜单样本 458
9.1.3应用程序中如何调用菜单 462
9.1.4菜单和消息 464
9.1.5范例 468
9.1.6菜单格式 478
9.1.7定义菜单的另一种格式 479
9.1.8定义菜单的第三种途径 481
9.1.9浮动的弹出式菜单 481
9.1.10系统菜单的使用 490
9.1.11修改菜单 496
9.1.12其它菜单命令 496
9.1.13一个非正规的菜单 498
9.2菜单中使用位图 506
9.2.1利用位图作为菜单项的两种方法 520
9.2.2内存设备环境 521
9.2.3用程序建立位图 522
9.2.4位图的变形调整 523
9.2.5完整菜单的形成 525
9.2.6增加键盘操作界面 527
9.3加速键 528
9.3.1为什么要使用加速键 528
9.3.2加速键定义的一些规则 529
9.3.3加速键表 530
9.3.4装入加速键表 533
9.3.5加速键的转换 533
9.3.6接收加速键消息 535
9.3.7用菜单和加速键编写的POPPAD程序 536
9.3.8菜单项能否执行的判别 546
9.3.9菜单项的处理 547
第十章 会话框 552
10.1标准会话框 553
10.1.1建立“About”会话框 553
10.1.2会话框样本 559
10.1.3会话框过程 562
10.1.4会话框过程的卸出 564
10.1.5会话框的启动 564
10.1.6进一步讨论会话框样式 566
10.1.7其它会话框控制 568
10.1.8一个稍复杂的会话框 571
10.1.9会话框中控制的处理 581
10.1.10OK和Cancel按钮 585
10.1.11控制的分组 587
10.1.12会话框中绘图 590
10.1.13在会话框中使用其它函数 591
10.1.14自定义控制 591
10.2消息框 602
10.2.1Assertion消息框 604
10.2.2用消息框显示有关消息 606
10.3POPPAD程序的文件菜单项功能 607
10.3.1OpenFile函数 607
10.3.2文件输入输出的两种方式 611
10.3.3Open和Save菜单项的会话框 615
10.3.4DlgDirList函数和DlgDirSelect函数 627
10.3.5获取合法文件名 629
10.3.6新版的POPPAD程序 630
10.4非标准会话框 652
10.4.1标准会话框和非标准会话框之间的区别 653
10.4.2新版的COLORS程序 655
10.4.3HEXCALC程序是窗口还是会话框 664
10.4.4控制标识符的有效使用 675
10.5会话框实用程序的使用 676
第十一章 GDI引言 681
11.1GDI原理 681
11.2设备环境(DC) 684
11.2.1获取设备环境句柄 684
11.2.2获取设备环境信息 687
11.2.3DEVCAPS1程序 688
11.2.4设备尺寸 707
11.2.5查找色彩信息 709
11.2.6设备环境属性 711
11.2.7保存设备环境 712
11.3映射方式 715
11.3.1设备坐标和逻辑坐标 717
11.3.2设备坐标 718
11.3.3视口和窗口 719
11.3.4使用MM_TEXT方式工作 721
11.3.5“Metric”映射方式 726
11.3.6“Roll Your Own”映射方式 729
11.3.7WHATSIZE程序 737
第十二章 作图 745
12.1画点 745
12.2画线 746
12.2.1使用库存画笔 749
12.2.2生成、选择、删除画笔 751
12.2.3避免设备依赖性 756
12.2.4在隙间填充 757
12.2.5作图方式 757
12.2.6ROP2和色彩 767
12.3绘制填充区域 769
12.3.1有界图形 771
12.3.2ARCS程序 777
12.3.3饼图的三角学 784
12.3.4Polygon函数和Polygon填充方式 787
12.3.5涂刷图形内部 789
12.3.6画刷和位图 793
12.3.7生成和使用位图画刷 795
12.3.8画刷的定位 799
12.4矩形、区域和裁剪 803
12.4.1对矩形进行工作 804
12.4.2生成和绘制区域 806
12.4.3对矩形和区域进行裁剪 808
12.4.4CLOVER程序 809
12.5杂类GDI函数 817
12.6永久绘图程序 825
第十三章 位图、位块传输和图元文件 835
13.1旧位图格式 837
13.1.1在程序中生成位图 837
13.1.2单色位图格式 840
13.1.3彩色位图格式 841
13.1.4位图的大小 842
13.2设备无关位图 843
13.2.1DIB文件 843
13.2.2生成一个DIB 846
13.3内存设备环境 848
13.4强有力的BLT 850
13.4.1patBlt函数 851
13.4.2块传递(BLT)坐标 854
13.4.3使用BitBlt传递位 856
13.4.4DrawBitmap程序 858
13.4.5使用不同的ROP代码 860
13.4.6内存设备环境更有趣的应用 863
13.4.7色彩转换 869
13.4.8映射方式的转换 871
13.4.9使用StretchBlt扩展位图 871
13.4.10动画 873
13.5图元文件 880
13.5.1内存图元文件的简单应用 881
13.5.2在磁盘上存放图元文件 884
13.5.3使用已存在的图元文件 886
13.5.4把图元文件作为源 890
13.5.5查看图元文件 896
13.5.6图元文件做什么、不做什么 898
第十四章 文本和字模 901
14.1简单文本输出 901
14.1.1文本输出函数 901
14.1.2文本的设备环境属性 904
14.1.3使用矢量字体 905
14.1.4使字符串变灰 907
14.1.5GrayString的简单用法 910
14.1.6不用GrayString而使字符串变灰 910
14.2字体的背景知识 911
14.2.1字模的类型 911
14.2.2话题1:系列和字样 913
14.2.3字体资源文件 916
14.2.4话题2:关于“点” 918
14.2.5为什么要使用逻辑英寸 919
14.2.6话题3:leading和spacing 920
14.2.7逻辑“TWIPS”映射方式 921
14.3创建、选择和删除逻辑字体 923
14.3.1字体选择及定义 939
14.3.2逻辑字体结构 940
14.3.3字模端射算法 946
14.3.4找出字模 947
14.4枚举字体 950
14.5文本格式化 969
14.5.1单行文本对齐 970
14.5.2段落处理 972
第十五章 使用打印机 991
15.1打印、假脱机(spooling)和Escape 992
15.2打印机设备环境(device context) 997
15.2.1获得CreateDC参数 998
15.2.2重新考虑 1002
15.2.3DeviceMode调用 1013
15.2.4检查BitBlt性能 1016
15.3打印基础 1017
15.3.1Escape函数 1017
15.3.2FROMFEED 1018
15.4打印图形和文本 1022
15.4.1裸机打印 1027
15.4.2设置终止过程 1030
15.4.3Windows如何使用AbortProc 1033
15.4.4实现终止过程 1034
15.4.5增加打印对话框 1040
15.4.6在POPPAD中增加打印 1048
15.4.7处理错误码 1058
15.5段技术 1060
15.5.1讨论段技术 1061
15.5.2以不同的方式使用终止过程 1065
15.6打印机和字模 1073
第十六章 剪接板 1076
16.1初步使用剪接板 1076
16.1.1标准剪接板数据格式 1077
16.1.2向剪接板传送文本 1078
16.1.3从剪接板得到文本 1080
16.1.4剪接板功能 1081
16.1.5打开和关闭剪接板 1082
16.1.6使用剪接板操作拉图 1083
16.1.7BLOWUP程序的改进版本 1084
16.1.8图元文件和图元文件图象 1093
16.2剪接板的高级用法 1100
16.2.1多数据项的使用 1101
16.2.2延迟涂抹 1103
16.2.3私有数据格式 1105
16.3编写剪接板视窗 1109
16.3.1剪接板视窗链 1109
16.3.2剪接板视窗函数和消息 1110
16.3.3一个简单的剪接板视窗 1114
第十七章 动态数据交换(DDE) 1120
17.1基本概念 1121
17.1.1应用、主题和项(application、topic和item) 1121
17.1.2会话的类型 1122
17.1.3字符串和原子(atoms) 1128
17.2DDE服务器程序样本 1130
17.2.1DDEPOP程序 1152
17.2.2WM_DDE_INITIATE消息 1153
17.2.3ServerProc窗口过程 1154
17.2.4WM_DDE_REQUEST消息 1155
17.2.5DDEPOP的PostDataMessage函数 1157
17.2.6WM_DDE_ADVISE消息 1158
17.2.7修改项 1161
17.2.8WM_DDE_UNADVISE消息 1162
17.2.9WM_DDE_TERMINATE消息 1162
17.3DDE顾客程序样本 1163
17.3.1开始DDE会话 1176
17.3.2WM_DDE_DATA消息 1178
17.3.3WM_DDE_TERMINATE消息 1179
17.4异常情况下的处理 1180
第十八章 多文件界面 1181
18.1MDI的要素 1181
18.2WINDOWS 3和MDI 1183
18.3样本程序 1185
18.3.1三个菜单 1206
18.3.2程序初始化 1207
18.4创建子窗口 1209
18.5框架窗口消息处理 1210
18.6子文件窗口 1212
18.7窗口过程的效力 1215
第十九章 动态链接库 1216
19.1库基本概念 1216
19.1.1“库”字的多种含义 1218
19.1.2用EXEHDR检查库 1219
19.2STRPROG和STRLIB 1221
19.2.1STRLIB库 1222
19.2.2生成文件的不同之处 1227
19.2.3库的入口点 1228
19.2.4STRLIB的函数 1230
19.2.5库模块定义文件 1230
19.2.6STRPROG程序 1231
19.2.7运行STRPROG 1242
19.2.8远程函数的引导代码 1243
19.2.9反调函数的用途 1244
19.3DS!=SS问题 1246
19.4库的其它限制 1252
19.5确定链接的几种不同方法 1253
19.6利用输入库 1255
19.7截获窗口函数调用 1259
19.8无输入的动态链接 1261
19.9资源库 1262