使用 GTK+ 和 GDK 开发 Linux 应用程序

作者:Eric Harlow
出版社:New Riders
价格:$27.99 美元
ISBN:0-7357-0021-4
评论者:Michael J. Hammel
自从几年前 GIMP 早期引入 GTK+ 以来,我一直在使用它。我见证了它的成熟,并成为一套相当复杂的窗口小部件集——对于在 X 下使用来说,是我见过的最好的之一。直到最近,只有那些愿意深入研究源代码的人才能掌握 GTK+,但这对于胆小者和手指不灵巧的人来说并非易事。
幸运的是,我确信这将是关于 GTK+ 的众多书籍中的第一本已经上架了。Eric Harlow 的著作 使用 GTK+ 和 GDK 开发 Linux 应用程序,由 New Riders 出版,是对 GTK+ 世界的介绍,许多来自 MS Windows 世界的难民会发现它很有用。虽然这本书不是为经验丰富的用户准备的,但即使对于像我这样的 GTK+ 老手来说,它也有其亮点。
本书分为四个部分
GTK+ 编程
应用程序示例
绘图、颜色和 GDK
扩展 GTK+
第 1 章实际上不是一个章节——它是前言。本书的其余部分从 GTK+ 基础知识开始,然后逐步深入到每个部分更复杂的问题,每个部分由两到六章组成。关于示例代码的布局有点奇怪。第一部分中的章节本质上是介绍性的,涵盖 glib 和一些基本的 GTK+ 功能。第二部分中的章节各自涵盖一个示例应用程序,旨在展示在第一部分中学到的内容。然而,第三部分将其示例代码放在其四章的最后两章。第四部分将示例混合在每个章节中。除非你像我一样从评论者的角度退后一步并查看它,否则你可能不会真正注意到这种布局模式,但是看到材料以这种方式分解有点奇怪。我本以为示例会简单地与每个章节混合在一起。
第 2 章介绍了 glib,这是一个实用程序例程库,用于处理哈希表、链表和内存管理。我个人并不经常使用 glib——我自己有简单的库例程来完成我很久以前编写的并在不同地方使用的这些事情。但是,一些小部件直接使用了某些 glib 功能,因此熟悉它是什么以及它的作用是有帮助的。
下一章展示了一个简单的 GTK+ 应用程序是如何布局的。这将引出第 4 章对基本小部件的介绍:按钮、标签、菜单和文本输入小部件。第 5 章和第 6 章也描述了小部件。虽然有几章是关于小部件的,但你需要意识到它们可能相当复杂,并提供许多选项以及它们随附的支持和便利例程。没有一个小部件描述超过两页(除了 Clist 和 Text 小部件,它们在本书的最后才介绍)。不要指望在这里找到详细的 API 描述——本文本质上是非常入门级的。
在第 27 页和 28 页,Eric 确实犯了一个小错误——他说 GTK+ 来自 GIMP,并且它代表 GNU 图像处理项目。GIMP 中的 P 实际上代表“Program”(程序)。他还说 GTK+ 的诞生是由于与 GIMP 原始小部件集 Motif 相关的许可问题(虽然没有用那么多字眼)。我不相信那是主要原因。Motif 在某些领域受到限制,并且没有源代码使得扩展它变得困难。另外,我认为程序员无论如何都想从头开始开发一套小部件。
Eric 准确地描述了如何使用单行命令行构建应用程序,包括推荐使用 gtk-config 脚本。另一个可能需要补充的项目是 GTK_CONFIG 环境变量的使用。如果在你的项目中使用它,你允许那些安装了多个 GTK+ 版本(这是一个不断发展的库)的人构建他们需要的任何库版本。
第 3 章中关于容器小部件的部分本可以使用更精细的细节。使用盒子和表格进行打包通常是最近的转换者感到困惑的领域。
第 4 章首先讨论了小部件的类型转换。GTK+ 小部件在创建时是通用的,因此要将它们与类型特定的函数(例如 gtk_label_set_text)一起使用,你需要将小部件转换为正确的类型。这是通过宏完成的,例如 GTK_LABEL。文本中的讨论很好但很简短。如果有一个显示小部件继承关系的表格会很好,但这不是一本参考书。
在第 51 页,Eric 在结束关于类型转换的讨论后,略微奇怪地过渡到关于信号的段落。这些信息很有用,尽管它似乎来得有点突然。
第 4 章的其余部分向读者介绍了标签、按钮、文本输入(称为条目小部件)、简单列表、组合框(带有文本输入字段的列表)、选项菜单和通用容器(容纳其他小部件的小部件)。在这里,对于那些愿意翻阅 GTK+ 源代码的人来说,对小部件特定函数的命名方案进行一些讨论可能会有所帮助。
第 4、5 和 6 章是对各种小部件的描述。第 7 章开始第二部分及其示例应用程序。使用记事本应用程序作为示例是一个好主意——对于开发人员来说,这是一个熟悉的应用程序——但是关于文本小部件的部分应该缓和一下,因为它很可能在 GTK+ 的下一个主要版本中发生变化。编写原始文本小部件的 Owen Taylor 说过,该设计不利于新功能,并且他对如何重新设计它有一些更好的想法。但这是否意味着使用该小部件的应用程序将不再工作尚不清楚。然而,这些变化可能在一段时间内不会发生。
印刷文本的一个问题是出版商将其推向市场并上架所需的时间。因此,对于当前版本的 GTK+(版本 1.2),本文有点落后于曲线。我相信 Eric 在编写本文时使用的是版本 1.1.5。一些示例虽然有效,但使用了过时的函数。例如,他在代码的许多地方使用了 gtk_label_set。与 GTK 1.2 一起使用的正确函数是 gtk_label_set_text。如果你不确定本书中的任何其他代码,你可以查看 GTK+ 网站 (https://gtk.org.cn/) 以查找从 GTK 1.0 到 1.2 的更改。
关于标签的一个常见问题,直到关于创建你自己的小部件的最后一章才提到,是标签是从 GtkMisc 小部件子类化的,这意味着标签不接收信号。因此,它们必须被包裹在其他小部件中。对于事件处理,你会将标签放在 GtkEventBox 小部件内。记住这一点信息——你迟早会需要它的。
第 10 章到第 13 章构成了第三部分,涵盖了与颜色和使用底层 GDK 例程绘图相关的问题。我发现第 10 章最有用,因为我终于弄清楚了如何进行双缓冲。双缓冲只是在屏幕外(不可见)区域(一个像素图)中绘图,然后将该区域复制到当前可见的版本上。一旦你学会了这项技术,它就很简单。这是一段精巧的代码,通常隐藏在更广泛的子例程的内部。Eric 清楚地解释了双缓冲,并提供了如何使用它的好例子。
第 11 章进入样式、颜色和字体。这里的讨论就像文本的其余部分一样:简短但准确。然而,样式部分讨论了以编程方式使用样式。它没有从 gtkrc 文件的角度讨论它们。样式,具体来说,是 GTK+ 的 API 术语,但是添加 主题(最终用户可能将其称为样式)对于使用 GTK+ 的应用程序来说是一件大事。gtkrc 文件添加了一个“外观”,但远不如 Motif 常见的应用程序默认文件复杂。后者允许外部定义命令行参数,例如。目前,gtkrc 严格处理外观和感觉问题。
没有关于在 GTK+ 中使用命令行参数的讨论。Motif 程序员可能习惯了 Motif 的内置命令行解析器。GTK+ 没有这样的东西。如果你计划使用命令行参数,你可能想使用 getopt_long,除非你担心移植到非 Linux 平台。在这种情况下,你可能不得不自己编写解析器,因为并非所有 UNIX 机器都有 getopt_long。
本书的源代码可以从 New Riders 的网站获得。它以 gzipped tar 格式提供,示例按章节目录分解。没有顶层 Makefile,但各个目录很容易构建。确保你的路径中有 gtk-config 脚本。大多数应用程序对我来说都运行良好。不幸的是,molecule 示例似乎没有绘制任何分子。双缓冲示例——一个没有时钟,一个有时钟——并没有在我的系统上显示双缓冲的优势,因为它足够快(400MHz),以至于未缓冲版本中的重绘几乎不明显。但是你 应该 注意那个例子。如果你正在使用 GDK 进行大量的绘图,双缓冲是一件好事。
考虑到本书的入门性质,我想知道最后一章关于编写你自己的小部件对于其他人来说有多大用处。这个空间可能更好地用于涵盖更多关于小部件细节的内容。
Eric 的写作风格简洁明了。这本书很少有错别字——在线文档以糟糕的编辑而臭名昭著,这也是为什么印刷的专业文档仍然存在的原因之一。阅读本书肯定比阅读我见过的许多在线文档更容易。
本书是编写 GTK+ 应用程序的初学者指南。它不是一本参考书,并且在深入的小部件解释方面还有很多不足之处。如果你只需要一个入门介绍,并且你正在寻找迁移到 Linux 和 GTK+,那么这是一个不错的起点。
