XForms 库编程

作者:Thor Sigvaldason

Linux 是从哪里来的?这是一个好问题,似乎也让许多新用户感到困惑。当然,简短的答案是 Linux 是由 Linus Torvalds(Linux 内核最初和核心的推动力)编写的。但是这个草率的回答忽略了 Linux 的许多精神。当您走进电脑商店购买 Linux CD-ROM 套装时,您得到的是数千名程序员智力成果的副本。这些人中的大多数人从未见过面。然而,由于互联网,这个地理上分散的群体设法创建了强大的工具和应用程序阵列。Linux 运行得非常好,以至于它造成了一种错觉,即存在某种组织和控制结构——某种中央权威机构指导其开发的各个方面。这很容易让人忘记,您运行的每个应用程序——从 ASCII 文本编辑器到 Z-Modem 下载——都存在,因为有人在某个地方有一天坐下来,说:“我找不到在 Linux 下执行此操作的方法,所以也许我应该尝试编写自己的程序。”

本文是旨在向读者介绍名为 XForms 库的编程工具的三部分系列文章中的第一篇。顾名思义,XForms 是一组工具和例程,可用于轻松创建在 X Window 系统下运行的程序。总体目标是将从未编写过基于 X 的软件的读者带到可以开始编写自己的应用程序和实用程序的程度。本系列文章假设读者熟悉 C 编程语言,因为 XForms 是基于 C 的。如果您还不了解 C 编程,那么现在可能是深入了解的好时机。买一两本书并开始摆弄它。经过几周的学习,您可能会掌握足够的 C 知识,以便在下一篇文章出现时能够跟上本系列文章的进度。此外,还假设您已安装可用的 C 编译器和 X Window 系统。

作者希望读者最终能够为 Linux 贡献一个基于 XForms 的程序。下次您在 comp.os.linux.misc 上发布“在哪里可以找到执行 x 操作的程序”的消息,但没有得到答案时,请考虑一下这是否是您自己可以编写的东西。您可能不会因此赚到一分钱,但这个过程并非没有回报。有一天,在将您的软件包上传到 Sunsite 几个月后,您可能会发现自己身处一家软件商店,该商店刚刚收到一批新的 Linux CD-ROM。在货架上,可能挤在微软和 Corel 最新的商业软件之间,将是您编写的几千字节的代码,全世界的人们都在使用。

系列文章大纲

本文的目的是解释如何获取和安装 XForms。我们还将初步了解创建 XForms 应用程序的过程,并实际编写几个简单的程序。

接下来的两篇文章将在八月和九月的《Linux Journal》杂志上发表,将扩展这个过程。它们将通过创建实用软件的所有步骤,借助一个示例应用程序,一个简单的博弈论模拟器。如果您不知道什么是博弈论,请不要担心,因为您需要了解的所有内容都将在过程中解释。编程示例的选择是由作者的兴趣驱动的,并且与本系列文章的中心目的无关:学习使用 XForms。

有关在哪里获取所有提及软件的详细信息,请参见本文末尾的“资源”部分。本系列文章还有一个网页,网址为 http://a42.com/~thor/xforms/。该站点包含所有相关软件的链接,以及本系列文章中使用的所有源代码的列表。

XForms 概述

XForms 库由 T. C. Zhao 和 Mark Overmars 编写。它免费供非商业用途使用,但如果您计划销售您的应用程序,您将需要与 XForms 作者建立货币许可安排。如果您是免费软件“纯粹主义者”,您可能需要考虑使用 V 而不是 XForms(请参阅下一节)。

XForms 软件包最重要的部分是实际的库 (libforms) 和 forms.h 包含文件。前者包含用于创建按钮、菜单等的函数。包含文件声明了这些库函数,这使得它们可以在您的软件中使用。如果您是这一切的相对新手,请不要担心——我们将逐步完成使一切正常工作所需的每个步骤。

还有一个非常详尽的 HTML 格式的手册,其中解释了所有可用的例程。主发行版中包含大量示例应用程序,文档中引用了这些应用程序。这些示例对于获得有关如何实现各种过程的好主意非常有用。

最后,XForms 附带了一个名为 fdesign 的程序,可用于设计用户界面。这确实可以节省时间,因为您可以使用鼠标来控制按钮、菜单和其他对象的位置。然后可以将您的设计保存到文件中,并轻松地导入到您的源代码中。因此,可以在相对较短的时间内创建具有大量图形元素的复杂重叠窗口集。

由于 XForms 实际上是围绕 X11 库构建的,因此您编写的任何程序都高度可移植到其他支持 X 的系统。虽然本杂志的读者可能会为 Linux 开发,但很高兴知道 FreeBSD、Sun 和其他系统的用户如果愿意,也可以运行您的应用程序。

替代方案

由于学习任何编程库都需要投入大量时间,因此在完全投入 XForms 之前,可能值得您考虑一些替代方案。

以下讨论远非详尽无遗,并且仅基于作者的特殊经验。

Motif 是一个非常常见的库,用于构建许多商业的基于 X 的程序。要创建您自己的 Motif 应用程序,您需要 Motif 开发库,这相当昂贵(至少以 Linux 标准衡量)。Motif 的主要优点是它是一个成熟的系统,可以创建视觉上吸引人的应用程序。主要缺点是它的价格。正在开发一个免费版本的 Motif(称为 LessTif),但它尚未 100% 功能齐全。

另一个许可安排类似于 XForms 的库称为 Qt。Qt 库在 X 下免费供非商业用途使用,但也适用于 Microsoft Windows 和其他操作系统。这有一个很大的优点,如果您在 Linux 下编写程序,人们也可以在完全不同的操作系统上使用它。它也是新的 KDE 桌面环境的核心,该环境应该在本篇文章印刷时可用。如果 KDE 流行起来,那么 Qt 将在 Linux 世界中变得非常流行。Qt 库基于 C++(而不是 XForms 使用的纯 C)。

如果您想要一个真正免费的 X 开发系统,那么您可能需要看看 V。这是另一个基于 C++ 的库,其中包括所有标准功能,例如按钮、菜单等。正如 V 的作者承认的那样,它可能不适合尝试编写最先进的界面,但它是一个相当完整的软件包,并且价格难以置信。

查找和安装 XForms

安装 XForms 的主要任务是将库和包含文件放入系统上的正确位置。XForms 的 Web 和 ftp 站点列在本文末尾。大多数人会想要抓取 ELF 版本,但如果您仍在运行 a.out,请确保您获得相关文件。发行版包括库、50 多个示例应用程序和 fdesign 程序。您还应该获取参考手册,该手册以单独的文件提供。

在撰写本文时,XForms 的最新版本是 0.81,Linux 软件包是一个大约 600KB 的压缩 tar 文件(即,它具有 .tgz 扩展名)。您应该确保以 root 用户身份登录,并将发行版解压缩到 /usr/local/ 等位置。存档将安装到名为 xforms 的目录中。通常,最好检查发行版中包含的 Readme 文件,以获取有关安装的建议。

如果您有一个或多或少的标准设置,那么您需要做的就是转到 xforms 目录并键入 make install。这应该将库和包含文件复制到正确的位置。如果这不起作用(或者您想手动操作),只需确保 forms.h 最终出现在 gcc 可以找到它的位置(即,在 /usr/include/ 中),并且所有 libform 文件最终都与 libX11 在同一位置(即,在 /usr/X11R6/lib/ 中)。

如果您想验证是否已正确安装,请更改为 DEMOS 子目录并尝试 make demo。如果这不起作用,请返回并确保库和包含文件位于它们应该在的位置。

您的第一个 XForms 程序

安装库和包含文件后,就该编写您的第一个程序了。C 语言的传统是第一次尝试应该总是说“hello world”,所以我们将编写一个就做这件事的程序。键入 xhello.c(参见列表 1)的源代码,或从系列文章网站复制它。

列表 1. xhello.c

正如源代码所示,您应该能够使用以下命令编译程序

gcc -lX11 -lforms -lm xhello.c -o xhello

命令 xhello 应该启动程序(确保您正在运行 X)。您可能必须键入 ./xhello,具体取决于您的 shell 的 PATH 变量的设置方式。运行的程序应该类似于图 1。请注意,您必须包含链接选项才能使其工作。特别是,-lX11 将您的代码链接到标准 X 库,XForms 依赖于该库(libX11 包含在所有 X 发行版中)。forms 库通过 -lforms 链接,它使用一些必须与 -lm 链接的数学例程。

Programming with the XForms Library

图 1. Hello World

虽然 xhello 程序没有做太多事情,但它显示了编写 XForms 应用程序所涉及的基本步骤。首先,我们包含 forms 头文件,这使我们可以访问 XForms 例程。然后,调用 fl_initialize() 以让 XForms 设置自身。我们将所有命令行选项(存储在 argv 中)传递给此函数,以便 XForms 可以提取它想要的选项。例如,我们的 xhello 程序已经理解诸如 -share(共享颜色映射)和 -display(在指定的 X 显示器上打开自身)之类的命令选项。

在完成初始化后,我们可以创建任意数量的图形元素。在本例中,我们只有一个按钮位于单个窗口中。5 然后,我们使用 fl_show_form() 函数显示我们创建的窗口。为了让程序在按钮被按下后才退出,我们调用 fl_do_forms(),它会等待直到我们的窗口状态发生变化才返回。

5. 这引出了关于术语的注释。许多人将屏幕上对象的矩形集合视为窗口。XForms 库将这样的集合称为表单。在本系列的其余部分中,最好将这两个术语视为可互换的。

此时有几件事需要注意。首先,如果您以前从未编写过 X 应用程序,那么值得祝贺(给自己拍拍背)。其次,虽然安装库可能花费了一些时间,但结果非常值得。仅使用两个变量和不到十几个函数调用,我们就得到了一个完全成熟的正在运行的程序。不仅如此,我们的程序还很吸引人:配色方案赏心悦目,按钮经过精美阴影处理,使其看起来具有三维效果等。最后,即使在慢速硬件上,程序也快速且响应迅速。这归因于多种因素的结合,其中最重要的是 XForms 非常高效,并且所有内容都是用纯 C 语言完成的。

更详细一点

如果您已经在考虑更伟大的事情,您可能会对如何让 XForms 应用程序执行除在按下单个按钮后返回之外的任何操作感到有些困惑。下一个编程示例提供了一个提示,但整个故事将不得不等待本系列文章的后两篇。

基本思想是按照 xhello 示例中的步骤进行,但为每个操作添加一些功能。我们通过创建一个名为 xmulti 的多语言“Hello World”程序来做到这一点。源代码如列表 2 所示,也可以在系列文章网页上找到。将此文件另存为 xmulti.c。它应该使用以下命令编译

gcc -lX11 -lforms -lm xmulti.c -o xmulti

列表 2. xmulti.c

现在可以通过键入 xmulti 来执行该程序,并且应该看起来像图 2 中所示的示例。检查 xmulti 源代码揭示了创建 XForms 程序所涉及的基本步骤如下

Programming with the XForms Library

图 2. 多语言 Hello World

  1. 包含 forms.h 以访问 XForms 例程

  2. 尽快调用 fl_initialize()

  3. 通过创建表单来设置您的图形界面

  4. 通过设置回调将操作分配给相关对象

  5. 显示一个或多个表单

  6. 将控制权交给 fl_do_forms()

这里唯一的新事物是第 4 点,我们最初的 xhello 程序不包括该点。在 xmulti 中,英语和法语按钮设置为调用例程 set_language(),该例程更改显示。但基本思想非常通用,您可以轻松添加按钮、菜单等,它们可以调用复杂的函数、显示其他表单或任何您想要的东西。

下个月预告

下个月,我们将通过编写一个更复杂的程序来扩展这个基本讨论。这将涉及使用菜单、多个窗口和一些其他改进。到我们完成第三篇文章时,您应该已经走在创建有用应用程序的道路上。

如果您迫不及待地想了解更多信息,那么您可能需要开始阅读 XForms 手册。浏览示例应用程序的源代码也是熟悉 XForms 做事方式的绝佳方法。

资源

Thor Sigvaldason 是统计程序 xldlas 的作者,该程序使用了 XForms 库(参见《Linux Journal》,第 34 期,1997 年 2 月)。他正在努力完成经济学博士学位,可以通过 thor@netcom.ca 与他联系。

加载 Disqus 评论