书籍详情
GUI应用程序移植:在Linux上模拟Windows API的方法
作者:肖习攀 等著
出版社:电子工业出版社
出版时间:2007-03-01
ISBN:9787121038327
定价:¥49.80
购买这本书可以去
内容简介
本书介绍一种把Windows GUI应用程序移植到Linux的方法——API模拟方法。书中介绍了这种方法的设计思想,以及具体的实现过程。同时,充分探讨了GUI应用程序移植所必然面对的基于不同操作系统的编程模型的差异,揭示了两个系统有关用户界面交互和图形输出基本逻辑结构的一些鲜为人知的特性。全书共分为12章,包括:移植架构,GDI子系统,文本输出和字体管理,窗口子系统,消息子系统,用户输入,剪贴板和拖放,标准控件、菜单与对话框,打印,Unicode与国际化,国际化输入和资源的移植。.本书起点较高,适合具有相当基础的软件开发人员、高年级计算机或相关领域的学生,以及那些可能需要为企业决策者提供技术和信息支持的架构师。由于本书是以GUI应用程序为背景来讲述的,所以对于任何在Windows和Linux系统之一进行应用程序开发或移植工作的工程师,以及任何C/C++程序员和工程师,都是一本具有较高参考价值的图书。本书介绍一种把Windows GUI应用程序移植到Linux的方法——API模拟方法的设计思想,以及具体的实现过程;并就API移植所涉及到的源系统和目标系统的特性和差别进行深入剖析和探讨;对移植工作中遇到的许多挑战和困难提出了行之有效的解决方案。..本书充分探讨了GUI应用程序移植所必然面对的基于不同操作系统的编程模型的差异,揭示了两个系统有关用户界面交互和图形输出基本逻辑结构的一些鲜为人知的特性,具有较高参考价值。书中提供了大量的例子程序,使读者能够快速理解不同方法的实现原理和具体应用。同时,还给出了一个完整的Windows应用程序,读者利用其中所介绍的方法和实现,可以自行实施一个精巧而完整的从Windows到Linux的应用移植过程,从而真正掌握这种方法,并立即将其应用到实际项目之中。...
作者简介
肖习攀,清华大学计算机科学与技术系硕士。IBM中国开发中心高级软件工程师。从2003年4月加入IBM中国开发中心至今,一直从事旨在提高企业生产效率的应用软件开发。多个项目开发组长。经历涉及Windows、Linux和Macintosh等平台,兴趣包括图形用户界面移植和企业协作式应用软件开发。阎小兵,在中国科学院计算技术研究所获得硕士。1999年加入IBM中国公司。现任IBM中国开发中心高级开发经理。曾参与IBM CICS移植,IBM WebSphere Commerce移植,IBM Productivity Tools开发与项目管理等。目前主要工作领域是下一代企业级工作场所协作软件的开发。对跨平台(Windows, Linux, Macintosh)软件开发和移植,以及大型软件开发过程管理和项目管理有着丰富的经验。贾迎乐,北京邮电大学信息工程学院硕士。目前是IBM中国软件开发中心高级软件工程师,从事IBM产品在Linux平台上的开发和移植工作。在C/C++编程语言,Windows和Linux图形用户界面应用程序的开发和移植等方面有深入的研究。龚奕平,清华大学计算机科学与技术系学士,多伦多大学计算机科学系硕士。IBM中国开发中心高级软件工程师。现主要从事IBM产品的研究和开发工作。研究兴趣包括Windows应用程序跨平台移植,GUI开发,以及网络设备开发等。曾在国内外期刊杂志上发表多篇学术和技术文章。
目录
第1章 移植架构 1
1.1 移植架构的设计 2
1.2 API模拟层的结构 3
1.3 API模拟层的实现方法 4
1.3.1 X窗口系统 4
1.3.2 Display和X的服务器/客户机结构 5
1.3.3 窗口管理器 8
1.3.4 X事件 9
1.3.5 GDK和GTK 10
1.4 编译器差异 11
1.5 示例程序介绍 15
1.6 小结 15
第2章 GDI子系统 17
2.1 Windows和Linux的图形用户界面输出比较 18
2.1.1 Windows的图形用户界面输出 18
2.1.2 Linux的图形用户界面输出 19
2.2 GDI模拟架构 19
2.2.1 高级GDI函数 20
2.2.2 GDI对象 21
2.2.3 输出设备 23
2.3 GDI对象详述 26
2.3.1 概述 26
2.3.2 位图对象(HBITMAP) 34
2.3.3 字体对象(HFONT) 38
2.3.4 裁剪区(HRGN) 38
2.3.5 笔和刷子(HPEN,HBRUSH) 40
2.4 屏幕输出 41
2.4.1 当前对象和绘图模式 41
2.4.2 屏幕设备和内存设备的差别 49
2.4.3 DCX_CLIPCHILDREN标志 53
2.4.4 私有设备上下文 54
2.4.5 图像输出 54
2.4.6 其他输出函数 57
2.5 元文件(metafile) 60
2.5.1 Windows元文件概述 60
2.5.2 生成元文件 62
2.5.3 播放元文件 64
2.6 小结 65
第3章 文本输出和字体管理 67
3.1 文本输出 68
3.1.1 基本概念 68
3.1.2 格式化文本输出 70
3.1.3 非格式化文本输出 71
3.2 字体管理 76
3.2.1 字体管理的一般概念 76
3.2.2 Linux下的字体管理 78
3.2.3 GDI中的字体管理 79
3.2.4 几个关键API的模拟实现 80
3.3 小结 86
第4章 窗口子系统 87
4.1 Windows和Linux的窗口系统比较 88
4.1.1 Windows的窗口系统 88
4.1.2 Linux的窗口系统 89
4.2 窗口类 90
4.2.1 窗口类数据结构 90
4.2.2 窗口类的注册和撤销 92
4.3 窗口和窗口句柄 93
4.3.1 窗口对象 93
4.3.2 窗口句柄 96
4.3.3 窗口的创建和销毁 97
4.4 窗口过程 102
4.4.1 窗口过程的内部表示 103
4.4.2 CallWindowProc 104
4.4.3 DefWindowProc 106
4.5 窗口绘图 108
4.5.1 窗口关联的设备上下文 108
4.5.2 窗口更新区域和重绘 111
4.6 小结 114
第5章 消息子系统 115
5.1 Windows和Linux的消息系统比较 116
5.2 消息队列 116
5.3 消息的投递(Post) 118
5.4 消息的发送(Send) 118
5.5 消息的提取和分发 119
5.6 Windows消息钩子(Hook) 121
5.7 小结 124
第6章 用户输入 125
6.1 Windows和Linux的用户输入系统比较 126
6.1.1 Windows的用户输入系统 126
6.1.2 Linux的用户输入系统 127
6.2 键盘输入 128
6.2.1 将GDK键盘事件转换为Windows键盘事件 128
6.2.2 从线程的用户输入队列中提取键盘消息 130
6.3 键盘焦点 130
6.3.1 Windows的焦点模型 131
6.3.2 Linux的焦点模型 131
6.3.3 模拟层键盘焦点系统的设计和实现 133
6.4 字符消息 135
6.5 插入符 138
6.6 鼠标输入 139
6.6.1 将GDK鼠标事件转换为Windows鼠标事件 139
6.6.2 从线程的用户输入队列中提取鼠标消息 141
6.6.3 鼠标光标 142
6.7 小结 143
第7章 剪贴板和拖放 145
7.1 Windows剪贴板和Linux剪贴板的比较 146
7.1.1 Windows剪贴板 146
7.1.2 Linux剪贴板 148
7.2 模拟层剪贴板的设计与实现 153
7.2.1 剪贴板的管理 153
7.2.2 格式的管理 154
7.2.3 数据的交换 155
7.3 模拟层中拖放的实现 158
7.4 小结 160
第8章 标准控件、菜单与对话框 161
8.1 概述 162
8.2 List Box 163
8.2.1 List Box控件的风格 163
8.2.2 List Box控件的设计与实现 166
8.3 Edit 168
8.3.1 Edit控件的风格 168
8.3.2 Edit控件的消息 169
8.3.3 Edit控件的设计与实现 171
8.4 ComboBox 176
8.4.1 ComboBox控件概述 177
8.4.2 ComboBox控件消息的处理 177
8.5 菜单 183
8.5.1 菜单消息 183
8.5.2 菜单模板资源 184
8.5.3 菜单的设计与实现 184
8.6 对话框 189
8.6.1 对话框模板结构 190
8.6.2 对话框的设计与实现 191
8.7 小结 193
第9章 打印 195
9.1 Windows和Linux的打印比较 196
9.1.1 Windows的打印系统 196
9.1.2 Linux的打印系统 196
9.2 模拟层打印模块的设计 197
9.2.1 使用CUPS和打印机进行通信 197
9.2.2 使用PostScript完成打印内容模拟 197
9.3 模拟层打印模块架构 199
9.4 获取打印机信息 202
9.4.1 获取打印机数量 202
9.4.2 获取打印机名称、打印机端口和打印机型号 203
9.4.3 把PostScript文件送往打印机 206
9.5 打印选项设置 206
9.5.1 创建打印作业 207
9.5.2 设置打印参数 208
9.5.3 释放内存 208
9.6 打印色彩管理 209
9.6.1 Windows打印色彩管理 209
9.6.2 模拟层打印模块中的色彩管理 209
9.7 打印坐标系管理 210
9.7.1 Windows逻辑坐标系和PostScript坐标系 211
9.7.2 坐标系转化 211
9.8 Windows GDI逻辑画笔在打印模块中的实现 213
9.8.1 设置逻辑画笔的颜色和宽度 213
9.8.2 设置逻辑画笔样式 214
9.8.3 实例分析 215
9.9 Windows GDI刷子在打印模块中的实现 216
9.9.1 PostScript刷子图案定义 216
9.9.2 PostScript刷子填充功能实现 216
9.10 Windows GDI位图在打印模块中的实现 219
9.10.1 PostScript位图数据描述 219
9.10.2 PostScript位图操作 221
9.11 打印裁剪方案 224
9.11.1 裁剪区域运算 224
9.11.2 设置裁剪区域 225
9.12 字体的打印 226
9.12.1 字体打印所需的PostScript命令 228
9.12.2 PostScript字体字典 229
9.12.3 字体字典的构造 230
9.12.4 Pango, PostScript和Freetype的数据单位关系 236
9.13 小结 237
第10章 Unicode与国际化 239
10.1 基本概念 240
10.1.1 本地化、国际化与全球化 240
10.1.2 Locale 241
10.1.3 字符集 244
10.1.4 Unicode字符集 245
10.2 Windows系统和Linux系统中的字符集差别 246
10.2.1 Windows上的字符集 246
10.2.2 Linux上的字符集 248
10.3 Windows系统和Linux系统中的Unicode实现差别 248
10.3.1 Windows上的Unicode 248
10.3.2 Linux上的Unicode 249
10.4 ANSI/Unicode与窗口子系统 249
10.4.1 ANSI代码页 249
10.4.2 GetACP的实现方案分析 250
10.4.3 GetACP的实现 251
10.4.4 A/W窗口 254
10.5 字符串处理中需要注意的问题 258
10.5.1 大小写转换 258
10.5.2 字符串长度 258
10.5.3 字符串比较 259
10.5.4 分割字符 259
10.6 BiDi支持 259
10.6.1 BiDi的处理 260
10.6.2 BiDi处理函数实现 261
10.7 小结 267
第11章 国际化输入 269
11.1 概述 270
11.2 Windows中的国际化输入 271
11.2.1 输入上下文(Input Context) 271
11.2.2 输入法管理(IMM) 272
11.2.3 IME消息及消息过程 273
11.3 Linux中的国际化输入 274
11.3.1 Gtk输入上下文(GtkIMContext) 275
11.3.2 GtkIMContext发送的信号 276
11.4 模拟层国际化输入的架构 277
11.5 Input Context设计与实现 278
11.5.1 IMContext结构设计 278
11.5.2 ImmGetContext的实现 280
11.5.3 ImmAssociateContext的实现 283
11.6 IME组件的控制管理 284
11.7 与客户窗口的协作 284
11.7.1 过滤键盘事件 284
11.7.2 监听焦点改变事件 285
11.7.3 销毁输入法窗口 285
11.7.4 GTK信号的处理 286
11.8 小结 287
第12章 资源的移植 289
12.1 资源概述 290
12.2 资源移植的过程 292
12.2.1 资源编译工具的模拟 293
12.2.2 高级资源加载API 311
12.2.3 低级资源加载API 312
12.3 小结 314
附录A Hello World Windows程序在Linux上的模拟 315
附录B PostScript语言简介 351
附录C LCID与ANSI代码页对应表 359
参考文献 364
索引 365
1.1 移植架构的设计 2
1.2 API模拟层的结构 3
1.3 API模拟层的实现方法 4
1.3.1 X窗口系统 4
1.3.2 Display和X的服务器/客户机结构 5
1.3.3 窗口管理器 8
1.3.4 X事件 9
1.3.5 GDK和GTK 10
1.4 编译器差异 11
1.5 示例程序介绍 15
1.6 小结 15
第2章 GDI子系统 17
2.1 Windows和Linux的图形用户界面输出比较 18
2.1.1 Windows的图形用户界面输出 18
2.1.2 Linux的图形用户界面输出 19
2.2 GDI模拟架构 19
2.2.1 高级GDI函数 20
2.2.2 GDI对象 21
2.2.3 输出设备 23
2.3 GDI对象详述 26
2.3.1 概述 26
2.3.2 位图对象(HBITMAP) 34
2.3.3 字体对象(HFONT) 38
2.3.4 裁剪区(HRGN) 38
2.3.5 笔和刷子(HPEN,HBRUSH) 40
2.4 屏幕输出 41
2.4.1 当前对象和绘图模式 41
2.4.2 屏幕设备和内存设备的差别 49
2.4.3 DCX_CLIPCHILDREN标志 53
2.4.4 私有设备上下文 54
2.4.5 图像输出 54
2.4.6 其他输出函数 57
2.5 元文件(metafile) 60
2.5.1 Windows元文件概述 60
2.5.2 生成元文件 62
2.5.3 播放元文件 64
2.6 小结 65
第3章 文本输出和字体管理 67
3.1 文本输出 68
3.1.1 基本概念 68
3.1.2 格式化文本输出 70
3.1.3 非格式化文本输出 71
3.2 字体管理 76
3.2.1 字体管理的一般概念 76
3.2.2 Linux下的字体管理 78
3.2.3 GDI中的字体管理 79
3.2.4 几个关键API的模拟实现 80
3.3 小结 86
第4章 窗口子系统 87
4.1 Windows和Linux的窗口系统比较 88
4.1.1 Windows的窗口系统 88
4.1.2 Linux的窗口系统 89
4.2 窗口类 90
4.2.1 窗口类数据结构 90
4.2.2 窗口类的注册和撤销 92
4.3 窗口和窗口句柄 93
4.3.1 窗口对象 93
4.3.2 窗口句柄 96
4.3.3 窗口的创建和销毁 97
4.4 窗口过程 102
4.4.1 窗口过程的内部表示 103
4.4.2 CallWindowProc 104
4.4.3 DefWindowProc 106
4.5 窗口绘图 108
4.5.1 窗口关联的设备上下文 108
4.5.2 窗口更新区域和重绘 111
4.6 小结 114
第5章 消息子系统 115
5.1 Windows和Linux的消息系统比较 116
5.2 消息队列 116
5.3 消息的投递(Post) 118
5.4 消息的发送(Send) 118
5.5 消息的提取和分发 119
5.6 Windows消息钩子(Hook) 121
5.7 小结 124
第6章 用户输入 125
6.1 Windows和Linux的用户输入系统比较 126
6.1.1 Windows的用户输入系统 126
6.1.2 Linux的用户输入系统 127
6.2 键盘输入 128
6.2.1 将GDK键盘事件转换为Windows键盘事件 128
6.2.2 从线程的用户输入队列中提取键盘消息 130
6.3 键盘焦点 130
6.3.1 Windows的焦点模型 131
6.3.2 Linux的焦点模型 131
6.3.3 模拟层键盘焦点系统的设计和实现 133
6.4 字符消息 135
6.5 插入符 138
6.6 鼠标输入 139
6.6.1 将GDK鼠标事件转换为Windows鼠标事件 139
6.6.2 从线程的用户输入队列中提取鼠标消息 141
6.6.3 鼠标光标 142
6.7 小结 143
第7章 剪贴板和拖放 145
7.1 Windows剪贴板和Linux剪贴板的比较 146
7.1.1 Windows剪贴板 146
7.1.2 Linux剪贴板 148
7.2 模拟层剪贴板的设计与实现 153
7.2.1 剪贴板的管理 153
7.2.2 格式的管理 154
7.2.3 数据的交换 155
7.3 模拟层中拖放的实现 158
7.4 小结 160
第8章 标准控件、菜单与对话框 161
8.1 概述 162
8.2 List Box 163
8.2.1 List Box控件的风格 163
8.2.2 List Box控件的设计与实现 166
8.3 Edit 168
8.3.1 Edit控件的风格 168
8.3.2 Edit控件的消息 169
8.3.3 Edit控件的设计与实现 171
8.4 ComboBox 176
8.4.1 ComboBox控件概述 177
8.4.2 ComboBox控件消息的处理 177
8.5 菜单 183
8.5.1 菜单消息 183
8.5.2 菜单模板资源 184
8.5.3 菜单的设计与实现 184
8.6 对话框 189
8.6.1 对话框模板结构 190
8.6.2 对话框的设计与实现 191
8.7 小结 193
第9章 打印 195
9.1 Windows和Linux的打印比较 196
9.1.1 Windows的打印系统 196
9.1.2 Linux的打印系统 196
9.2 模拟层打印模块的设计 197
9.2.1 使用CUPS和打印机进行通信 197
9.2.2 使用PostScript完成打印内容模拟 197
9.3 模拟层打印模块架构 199
9.4 获取打印机信息 202
9.4.1 获取打印机数量 202
9.4.2 获取打印机名称、打印机端口和打印机型号 203
9.4.3 把PostScript文件送往打印机 206
9.5 打印选项设置 206
9.5.1 创建打印作业 207
9.5.2 设置打印参数 208
9.5.3 释放内存 208
9.6 打印色彩管理 209
9.6.1 Windows打印色彩管理 209
9.6.2 模拟层打印模块中的色彩管理 209
9.7 打印坐标系管理 210
9.7.1 Windows逻辑坐标系和PostScript坐标系 211
9.7.2 坐标系转化 211
9.8 Windows GDI逻辑画笔在打印模块中的实现 213
9.8.1 设置逻辑画笔的颜色和宽度 213
9.8.2 设置逻辑画笔样式 214
9.8.3 实例分析 215
9.9 Windows GDI刷子在打印模块中的实现 216
9.9.1 PostScript刷子图案定义 216
9.9.2 PostScript刷子填充功能实现 216
9.10 Windows GDI位图在打印模块中的实现 219
9.10.1 PostScript位图数据描述 219
9.10.2 PostScript位图操作 221
9.11 打印裁剪方案 224
9.11.1 裁剪区域运算 224
9.11.2 设置裁剪区域 225
9.12 字体的打印 226
9.12.1 字体打印所需的PostScript命令 228
9.12.2 PostScript字体字典 229
9.12.3 字体字典的构造 230
9.12.4 Pango, PostScript和Freetype的数据单位关系 236
9.13 小结 237
第10章 Unicode与国际化 239
10.1 基本概念 240
10.1.1 本地化、国际化与全球化 240
10.1.2 Locale 241
10.1.3 字符集 244
10.1.4 Unicode字符集 245
10.2 Windows系统和Linux系统中的字符集差别 246
10.2.1 Windows上的字符集 246
10.2.2 Linux上的字符集 248
10.3 Windows系统和Linux系统中的Unicode实现差别 248
10.3.1 Windows上的Unicode 248
10.3.2 Linux上的Unicode 249
10.4 ANSI/Unicode与窗口子系统 249
10.4.1 ANSI代码页 249
10.4.2 GetACP的实现方案分析 250
10.4.3 GetACP的实现 251
10.4.4 A/W窗口 254
10.5 字符串处理中需要注意的问题 258
10.5.1 大小写转换 258
10.5.2 字符串长度 258
10.5.3 字符串比较 259
10.5.4 分割字符 259
10.6 BiDi支持 259
10.6.1 BiDi的处理 260
10.6.2 BiDi处理函数实现 261
10.7 小结 267
第11章 国际化输入 269
11.1 概述 270
11.2 Windows中的国际化输入 271
11.2.1 输入上下文(Input Context) 271
11.2.2 输入法管理(IMM) 272
11.2.3 IME消息及消息过程 273
11.3 Linux中的国际化输入 274
11.3.1 Gtk输入上下文(GtkIMContext) 275
11.3.2 GtkIMContext发送的信号 276
11.4 模拟层国际化输入的架构 277
11.5 Input Context设计与实现 278
11.5.1 IMContext结构设计 278
11.5.2 ImmGetContext的实现 280
11.5.3 ImmAssociateContext的实现 283
11.6 IME组件的控制管理 284
11.7 与客户窗口的协作 284
11.7.1 过滤键盘事件 284
11.7.2 监听焦点改变事件 285
11.7.3 销毁输入法窗口 285
11.7.4 GTK信号的处理 286
11.8 小结 287
第12章 资源的移植 289
12.1 资源概述 290
12.2 资源移植的过程 292
12.2.1 资源编译工具的模拟 293
12.2.2 高级资源加载API 311
12.2.3 低级资源加载API 312
12.3 小结 314
附录A Hello World Windows程序在Linux上的模拟 315
附录B PostScript语言简介 351
附录C LCID与ANSI代码页对应表 359
参考文献 364
索引 365
猜您喜欢