第一章 Windows概貌 1
16.1.4 书写板做什么 (60 1
1.1 Windows简要历史回顾 1
目录 1
第一部分 准备 1
序言 1
1.2 从用户角度看Windows 2
1.2.1 图形用户界面(GUI) 2
1.2.2 GUI的概念及其基本原理 2
1.2.3 一致性的用户界面 3
1.2.4 多任务的优点 4
1.2.5 内存管理 5
1.2.6 与设备无关的图形界面 6
1.2.7 MS-DOS应用程序 6
1.3 从程序员角度看Windows 6
1.3.1 Windows和MS-DOS 6
1.3.3 函数调用 7
1.3.2 Windows程序的特点 7
1.3.5 面向目标的程序设计 8
1.3.4 动态链接 8
1.3.6 消息驱动的程序结构 9
1.3.7 窗口过程 9
1.4 第一个Windows应用程序 10
1.4.1 这程序中有错吗? 10
1.4.2 HELLOWIN程序文件 11
1.4.3 Make文件 14
1.4.4 C源代码文件 15
1.4.6 大写字母标识符 16
1.4.5 Windows函数调用 16
1.4.7 新的数据类型 17
1.4.8 获得一个句柄 17
1.4.9 匈牙利表示法 18
1.4.10 程序入口点 19
1.4.11 登记窗口类别 19
1.4.12 创建窗口 22
1.4.13 显示窗口 23
1.4.14 消息循环 23
1.4.15 窗口过程 25
1.4.16 处理消息 25
1.4.17 WM__PAINT消息 26
1.4.18 WM__DESTROY消息 27
1.5 Windows程序设计的障碍 28
1.4.19 模块定义文件 28
1.5.1 Don't Call me,I'll Call You 29
1.5.2 排队的和不排队的消息 30
1.5.3 非抢先的多任务 31
1.5.4 学习策略 32
第二章 绘制正文 33
2.1 绘制和重画 33
2.1.1 WM__PAINT消息 34
2.1.2 有效的和无效的矩形 34
5.2.1 方法一 (1 35
2.2 GDI介绍 35
2.2.1 设备上下文 35
2.2.2 获取设备上下文句柄的方法一 36
2.2.3 PAINTSTRUCT结构 37
2.2.4 获取设备上下文句柄的方法二 38
2.2.5 TextOut的细节 39
2.2.6 系统字体 40
2.2.7 字符大小 40
2.2.8 正文尺度的细节 41
2.2.9 格式化正文 42
2.2.10 小结为一个简单程序 43
2.2.11 SYSMETSl.C的窗口过程 47
2.2.13 用户区域的大小 49
2.2.12 没有足够的显示空间! 49
2.3 滚动杆 50
2.3.1 滚动杆范围和位置 51
2.3.2 滚动杆消息 52
2.3.3 SYSMETS的滚动 53
2.3.4 构造你自己的绘图程序 57
2.3.5 建立更好的滚动杆 58
2.3.6 若不想使用鼠标器 62
第二部分 读输入 64
第三章 键盘 64
3.1 键盘工作原理 64
3.1.1 键盘驱动程序 64
3.1.3 输入焦点 65
3.1.2 对键盘的忽略 65
3.1.4 击键和字符 66
3.2 击键消息 66
3.2.1 系统和非系统击键 67
3.2.2 lParam变量 67
3.2.3 虚键码 69
3.2.4 换档状态 71
3.2.5 击键消息的使用 71
3.3 对SYSMETS的增强:加入键盘接口 72
3.3.1 增加WM__KEYDOWN逻辑 72
3.3.2 发送消息 74
3.4 字符消息 79
3.4.2 死字符消息 81
3.4.1 WM__CHAR消息 81
3.5 查看键盘消息 82
3.6 插入记号(不是光标) 86
3.6.1 插入记号函数 87
3.6.2 TYPE程序 87
3.7 Windows字符集 94
3.7.1 OEM字符集 94
3.7.3 OEM、ANSI和字体 95
3.7.2 ANSI字符集 95
3.8 关于国际化要考虑的问题 96
3.8.1 字符集的活用 96
3.8.2 话说MS-DOS 97
3.8.3 数字小键盘的使用 98
第四章 鼠标器 100
4.1 鼠标器工作原理 100
4.1.1 一些重要的定义 100
4.2 用户区域的鼠标器消息 101
4.2.1 简单的鼠标器处理一例 102
4.2.2 POINT、RECT和lParam 105
4.2.4 鼠标器的二次卡嗒 107
4.2.3 处理换档键 107
4.3 非用户区域的鼠标器消息 108
4.3.1 命中测试消息 110
4.3.2 由消息产生消息 110
4.4 应用程序中的命中测试 111
4.4.1 一个假想的例子 111
4.4.2 一个样本程序 111
4.4.3 用键盘仿真鼠标器 115
4.4.4 对CHECKER程序附加键盘接口 116
4.4.5 命中测试的子窗口用法 120
4.4.6 CHECKER程序中的子窗口 121
4.5 捕捉鼠标 125
4.5.1 BLOWUPl程序 125
4.5.2 改变鼠标器光标的形状 129
4.5.3 StretchBlt调用 130
4.5.4 画捕捉块 130
第五章 计时器 132
5.1.1 SYSTEM.DRV和Windows计时器 133
5.1 计时器工作原理 133
5.1.2 计时器消息不是异步的 134
5.2 使用计时器的三种方法 135
5.2.1.1 如何处理没有空余的计时器情况 136
5.2.1.2 一个示例程序 137
5.2.1.3 Windows的颜色使用 140
5.2.2 方法二 141
5.2.2.1 一个示例程序 143
5.2.2.2 止确处置反调用函数 145
5.2.3 方法三 146
5.3 使用计时器作状态报告 147
5.3.1 图标的活用 149
5.3.2 强迫显示图标 150
5.3.5 使用浮点运算 151
5.4 使用计时器作为时钟 151
5.3.4 计算自由内存 151
5.3.3 保持图标只显示为图标 151
5.4.1 确定弹出式窗口的位置和大小 155
5.4.2 获得日期和时间 155
5.4.3 国际化 156
5.5 Windows标准时间 157
第六章 子窗口控制 158
6.1 按钮类别 159
6.1.1 创建子窗口 162
6.1.2 子窗口与父窗口的通话 164
6.1.3 父窗口与子窗口的通话 164
6.1.4 下压式按钮 165
6.1.5 检查框 165
6.1.6 圆形按钮 166
6.1.10 可见的和能使的按钮 167
6.1.7 成组框 167
6.1.8 用户定义的按钮 167
6.1.9 修改按钮正文 167
6.1.11 按钮和输入焦点 168
6.2 控制和颜色 169
6.2.1 系统颜色 169
6.2.2 按钮颜色 170
6.2.3 WM__CTLCOLOR消息 171
6.3 静态类别 173
6.4 滚动杆类别 174
6.4.1 COLORS1程序 175
6.4.2 自动键盘接口 180
6.4.4 背景的着色 181
6.4.3 窗口子分类 181
6.4.5 滚动杆的着色 182
6.4.7 COLORS1作为图标 183
6.5 编辑类别 183
6.4.6 处理多个实例 183
6.5.1 编辑类别型式 186
6.5.2 编辑控制通知码 187
6.5.3 编辑控制的使用 187
6.5.4 发给编辑控制的消息 188
6.6 列表框类别 188
6.6.1 列表框型式 189
6.6.2 在列表框中放入字符串 190
6.6.3 表项的选择和提取 191
6.6.4 接收来自列表框的消息 192
6.6.5 一个简单的列表框应用程序 193
6.6.6 文件列表 196
6.6.7 Windows用的head程序 197
6.6.8 2KB耗费的空间 201
第三部分 使用资源 202
第七章 内存管理 202
7.1 Intel型式:分段内存 203
7.2 Windows的内存组织 204
7.2.1 固定的和可移动的段 205
7.2.2 可废弃的内存 205
7.2.3 全局内存布局 206
7.2.4 局部内存 207
7.3 代码段和数据段 208
7.3.1 内存模型:小、中、紧凑、大和超大 208
7.3.2 多个代码段 209
7.3.3 紧凑模型和大模型怎么样? 210
7.3.4 避免内存移动问题 211
7.3.5 程序段的属性 212
7.4 Windows怎样移动和重新装入程序段 213
7.4.1 对far函数的特殊处理 214
7.4.2 Windows何时运行应用程序 216
7.4.3 MakeprocInstance的功能 218
7.4.4 关于动态库的差别 218
7.4.5 栈的查看 219
7.4.6 扩展内存 220
7.4.7 保护模式 221
7.5 在应用程序内分配内存 221
7.5.1 锁定内存块 222
7.5.2 一个生动的例子 222
7.5.3 全局内存函数 223
7.5.4 另外几个全局内存函数 225
7.5.5 使用可废弃的全局内存 226
7.5.6 超大型全局内存块 227
7.5.7 分配局部内存 229
7.5.8 另外几个局部内存函数 230
7.5.9 锁定你自己的数据段 231
7.5.10 内存分配的捷径 232
7.5.11 使用C语言的内存分配函数 233
7.5.12 在保护模式下运行应用程序 233
第八章 图标、光标、位图和字符串 234
8.1 编译资源 234
8.2 图标和光标 236
8.2.1 SDKPAINT工具 239
8.2.2 获得一个图标的句柄 241
8.2.3 在应用程序中使用图标 242
8.2.4 使用另外的光标 243
8.3 资源和内存 244
8.3.1 位图:以象素表示的图 244
8.3.2 使用位图和刷子 245
8.4 字符串 248
8.4.1 使用字符串资源 249
8.4.2 在MessageBox中使用字符串 249
8.4.3 字符串和内存空间 250
8.5 用户定义的资源 251
第九章 菜单和加速键 259
9.1 菜单 259
9.1.1 菜单结构 259
9.1.2 菜单样板 260
9.1.3 在应用程序中引用菜单 263
9.1.4 菜单和消息 264
9.1.5 一个示例程序 266
9.1.6 菜单的设计规则 271
9.1.7 一种较难的定义菜单方法 271
9.1.8 第三种定义菜单的方法 273
9.1.9 浮动的弹出式菜单 273
9.1.10 使用系统菜单 278
9.1.11 修改菜单 281
9.1.12 其它的菜单命令 281
9.1.13 一种非正统的建立菜单方法 282
9.2 在菜单中使用位图 286
9.2.1 两种创建菜单位图的方法 294
9.2.2 内存设备上下文 294
9.2.3 创建含有正文的位图 295
9.2.4 按比例扩缩位图 296
9.2.5 将菜单放在一起 297
9.2.6 增加键盘接口 298
9.3.2 加速键的分配规则 299
9.3.1 为什么要使用键盘加速键 299
9.3 键盘加速键 299
9.3.3 加速键表 300
9.3.4 装入加速键表 302
9.3.5 翻译加速键消息 302
9.3.6 接收加速键消息 303
9.3.7 使用菜单和加速键的POPPAD程序 304
9.3.8 能使菜单项 309
9.3.9 处理菜单选项 310
第十章 对话框 312
10.1 模式对话框 312
10.1.1 建立一个“About”对话框 312
10.1.2 对话框样板 316
10.1.3 对话框过程 317
10.1.5 调用对话框 319
10.1.4 输出对话框过程 319
10.1.6 再谈对话框型式 320
10.1.7 再谈定义控制 321
10.1.8 较复杂的对话框 323
10.1.9 处理对话框控制 328
10.1.10 OK和Cancel按钮 330
10.1.11 制表停止位置和组项 331
10.1.12 在对话框上绘画 333
10.1.13 与对话框一起使用其它函数 334
10.1.14 定义你自己的控制 334
10.2 消息框 340
10.2.1 断言消息框 341
10.2.2 弹出式信息 342
10.3 处理文件:重返POPPAD程序 343
10.3.1 OpenFile函数的调用 343
10.3.2 文件I/O的两种方法 345
10.3.3 用作打开和保存的对话框 347
10.3.4 DlgDirList和DlgDirSelect函数 353
10.3.5 获取有效的文件名 354
10.3.6 POPPAD程序的新版本 355
10.4 无模式的对话框 365
10.4.1 模式对话框与无模式对话框之间的区别 366
10.4.2 新的COLORS程序 368
10.4.3 HEXCALC:窗口还是对话框? 373
10.4.4 创造性地使用控制ID 378
10.5 使用DIALOG实用程序 379
第四部分 图形设备接口 382
第十一章 GDI引论 382
11.1 GDI的基本原理 382
11.2.1 获取设备上下文的句柄 383
11.2 设备上下文 383
11.2.2 获取设备上下文信息 385
11.2.3 DEVCAPS l程序 386
11.2.4 设备的尺寸 396
11.2.5 求出颜色 397
11.2.6 设备上下文属性 397
11.2.7 保存设备上下文 398
11.3 映射方式 400
11.3.1 设备坐标和逻辑坐标 401
11.3.2 设备坐标系 402
11.3.3 视窗和窗口 402
11.3.4 对MM—TEXT的处理 403
11.3.5 “公制”映射方式 406
11.3.6 “用户可改的”映射方式 409
11.3.7 WHATSIZE程序 414
12.2 画线 418
12.1 画点 418
第十二章 绘制图形 418
12.2.1 使用备用笔 420
12.2.2 笔的建立、选择和删除 421
12.2.3 避免设备有关性 424
12.2.4 填充空隙 424
12.2.5 绘制方式 424
12.2.6 ROP2LOOK程序 426
12.2.7 ROP2和彩色 429
12.3 绘制填充区域 430
12.3.1 边界框 431
12.3.2 ARCS程序 435
12.3.3 Polygon函数和多边形填充方式 441
12.3.4 用刷子对内部着色 442
12.3.5 刷子与位图 443
12.3.6 建立和使用位图刷子 445
12.3.7 刷子对齐 447
12.4 矩形、区域和裁剪 450
12.4.1 处理矩形 450
12.4.2 区域的建立和涂色 451
12.4.3 用矩形和区域进行裁剪 452
12.4.4 CLOVER程序 453
12.5 一些杂类GDI函数 457
12.6 无休止绘图程序 462
第十三章 位整块传送和元文件 467
13.1 旧的位图格式 468
13.1.1 在程序中建立位图 468
13.1.2 单色位图格式 469
13.1.3 彩色位图格式 470
13.2.1 DIB文件 471
13.2 与设备无关的位图(DIB) 471
13.1.4 位图的大小 471
13.2.2 建立DIB 473
13.3 内存设备上下文 474
13.4 非凡的BLT 475
13.4.1 PatBlt函数 475
13.4.2 Blt坐标 477
13.4.3 用BitBlt传送字块 478
13.4.4 DrawBitmap函数 479
13.4.5 使用不同的ROP代码 480
13.4.6 用内存设备上下文做更有趣的事 482
13.4.7 颜色转换 485
13.4.8 映射方式的转换 486
13.4.9 用StretchBlt扩缩位图 486
13.4.10 动画 487
13.5 元文件 491
13.5.1 内存元文件的简单用法 491
13.5.2 存放元文件在磁盘上 493
13.5.3 使用预先存在的元文件 495
13.5.4 把元文件用作资源 497
13.5.5 查看元文件 500
13.5.6 元文件能做与不能做的事 501
第十四章 正文和字体 503
14.1 简单的正文输出 503
14.1.1 正文绘制函数 503
14.1.2 正文用的设备上下文属性 504
14.1.3 使用备用字体 505
14.1.4 使字符串变灰 506
14.1.5 GrayString的简单用法 507
14.2.1 字体的类型 508
14.2 有关字体的背景知识 508
14.1.6 不用GrayString的灰色串 508
14.2.2 话谈钻字Ⅰ:族和字样 510
14.2.3 字体资源文件 511
14.2.4 话谈钻字Ⅱ:点 512
14.2.5 为什么使用逻辑英寸? 512
14.2.6 话谈钻字Ⅲ:行间空白和间距 513
14.2.7 “逻辑Twips”映射方式 514
14.3 建立、选择和删除逻辑字体 515
14.3.1 逻辑字体结构 524
14.3.2 字体映射算法 527
14.3.3 有关字体的查询 527
14.4 枚举字体 529
14.5 格式化正文 539
14.5.1 单行正文对齐 540
14.5.2 正文段落的调整 540
第十五章 使用打印机 550
15.1 打印、假脱机和换码 550
15.2.1 获得CreateDC函数 554
15.2 打印机设备上下文 554
15.2.2 修订的DEVCAPS程序 556
15.2.3 DeviceMode调用 562
15.2.4 检查BitBlt性能 564
15.3 打印的基本原理 564
15.3.1 Escape函数 564
15.3.2 FORMFEED程序 565
15.4 打印图形和正文 567
15.4.1 梗概打印 570
15.4.2 设置异常中止过程 572
15.4.3 Windows如何使用AbortProc 574
15.4.4 异常中止过程的实现 574
15.4.5 加入打印对话框 577
15.4.6 把打印加入POPPAD程序 582
15.4.7 处理错误码 587
15.5 分带输出技术 588
15.5.1 开始谈带区 589
15.5.2 异常中止过程的不同用法 591
15.6 打印机和字体 596
第五部分 数据交换和链接 598
第十六章 书写板 598
16.1 书写板的简单用法 598
16.1.1 标准的书写板数据格式 598
16.1.2 传送正文给书写板 599
16.1.3 从书写板中获得正文 600
16.1.6 以位图格式使用书写板 602
16.1.7 修订的BLOWUP程序 602
16.1.5 打开和关闭书写板 602
16.1.8 元文件和元文件图 608
16.2 书写板的其它用法 612
16.2.1 使用多个数据项 612
16.2.2 延迟再现技术 613
16.2.3 私用数据格式 615
16.3 编写书写板观察器 617
16.3.1 书写板观察器链 617
16.3.2 书写板观察器函数和消息 617
16.3.3 一个简单的书写板观察器 620
第十七章 动态数据交换(DDE) 624
17.1 基本概念 624
17.1.1 应用程序、题目和项 624
17.1.2 会话的类型 625
17.1.3 字符串和原子 629
17.2 一个DDE服务器程序 630
17.2.1 DDEPOP程序 642
17.2.2 WM__DDE__NITIATE消息 642
17.2.3 ServerProc窗口过程 643
17.2.4 WM__DDE__REQUEST消息 643
17.2.5 DDEPOP的PostDataMessage函数 644
17.2.6 WM__DDE__ADVISE消息 645
17.2.7 项的更新 647
17.2.8 WM__DDE__UNADVISE消息 647
17.2.9 WM__DDE__TERMINATE消息 647
17.3 一个DDE用户程序 648
17.3.1 初始化DDE会话 655
17.3.2 WM__DDE__DATA消息 656
17.3.3 WM__DDE__TERMINATE消息 656
17.4 出错时 657
18.1 MDI的要素 658
第十八章 多种文档接口(MDI) 658
18.2 Windows 3和MDI 659
18.3 样本程序 660
18.3.1 三张菜单 671
18.3.2 程序初始化 671
18.4 创建子窗口 672
18.5 其它框架窗口消息的处理 673
18.6 子文档窗口 674
18.7 窗口过程的威力 675
第十九章 动态链接库 676
19.1 库的工作原理 676
19.1.1 库一词有很多含义 677
19.1.2 用EXEHDR来检测库 677
19.2 STRPROG和STRLIB 678
19.2.1 STRLIB库 679
19.2.3 库的入口点 682
19.2.2 Make文件的差别 682
19.2.4 STRLIB函数 684
19.2.5 库的模块定义文件 684
19.2.6 STRPROG程序 685
19.2.7 运行STRPROG 690
19.2.8 远程函数序言 691
19.2.9 反调用函数的用法 692
19.3 DS不等于SS的问题 692
19.4 库的其它限制 696
19.5 指定链接的不同方法 697
19.6 使用输入函数库 698
19.7 截获Windows函数调用 700
19.8 不带输入库的动态链接 701
19.9 含资源的库 702