第一部分Windows应用程序设计引论 1
第1章Windows环境概貌 1
1.1 Microsoft Windows与DOS的比较 1
1.1.1用户界面 2
1.1.2队列输入 2
1.1.3与设备无关的图形 2
1.1.4多任务 3
1.2 Windows程序设计模型 3
1.2.1窗口 3
1.2.2菜单 4
1.2.3对话框 4
1.2.4消息循环 4
1.3 Windows库 5
1.4 建立Windows应用程序 6
1.5软件开发工具 7
1.5.1 C编译器 8
1.5.2连接程序 9
1.5.3 SDK资源编辑器 9
1.5.4资源编译程序 10
1.5.5调试和优化工具 10
1.5.6程序维护器 10
1.6编写 Windows应用程序的提示 12
1.7小结 13
第2章Windows应用程序Generic 14
2.1应用程序 14
2.2 Windows应用程序 15
2.3 W inMain函数 15
2.3.1 Windows的数据类型与结构 16
2.3.2句柄 17
2.3.3实例 17
2.3.4注册窗口类 17
2.3.5创建窗口 20
2.3.6显示和修改窗口 21
2.3.7创建消息循环 21
2.3.8产生控制 22
2.3.9终止应用程序 22
2.3.10初始化函数 23
2.3.11应用程序的命令行参数 24
2.4窗口函数 25
2.5创建一个About对话框 26
2.5.1创建一个对话框模板 26
2.5.2创建一个包含文件 27
2.5.3创建一个对话函数 28
2.5.4用About命令定义一个菜单 29
2.5.5处理WM—COMMAND消息 29
2.6创建模块定义文件 30
2.7装配Generic 32
2.7.1创建C语言源文件 32
2.7.2创建头文件 37
2.7.3创建资源描述文件 37
2.7.4 创建模块定义文件 37
2.7.5创建Make文件 38
2.7.6运行MAKE程序 39
2.8把Generic用作一个模板 39
2.9小结 40
第二部分Windows应用程序的编程 42
第3章 窗口输出 42
3.1显示描述表 42
3.1.1使用GetDC函数 42
3.1.2 WM—PAINT消息 42
3.1.3使用户区域无效 43
3.1.4显示描述表与设备描述表 43
3.1.5坐标系 44
3.2创建、选择和删除绘图工具 44
3.3绘图与书写 45
3.4示例应用程序:Output 46
3.4.1加入新变量 46
3.4.2加入WM—CREATE分支语句 47
3.4.3加入WM—PAINT消息 47
3.4.4.修改WM—DESTROY分支语句 49
3.4.5编译并连接 50
3.5小结 50
第4章 键盘和鼠标输入 52
4.1 Windows输入消息 52
4.1.1消息格式 52
4.1.2键盘输入 52
4.1.3字符输入 53
4.1.4鼠标输入 53
4.1.5定时器输入 54
4.1.6卷滚条输入 54
4.1.7菜单输入 55
4.2示例应用程序:Input 55
4.2.1 Input应用程序怎样显示输出 56
4.2.2增加新变量 56
4.2.3设置窗口类风格 57
4.2.4 修改CreateWindow函数 57
4.2.5设置正文矩形 57
4.2.6增加WM—CREATE分支语句 58
4.2.7修改W M—DESTROY分支语句 58
4.2.8加入WM—KEYUP和WM—KEYDOWN分支语句 58
4.2.9加入WM—CHAR分支语句 59
4.2.10加入WM—MOUSEMOVE分支语句 59
4.2.11加入WM—LBUTTONUP和WM—LBUTTONDOWN 59
4.2.12加入WM—LBUTTONDBLCLK分支语句 59
4.2.13加入W M—TIMER分支语句 60
4.2.14加入WM—HSCROLL和WM—VSCROLL分支语句 60
4.2.15加入WM—PAINT分支语句 60
4.2.16编译并连接 62
4.3小结 62
第5章 图标 63
5.1何谓图标? 63
5.1.1使用固有图标 63
5.2使用自己的图标 63
5.2.1创建图标文件 64
5.2.2定义图标资源 64
5.2.3加载图标资源 65
5.3指定类图标 65
5.4显示自己的图标 65
5.5在对话框里显示图标 66
5.6示例应用程序:Icon 67
5.6.1加入一条ICON语句 67
5.6.2加入一条ICON控制语句 67
5.6.3设置类图标 67
5.6.4把MYICON,ICO加到Make文件 68
5.6.5编译并连接 68
5.7小结 68
第6章 光标、图标和键盘 69
6.1控制光标的形状 69
6.1.1使用固有光标形状 69
6.1.2使用你自己的光标形状 69
6.2显示光标 70
6.2.1指定类光标 70
6.2.2显式设置光标形状 70
6.2.3举例:在过长操作中显示小计时器 71
6.3让用户用鼠标选择信息 71
6.3.1开始图形选择 72
6.3.2显示选择 74
6.3.3结束选择 75
6.4用键盘移动光标 75
6.4.1用键盘移动光标 75
6.4.2没有鼠标时如何使用光标 77
6.5示例应用程序:Cursor 78
6.5.1加入CURSOR语句 79
6.5.2加入新变量 79
6.5.3设置类光标 79
6.5.4准备小计时器光标 79
6.5.5加入—过长操作 80
6.5.6加入WM—LBUTTONDOW、 WM—MOUSEMOVE和 WM—LBUTTONUP分支语句 81
6.5.7加入WM—KEYDOWN和WM—KEYUP分支语句 82
6.5.8加入WM—PAINT分支语句 84
6.5.9把BULLSEYE.CUR加到make文件中 84
6.5.10编译并连接 84
6.6小结 84
第7章 菜单 86
7.1何谓菜单? 86
7.2定义一菜单 86
7.2.1菜单ID 87
7.3把菜单包含到应用程序里 88
7.3.1指定窗口类的菜单 88
7.3.2指定特定窗口的菜单 88
7.4处理菜单输入 89
7.5应用程序用菜单工作 89
7.5.1激活和禁止菜单项 90
7.5.2选中和退选菜单项 91
7.5.3增加菜单项 91
7.5.4改变现有菜单 92
7.5.5删除菜单项 93
7.5.6把位图用作菜单项 93
7.5.7替换菜单 94
7.5.8创建—新菜单 94
7.5.9初始化—菜单 94
7.6特殊的菜单特征 95
7.6.1提供菜单加速键 95
7.6.2使用级联菜单 97
7.6.3使用浮动弹出式菜单 99
7.6.4设计自己的选中标记 100
7.6.5使用所有者画图菜单 101
7.7示例应用程序:Ed itMenu 102
7.7.1把新菜单加到资源文件中 102
7.7.2在包含文件中加入定义 103
7.7.3在资源描述文件中加入加速键表 104
7.7.4加入一新变量 104
7.7.5加载加速键表 104
7.7.6修改消息循环 105
7.7.7修改WM—COMMAND情况 105
7.7.8编译并连接 106
7.8小结 106
第8章 控制 107
8.1什么是控制 107
8.2建立一个控制 107
8.2.1指定控制类 108
8.2.2选择控制风格 108
8.2.3设置父窗口 109
8.2.4 选择控制ID 109
8.3使用控制 110
8.3.1接收用户输入 110
8.3.2发送控制消息 110
8.3.3关闭与激活控制的输入 110
8.3.4移动和改变控制窗口的大小 111
8.3.5终止控制 111
8.4建立和使用常用控制 111
8.4.1按钮控制 111
8.4.2静态控制 114
8.4.3列表框 115
8.4.4组合框 122
8.4.5编辑控制 123
8.4.6卷滚条 125
8.5一个示例应用程序:EditCntl 127
8.5.1在包含文件中增加一个常量 128
8.5.2增加新的变量 128
8.5.3增加一个CreateWindows函数 128
8.5.4修改WM—COMMAND分支支部语句 129
8.5.5增加一个WM—SETFOCUS分支语句 129
8.5.6增加一个WM—SIZE分支语句 130
8.5.7编译与连接 130
8.6小结 130
第9章 对话框 132
9.1什么是对话框 132
9.1.1模式的对话框 132
9.1.2无模式对话框 133
9.2使用对话框 133
9.2.1创建一个对话函数 133
9.2.2在对话框中使用控制 134
9.3一个示例应用程序:FileOpen 134
9.3.1在包含文件中增加常量 135
9.3.2建立对话框Open的模板 136
9.3.3增加新的变量 137
9.3.4增加IDM—Open分支语句 137
9.3.5建立函数OpenDlg 138
9.3.6增加帮助函数 140
9.3.7输入对话函数 142
9.3.8编译和连接 142
9.4小结 142
第10章 文件输入输出 144
10.1 Windows环境中处理文件的原则 144
10.2创建文件 145
10.3打开已存在文件 146
10.4读文件和写文件 146
10.5重打开文件 147
10.6关于文件的提示 147
10.7检查文件状态 147
10.8一个示例文件编辑器:EditFile 148
10.8.1在包含文件中增加一个常量 148
10.8.2增加对话框SaveAs 148
10.8.3增加包含语句 149
10.8.4增加新的变量 149
10.8.5替换WM—COMMAND分支语句 150
10.8.6增加WM—QUERYENDSESSION和WM—CLOSE分支语句 152
10.8.7修改对话函数OpenDlg 153
10.8.8增加对话函数SaveAsDlg 153
10.8.9增加帮助函数 155
10.8.10输出对话函数SaveAsDlg 158
10.8.11增加堆的空间 159
10.8.12编译与连接 159
10.9小结 159
第11章 位图 160
11.1什么是位图? 160
11.2创建位图 160
11.2.1创建与装入位图文件 160
11.2.2创建并填充空白位图 161
11.2.3用硬编码位方式创建位图 162
11.2.4绘制一个彩色位图 165
11.3显示位图 167
11.3.1使用函数BitBlt显示内存位图 167
11.3.2缩放位图 168
11.3.3位图用于刷子图案 169
11.3.4显示与设备无关的位图 170
11.3.5位图用作菜单项 171
11.4将彩色加到单色位图中 171
11.5删除位图 172
11.6一个示例应用程序:Bitmap 172
11.6.1修改包含文件 173
11.6.2增加位图资源 173
11.6.3增加位图、图案和模式菜单 173
11.6.4增加全局和局部变量 174
11.6.5增加WM—CREATE分支语句 175
11.6.6修改WM—DESTROY分支语句 178
11.6.7增加分支语句 178
11.6.8增加WM—REUTTONUP分支语句 179
11.6.9增加WM—ERASEBKGND分支语句 180
11.6.10修改WM—COMMAND分支语句 180
11.6.11修改Make文件 182
11.6.12编译与连择 183
11.7小结 183
第12章 打印 184
12.1在windows环境中打印 184
12.1.1使用打印机换码序列 184
12.2检索打印机的有关信息 185
12.3打印一行文本 186
12.4打印位图 187
12.5处理打印过程中的错误 188
12.6取消打印操作 190
12.6.1定义对话框Abort 190
12.6.2定义对话函数Abort 190
12.6.3定义函数Abort 191
12.6.4执行可中止的打印操作 193
12.6.5用ABORTDOC换码序列来取消打印操作 193
12.7使用段式打印技术来打印图形 193
12.8一个示例应用程序:PrntFile 194
12.8.1增加对话框AbrtDlg 195
12.8.2增加用于打印的新变量 195
12.8.3增加IDM—PRINT分支语句 196
12.8.4创建函数AbortDlg和AbortProc 198
12.8.5增加函数GetPrinterDC 199
12.8.6输出函数AbortDlg和AbortProc 200
12.8.7编译与连接 200
12.9小结 200
第12章 写字板 201
13.1使用写字板 201
13.1.1向写字板中拷贝文本 202
13.1.2从写字板中读取文本 203
13.1.3从写字板中读取位图 205
13.1.4 Windows的写字板应用程序 207
13.2使用特殊的写字板功能 207
13.2.1根据请求放弃数据 208
13.2.2 在结束之前放弃格式 208
13.2.3注册私有格式 208
13.2.4控制写字板中的数据的显示 208
13.3一个示例应用程序:ClipText 210
13.3.1增加新变量 211
13.3.2修改初始化代码 211
13.3.3增加WM—INITMENU分支语句 211
13.3.4修改WM—COMMADN分支语句 212
13.3.5增加WM—PAINT分支语句 215
13.3.6增加函数OutOfMemory 215
13.3.7编译与连接 216
13.8小结 216
第三部分 高级程序设计专题 218
第14章C与汇编语言 218
14.1选择内存模式 218
14.2使用NULL 219
14.3使用命令行参数和DOS环境 219
14.4编写输出函数 220
14.4.1创建一个加调过程 221
14.4.2创建函数WinMain 221
14.5.使用C运行时刻函数 221
14.5.1使用Windows C库程序 221
14.5.2分配内存 222
14.5.3字串操作 222
14.5.4使用文件输入与输出 223
14.5.5使用控制台输入与输出 224
14.5.6使用图形函数 224
14.5.7使用浮点运算 224
14.5.8执行其它应用程序 225
14.5.9使用BIOS和MS—DOS的接口函数 225
14.5.10删除C运行时刻启动代码 225
14.6编写汇编语言代码 226
14.6.1修改中断标志 227
14.6.2用汇编语言来编写需输出的函数 229
14.6.3使用寄存器 229
14.7小结 230
第15章 内存管理 231
15.1使用内存 231
15.1.1使用全局堆 231
15.1.2使用局部堆 232
15.1.3处理可废除的内存 233
15.2段的使用 234
15.2.1使用代码段 235
15.2.2 DATA段 236
15.3一个示例应用程序:Memory 236
15.3.1分割C语言源文件 236
15.3.2修改Include文件 237
15.3.3增加新的段定义 237
15.3.4修改Make文件 238
15.3.5编译与连接 239
15.4小结 239
第16章 关于内存管理的进一步说明 240
16.1 Windows的内存配置 240
16.1.1基本内存配置 240
16.1.2 EMS 4.0内存配置 242
16.1.3 Windows标准模式的内存配置 245
16.1.4 Windows 386增强模式的内存配置 248
16.2在Windows应用程序里使用数据存储 250
16.2.1管理自动数据段 251
16.2.2管理局部动态数据块 253
16.2.3管理全局内存块 257
16.2.4使用窗口和类数据结构中的附加字节 262
16.2.5管理资源 263
16.3使用内存模式 265
16.4使用巨型数据 266
16.5管理程序数据时应避免的陷阱 267
16.5.1不要假定应用程序运行特权级 267
16.5.2在小、中模式中避免静态数据的远指针 267
16.5.3不要通过全局句柄向其他应用程序传递数据 268
16.5.4在任何模式下均不能假定句柄与远指针之间的关系 269
16.5.5除了Windows或DOS提供的值之外,不要向段寄存器装入其他值 269
16.5.6不要对段执行算术运算 269
16.5.7不要对段地址进行比较 269
16.5.8读写不要越过内存对象的尾部 269
16.6管理程序代码的内存 269
16.6.1使用代码段的属性 270
16.6.2使用多个代码段 270
16.6.3均衡代码段 270
16.6.4.DEF文件中代码段的接入顺序 271
16.7小结 271
第17章 打印设置 272
17.1 Windows如何管理打印设置 272
17.1.1打印设置与结构DEVMODE 273
17.1.2打印设置与打印机环境 273
17.2使用设备驱动程序的函数 274
17.3获取打印机驱动程序的能力 275
17.4处理打印设置 275
17.4.1函数ExtDeviceMode的输入与输出 276
17.4.2获得打印设置的拷贝 277
17.4.3改变打印设置 277
17.4.4用CreateDC进行打印设置 278
17.4.5改变打印设置而不影响其它应用程序 279
17.4.6提示用户改变打印设置 280
17.5在驱动程序间拷贝打印设置 281
17.6维护应用程序自己的打印设置 282
17.7使用旧式打印机驱动程序 282
17.8小结 282
第18章 字体 283
18.1输出正文 283
18.2输出字体时使用彩色 283
18.3使用库存字体 284
18.4创建一种逻辑字体 285
18.5一行中使用多种字体 286
18.6获取所选字体的有关信息 287
18.7获取逻辑字体的有关信息 288
18.8枚举字体 289
18.9检查设备的文本能力 290
18.10增加字体资源 292
18.11设置文本调整 292
18.12创建字体资源文件 293
18.12.1创建字体文件 293
18.12.2创建字体资源描述 293
18.12.3创建哑代模块(DummyCodeModule) 294
18.12.4创建模块定义文件 294
18.12.5编译与连接字体资源文件 295
18.13一个示例应用程序:showFont 295
18.14小结 296
第19章 调色板 297
19.1调色板的用途 297
19.2调色板如何工作 297
19.3创建和使用逻辑调色板 299
19.3.1创建LOGPALETTE数据结构 299
19.3.2创建逻辑调色板 302
19.3.3将调色板选入设备描述表 302
19.3.4实现调色板 302
19.4用调色板上的颜色绘图 302
19.4.1直接指定调色板颜色 302
19.4.2间接指定调色板颜色 303
19.4.3绘位图时使用调色板 304
19.5改变逻辑调色板 305
19.6对于系统调色板所作改变的响应 306
19.6.1对WM—QUERYNEWPALETTE的响应 307
19.6.2对WM—PALETTECHANGED的响应 307
19.7小结 308
第20章 动态连接库 310
20.1何谓DLL 310
20.1.1输入库与DLL 310
20.1.2 DLL模块与应用程序模块 311
20.1.3 DLL与任务 312
20.1.4 DLL与栈 312
20.1.5 Windows如何找到DLL 313
20.2何时使用用户DLL 313
20.2.1应用程序之间共享代码与资源 313
20.2.2为不同市场定制应用程序 314
20.2.3 Windows的钩子函数 315
20.2.4设备驱动程序 315
20.2.5用户控制 316
20.2.6项目管理 322
20.3创建一个DLL 322
20.3.1建立C语言源文件 323
20.3.2建立模块定义文件 328
20.3.3建立Make文件 328
20.4应用程序访问DLL代码 331
20.4.1创建一个库函数的原型 331
20.4.2输入库函数 331
20.5 Windows的对象拥有权原则 333
20.6一个示例库:Select 334
20.6.1创建库函数 334
20.6.2创建初始化例程 339
20.6.3建立Exit例程 339
20.6.4建立模块定义文件 340
20.6.5建立包含文件 340
20.6.6编译与连接 340
20.7小结 341
第21章 多文档界面 342
21.1 MDI应用程序的结构 342
21.2初始化M DI应用程序 342
21.2.1注册窗口类 343
21.2.2建立窗口 343
21.3编写主消息循环 344
21.4编写框架窗口函数 345
21.5编写子窗口函数 345
21.6数据与子窗口的对应 345
21.6.1将数据存储在窗口结构中 346
21.6.2使用窗口特性(Propetyy) 346
21.7控制子窗口 346
21.7.1创建子窗口 346
21.7.2消除子窗口 347
21.7.3激活与钝化子窗口 347
21.8小结 348
第22章 动态数据交换 349
22.1 Windows中的数据交换 349
22.1.1用写字板交换数据 349
22.1.2动态连接库 349
22.1.3动态数据交换 349
22.1.4 Windows DDE的使用 350
22.1.5用户眼中的DDE 350
22.2 DDE的概念 350
22.2.1客户、服务员与会话 350
22.2.2应用程序、主题和项 351
22.2.3永久性(“热”或“暖”)数据链路 351
22.3 DDE消息 351
22.4 DDE消息流 352
22.4.1启动一次会话 352
22.4.2传送单个项 354
22.4.3建立永久性数据链路 358
22.4.4在远程应用程序中执行命令 363
22.4.5结束一次会话 365
22.5 DDE客户与服务员应用程序示例 366
22.6小结 367