目录 1
第一章 表示管理器介绍 1
1.1 OS/2应用程序 2
1.2 OS/2中的多任务 4
1.3 PM屏幕组 6
1.3.1 在PM屏幕组中的操作 6
1.4 OS/2的API 7
1.5 PM应用程序的开发 9
1.5.1 软件工具 9
1.6 C语言和PM 10
1.6.1 头文件 10
1.6.2 柄 11
1.6.3 数据类型和PM中的定义 12
1.6.4 EXPENTRY函数 14
1.7 在OS/2 PM中调试程序 16
1.8 Kwikinf 16
第二章 开发模式 19
2.0.1 CUA89和系统菜单 21
2.0.2 CUA91和系统菜单 21
2.0.3 尺寸图标 21
2.0.4 菜单条 21
2.0.5 流程图 22
2.0.6 make文件 23
2.0.7 资源文件 28
2.1 头文件 30
2.2 源代码 30
2.3 Main()数 31
2.3.1 事例的初始化 32
2.3.2 建立消息队列 33
2.3.3 登记窗口类 34
2.3.4 类风格 35
2.3.5 窗口字 36
2.4 预定义窗口类 37
2.5 为什么要登记窗口类 38
2.5.1 PM的本质 38
2.5.2 登记窗口类的策略 38
2.6 创建一个窗口 39
2.6.1 WinCreateStdWindow()的参数 40
2.6.2 FS_与FCF_风格的比较 43
2.7.1 WinCreateStdWindow()的错误 46
2.7 有关WinCreateStdWindow()的一些评论 46
2.8 显示窗口 47
2.9 消息循环 49
2.9.1 消息循环的持续时间 52
2.9.2 执行终止 52
2.10 普通PM应用程序的main()函数 53
2.11 窗口过程 54
2.11.1 一个应用程序样本 55
2.11.2 一些替代方法及改进 58
2.11.3 窗口的外观 59
2.11.4 应用程序标题 59
第三章 消息 63
3.1 绘制 65
3.1.1 PM中的输出技术 67
3.1.2 表示空间和设备现场的区别 69
3.2 表示空间 69
3.2.1 高速缓冲小型PS 69
3.2.2 小型PS 70
3.2.3 普通PS 71
3.3 WM_PAINT消息 72
3.3.1 更新区域 72
3.3.2 强制使用WM_PAINT消息 73
3.3.3 输出同步 75
3.4 输出处理 76
3.5 擦除窗口背景 78
3.6 PM中的消息流 79
3.6.1 列队消息 80
3.6.2 WinPostMsg()的参数 82
3.6.3 何时投递消息 82
3.6.4 非列队消息 83
3.6.5 何时发送消息 84
3.6.6 有关消息发送的一些考虑 85
3.6.7 函数与消息 85
3.6.8 消息、窗口与窗口过程 88
3.6.9 使用消息的函数 88
3.6.10 预定义类的消息 88
3.6.11 定义新的消息 88
3.7 一些改进 89
3.7.1 消息参数 89
3.8 发送消息 90
3.9 执行绘制 94
第四章 窗口 97
4.1 用WinCreateStdWindow()函数创建一个窗口 97
4.2 框架窗口 98
4.3 父子关系 98
4.4 兄弟窗口 102
4.5 主从关系 103
4.6 框架控制窗口 106
4.7 保留内存 107
4.8 扩充保留内存区 110
4.9 查询保留内存区 110
4.10 窗口字的使用规则 111
4.11 消息传送 111
4.12 WinCreateWindow()函数 112
4.12.1 用WinCreateWindow()建立标准窗口 114
4.13 FCF_标志和WC_FRAME类 116
4.13.1 使用WinCreateWindow()的试验 117
4.14 CREATESTRUCT结构 117
4.15 怎样消除一个窗口 118
4.16 在多窗口应用程序中关闭一个窗口 118
4.17 窗口定位和尺寸变动 119
4.18 存储窗口的位置 123
4.19 创建客户的子窗口 125
4.20 填充窗口列表 126
4.21 单个事例的执行 128
4.21.1 访问窗口列表 130
4.21.2 枚举顶层窗口 132
4.21.3 第三种解决办法 134
4.21.4 其他解决方法 136
4.22 登记一个公共类 136
4.23 WinMessageBox()函数 137
4.24 焦点链 141
4.25 添加系统图标 144
第五章 输入工具和资源 147
5.1 键盘 148
5.1.1 键盘用法 150
5.2 鼠标 151
5.2.1 利用鼠标的新技巧 155
5.2.2 鼠标按钮操作 156
5.2.4 选择多个对象 157
5.2.3 对象选择 157
5.2.5 拖放 159
5.3 计时器 159
5.4 资源文件 161
5.4.1 资源属性 161
5.4.2 文本资源 162
5.4.3 STRINGTABLE 164
5.4.4 调入字符串 165
5.4.5 定义计算ID 166
5.4.6 为什么应使用STRINGTABLE 168
5.4.7 MESSAGETABLE 168
5.4.8 WINDOWTEMPLATE 170
5.5 利用资源 174
5.5.1 二进制资源 175
5.6 调入图标 176
5.7 预定义的图标与光标 179
5.7.1 预定义位图的显示 183
5.7.2 在窗口中移动图标 185
5.8 在窗口中移动位图 189
5.9 ASSOCTABLE 193
第六章 菜单 195
6.1 标题条菜单 198
6.1.1 标题条菜单和WPS 200
6.2 PM API和系统菜单 201
6.3 为窗口配置菜单 202
6.3.1 生成一个菜单模板 202
6.3.2 菜单模板 204
6.3.4 菜单风格规则 207
6.3.3 键盘访问 207
6.4 定义模板 209
6.4.1 复杂菜单模板 213
6.5 菜单模板的句法规则 213
6.6 调入菜单模板 215
6.7 菜单、父子与主从关系 217
6.8 修改窗口过程 218
6.9 识别选择源 224
6.10 动态改变属性 225
6.11 消息与宏 228
6.12 调入新菜单 228
6.13 作为菜单项的位图 231
6.14 通过应用程序建立的菜单 232
6.15 快捷键 233
6.16 运行时菜单 237
6.17 WPS菜单 238
6.18 菜单条和客户窗口之间的交互 240
6.19 窗口现场菜单 241
6.20 探测WM_CONTEXTMENU 242
6.21 强调一个对象 244
第七章 预定义窗口类 249
7.1 消息流 250
7.2 观察窗口 252
7.3 窗口的结构 256
7.4 预定义窗口类及窗口字 257
7.6 怎样创建一个WC_类的窗口 258
7.5 未归档的类 258
7.6.1 什么时候创建一个预定义类的窗口 259
7.7 类WC_BUTTON 259
7.7.1 流行的按钮 261
7.7.2 BTNCDATA结构 262
7.7.3 与按钮的交互 263
7.7.4 通知代码 264
7.7.5 做为输入元素的按动按钮 264
7.8 类WC_STATIC 266
7.8.1 SS_风格 267
7.8.2 SM_消息 268
7.9 WC_TITLEBAR类 268
7.10.1 SBS_风格 269
7.10.2 SBM_消息 269
7.10 WC_SCROLLBAR类 269
7.10.3 一些考虑 272
7.11 WC_LISTBOX类 273
7.11.1 类WC_LISTBOX的风格 273
7.11.2 LM_消息 274
7.11.3 保留内存区 276
7.11.4 多选择列表框 277
7.11.5 报告代码 278
7.11.6 一个简单的列表框 280
7.11.7 消息流 282
7.11.8 生成列表框 283
7.11.9 属主绘制的列表框 286
7.11.10 WM_MEASUREITEM消息 286
7.11.11 WM_DRAWITEM消息 287
7.11.12 生成列表框 290
7.11.13 处理信息 291
7.11.14 画一个项 292
7.11.15 一些考虑 295
7.12 类WC_ENTRYFIELD 296
7.12.1 ES_风格 296
7.12.2 EM_消息 297
7.12.3 通知代码 297
7.12.4 ENTRYFDATA结构 298
7.12.5 WC_COMBOBOX类 298
7.12.6 CBS_风格 299
7.12.7 CBM_消息 299
7.13.1 类WC_MLE的风格 300
7.13 类WC_MLE 300
7.12.9 使用combobox 300
7.12.8 通知代码 300
7.13.2 MLM_消息 302
7.13.3 MLN_通知代码 304
7.13.4 类WC_MLE的数据结构 304
7.13.5 MLECTLDATA结构 305
7.14 WC_NOTEBOOK类 306
7.14.1 填充笔记本 309
7.14.2 加入一页 310
7.14.3 将信息与一页联系起来 312
7.14.4 通知代码 312
7.14.5 最初的尝试 312
7.15 类WC_CONTAINER 312
7.15.1 WC_CONTAINER类的风格 313
7.15.2 WC_CONTAINER类的逻辑 314
7.15.3 创建容器 316
7.15.4 容器的对象 316
7.15.5 转换容器显示方式 325
7.15.6 窗口现场菜单 326
7.15.7 对象的增生 327
7.15.8 在容器上别的操作 330
7.16 类WC_SLIDER 331
7.16.1 创建滑块 334
7.16.2 类WC_SLIDER的消息 334
7.16.3 一个滑块的例子 336
7.17 类WC_SPINBUTTON 337
7.17.1 主或从 339
7.17.3 一个旋钮的例子 340
7.17.2 通知码 340
7.18 类WC_VALUESET 342
7.18.1 创建值集 342
第八章 对话窗口 345
8.1 对话窗口的两种类型 345
8.1.1 对话窗口的特点 345
8.1.2 生成对话窗口 347
8.1.3 常用或非常用 350
8.1.4 对话窗口模板 350
8.1.5 WS_GROUP与WS_TABSTOP风格 353
8.1.6 对话过程 353
8.1.7 一个疑问 353
8.2.1 属主问题 355
8.2 WM_INITDLG消息 355
8.2.2 获知属主 358
8.2.3 访问控制 359
8.3 表示参数 361
8.3.1 设置表示参数 364
8.3.2 表示参数和WinCreateWindow() 366
8.3.3 表示参数与资源文件 368
8.3.4 终止一个常用对话窗口 368
8.3.5 默认消息处理 369
8.3.6 一些考虑 369
8.4 PM的一个工具程序 369
8.4.1 查找一个文件 370
8.4.2 应用程序的方案 371
8.4.4 错误处理 373
8.4.3 快捷键表 373
8.4.6 文件选择 374
8.4.5 运行一个文件 374
8.4.7 文件删除 375
8.4.8 搜索文件 378
8.5 建立Open Box 378
8.5.1 对话窗口定位 379
8.5.2 一种新型数据类型 379
8.5.3 使对话窗口居中 380
8.5.4 填充控制 381
8.5.5 输入源 381
8.5.6 选择文件 383
8.6 预定义对话窗口 383
8.6.1 访问文件系统 384
8.7 非常用对话窗口 386
8.6.2 字体列表 386
8.7.1 一个非常用对话窗口例子 388
第九章 开发快速多线程应用程序 391
9.1 内存分配 391
9.1.1 内存管理 393
9.2 分段应用程序 393
9.3 代码段和数据段 394
9.3.1 执行多个事例 394
9.3.2 产生快速可执行文件 395
9.3.3 DEF的结构 396
9.3.4 分段规则 397
9.4 一个菜单编辑器 397
9.4.2 最大化窗口 398
9.4.1 Menu Maker的界面 398
9.4.4 控制面板 399
9.4.5 应用程序的逻辑 399
9.4.3 空菜单条 399
9.4.6 定义顶层菜单 401
9.4.7 定义下拉菜单 403
9.4.8 定义分隔线 403
9.4.9 定义子菜单 404
9.4.10 存储模板 404
9.4.11 调入菜单模板 406
9.4.12 分析MNU和HHH文件 408
9.4.13 MENUITEM结构 408
9.4.16 属性 409
9.4.17 ID 409
9.4.15 风格 409
9.4.14 位置 409
9.4.18 子菜单柄 410
9.4.19 位图柄 410
9.4.20 存储一个菜单模板 410
9.4.21 增加一个顶层菜单 410
9.4.22 增加一个下拉菜单 411
9.4.23 增加一个分隔符 412
9.4.24 增加一个子菜单 412
9.4.25 Menu Maker所有函数的总结 412
9.5 多线程OS/2应用程序 413
9.5.2 生成一个线程 414
9.5.1 生成一个多线程应用程序 414
9.5.4 线程和PM应用程序 416
9.5.3 编译一个多线程应用程序 416
9.5.5 优先权类 417
9.5.6 选择优先权类 420
9.6 多线程WHEREIS 420
9.6.1 一些考虑 423
9.6.2 性能优化 425
9.6.3 进一步的提高 426
第十章 子类、超类和DLL 429
10.1 访问窗口过程 430
10.2 执行子类划分操作 433
10.2.1 一个划分子类的实例 434
10.3 超类集成 435
10.2.2 何时进行子类划分 435
10.3.1 超类集成的实现 436
10.3.2 集成超类的特性 437
10.4 动态链接库 438
10.4.1 DLL定义 438
10.4.2 如何产生一个DLL 439
10.4.3 DLL的优点 440
10.4.4 产生一个DLL 441
10.4.5 静态链接 441
10.4.6 动态链接 441
10.4.7 重定位记录的结构 443
10.4.8 执行一个访问DLL的程序 443
10.4.9 隐式调入一个DLL库 444
10.4.10 显式调入一个DLL库 445
10.4.11 DLL的编写 447
10.5 创建一个DLL实例 448
10.5.1 编译DLL 448
10.5.2 DLL的DEF文件 449
10.5.3 生成引入库 453
10.6 生成新的控制 453
10.7 生成新的预定义类 454
10.7.1 构造新的窗口类 455
10.7.2 编写窗口过程 457
10.7.3 建立新类的窗口 458
10.7.4 传递信息 458
10.7.5 如何安装新类的控制 460
10.7.6 一些考虑 462
第十一章 数据共享技术:裁剪板与动态数据交换 463
11.1 裁剪板 463
11.1.1 裁剪板管理 465
11.1.2 在裁剪板中插入数据 465
11.1.3 传递对象 467
11.1.4 恢复裁剪板内容 468
11.1.5 检查裁剪板内容 468
11.1.6 CLIPPUT和CLIPSHOW 469
11.2 动态数据交换 472
11.2.1 DDE会话 473
11.2.2 设计DDE会话 474
11.2.3 事务的特征 474
11.2.4 初始化DDE会话 475
11.2.5 请求数据 479
11.2.6 向客户提供数据 481
11.2.7 建立永久连接 482
11.2.8 终止DDE会话 484
11.2.9 不可见窗口 484
11.2.10 DDE的使用 484
11.2.11 定义一个项目 485
11.2.12 服务方 489
11.2.13 客户 490
11.2.14 客户界面 491
11.2.15 一些考虑 491
第十二章 拖放操作 493
12.1 拖放API 493
12.1.1 拖放的逻辑 495
12.1.2 选择对象 498
12.1.3 准备图像 505
12.1.4 执行拖动 506
12.2 准备放置对象 507
12.2.1 改变光标外观 513
12.2.2 接受反馈 514
12.2.3 DM_DRAGOVER的返回值 515
12.2.4 框架/客户和拖动 516
12.2.5 接受对象 517
12.2.6 拖动标题条图标 518
12.3 拖动:准备数据 520
12.4 放置:接受对象 523
12.4.1 截取DM_DROP 525
12.5 拖放和值集 527
12.6 拖放和列表框 529
12.7 拖放和文件 532
第十三章 WPS程序设计 537
13.1 WPS中的集成化 537
13.1.1 低级集成化 537
13.1.2 中级集成化 538
13.1.3 高级集成化 538
13.2 如何开发OS/2应用程序 538
13.2.1 程序分析 546
13.2.2 创建面板 550
13.2.3 WPS对象的API 552
13.2.4 一个简单的安装程序 559
13.2.5 取消某个对象 563
13.3 开发一个WPS编辑器 564
13.3.1 调入一个文件 565
13.3.2 从头开始编辑新文档 565
13.4 保存文档 566
13.4.1 打印 566
13.4.2 与裁剪板交互 567
13.4.3 查找和替换文本 567
13.4.4 改变外观:字体和颜色 567
13.4.5 PMEDIT 567
13.4.6 PMEDIT中的WPS对象 572
13.4.7 PMEDIT的构成元素 572
13.4.8 改变文档的名字 573
程序清单 575
如何使用磁盘 579