目录 1
序言 1
第一章 何谓Windows程序 1
1.1 Windows简史 2
1.2 从用户观点看Windows 3
1.2.1 图形用户接口(GUI) 3
1.2.2 GUI概念和原理 4
1.2.3 一致的用户接口 4
1.2.4 多任务的优点 6
1.2.5 内存管理 7
1.2.6 与设备无关的图形接口 8
1.2.7 MS-DOS应用程序 9
1.3.1 Windows和MS-DOS 10
1.3 从程序员观点看Wndows 10
1.3.2 Windows的任务 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.2 HELLOWIN文件 18
1.4.3 MAKE文件 23
1.4.4 C源程序文件 26
1.4.5 Windows函数调用 26
1.4.6 大写标识符 27
1.4.7 新数据类型 28
1.4.9 匈牙利表示法 30
1.4.8 获取句柄 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.17 WM_PAINT消息 45
1.4.18 WM_DESTROY消息 47
1.4.19 模块定义文件 48
1.5 Windows程序设计 49
1.5.1 不同的调用方式 50
1.5.2 排队和非排队消息 52
1.5.3 非抢先多任务 54
1.5.4 学习的过程 55
第二章 文本画面 57
2.1 绘图和重画 58
2.1.1 WM_PAINT消息 58
2.1.2 有效矩形和无效矩形 59
2.2 GDI简介 60
2.2.1 设备环境 61
2.2.2 获取环境句柄(方法一) 62
2.2.3 绘图信息结构 63
2.2.4 获取环境句柄(方法二) 66
2.2.5 TextOut(细节) 66
2.2.6 系统字模 68
2.2.7 字符尺寸 69
2.2.8 文本点阵(细节) 70
2.2.9 格式文本 70
2.2.10 示范程序 73
2.2.11 SYSMETS1.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.2 lParam变量 116
3.2.3 虚拟键码 118
3.2.4 Shift状态 122
3.2.5 使用击键消息 123
3.3 在SYSMETS中增加键盘接口 124
3.3.1 增加WM_KEYDOWN逻辑 125
3.3.2 发送消息 127
3.4 字符消息 138
3.4.1 WM_CHAR消息 141
3.4.2 死字符消息 142
3.5 浏览键盘消息 143
3.6.1 插入记号函数 152
3.6 插入记号(不是光标) 152
3.6.2 TYPE程序 154
3.7 WINDOWS字符集 165
3.7.1 OEM字符集 166
3.7.2 ANSI字符集 168
3.7.3 OEM、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.2 POINT、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.6 CHECKER中的子窗口 210
4.5 捕获鼠标 219
4.5.1 BLOWUP1程序 219
4.5.2 改变鼠标光标形状 225
4.5.3 StretchBlt调用 227
4.5.4 画出捕获的块 227
第五章 计时器 229
5.1 计时器基础知识 231
5.1.1 SYSTEM.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.3 计时器用于状态报告 255
5.2.7 第三种方法 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.5 Windows的标准时间 274
第六章 子窗口控制 276
6.1 按钮类 278
6.1.1 建立子窗口 284
6.1.2 子窗口与父窗口对话 286
6.1.3 父窗口与子窗口对话 287
6.1.4 PUSH按钮 288
6.1.5 检查框(check box) 290
6.1.6 收音机按钮(radio button) 291
6.1.7 GROUP框 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.3 WM_CTLCOLOR消息 299
6.3 静态类(static class) 302
6.4 滚动条类(scrollbar class) 304
6.4.1 COLORS1程序 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.7 Windows的头 346
6.6.8 2KB的空间浪费 355
第七章 内存管理 356
7.1 INTEL存储器的段模式 358
7.2 Windows的内存组织 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.4 Windows如何移动与重装入程序段 377
7.4.1 远程函数的特殊处理 378
7.4.2 Windows执行程序 382
7.4.3 MakeProcInstance的作用 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.1 SDKPAINT工具 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.1 为什么要使用加速键 528
9.3 加速键 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.5 会话框的启动 564
10.1.4 会话框过程的卸出 564
10.1.6 进一步讨论会话框样式 566
10.1.7 其它会话框控制 568
10.1.8 一个稍复杂的会话框 571
10.1.9 会话框中控制的处理 581
10.1.10 OK和Cancel按钮 585
10.1.11 控制的分组 587
10.1.12 会话框中绘图 590
10.1.13 在会话框中使用其它函数 591
10.1.14 自定义控制 591
10.2 消息框 602
10.2.1 Assertion消息框 604
10.2.2 用消息框显示有关消息 606
10.3 POPPAD程序的文件菜单项功能 607
10.3.1 O penFile函数 607
10.3.2 文件输入输出的两种方式 611
10.3.3 Open和Save菜单项的会话框 615
10.3.4 DlgDirList函数和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.3 HEXCALC程序是窗口还是会话框 664
10.4.4 控制标识符的有效使用 675
10.5 会话框实用程序的使用 676
第十一章 GDI引言 681
11.1 GDI原理 681
11.2 设备环境(DC) 684
11.2.1 获取设备环境句柄 684
11.2.2 获取设备环境信息 687
11.2.3 DEVCAPS1程序 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.7 WHATSIZE程序 737
12.1 画点 745
第十二章 作图 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.6 ROP2和色彩 767
12.3 绘制填充区域 769
12.3.1 有界图形 771
12.3.2 ARCS程序 777
12.3.3 饼图的三角学 784
12.3.4 Polygon函数和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.4 CLOVER程序 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.1 DIB文件 843
13.2 设备无关位图 843
13.2.2 生成一个DIB 846
13.3 内存设备环境 848
13.4 强有力的BLT 850
13.4.1 patBlt函数 851
13.4.2 块传递(BLT)坐标 854
13.4.3 使用BitBlt传递位 856
13.4.4 DrawBitmap程序 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.5 GrayString的简单用法 910
14.1.6 不用GrayString而使字符串变灰 910
14.2.1 字模的类型 911
14.2 字体的背景知识 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.3 DeviceMode调用 1013
15.2.4 检查BitBlt性能 1016
15.3 打印基础 1017
15.3.1 Escape函数 1017
15.3.2 FROMFEED 1018
15.4 打印图形和文本 1022
15.4.1 裸机打印 1027
15.4.2 设置终止过程 1030
15.4.3 Windows如何使用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.7 BLOWUP程序的改进版本 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.2 DDE服务器程序样本 1130
17.2.1 DDEPOP程序 1152
17.2.2 WM_DDE_INITIATE消息 1153
17.2.3 ServerProc窗口过程 1154
17.2.4 WM_DDE_REQUEST消息 1155
17.2.5 DDEPOP的PostDataMessage函数 1157
17.2.6 WM_DDE_ADVISE消息 1158
17.2.7 修改项 1161
17.2.8 WM_DDE_UNADVISE消息 1162
17.2.9 WM_DDE_TERMINATE消息 1162
17.3 DDE顾客程序样本 1163
17.3.1 开始DDE会话 1176
17.3.2 WM_DDE_DATA消息 1178
17.3.3 WM_DDE_TERMINATE消息 1179
17.4 异常情况下的处理 1180
18.1 MDI的要素 1181
第十八章 多文件界面 1181
18.2 WINDOWS 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.2 STRPROG和STRLIB 1221
19.2.1 STRLIB库 1222
19.2.2 生成文件的不同之处 1227
19.2.3 库的入口点 1228
19.2.4 STRLIB的函数 1230
19.2.5 库模块定义文件 1230
19.2.6 STRPROG程序 1231
19.2.7 运行STRPROG 1242
19.2.8 远程函数的引导代码 1243
19.2.9 反调函数的用途 1244
19.3 DS!=SS问题 1246
19.4 库的其它限制 1252
19.5 确定链接的几种不同方法 1253
19.6 利用输入库 1255
19.7 截获窗口函数调用 1259
19.8 无输入的动态链接 1261
19.9 资源库 1262