Builder Xcessory
制造商:Integrated Computer Solutions (ICS)
电子邮件:sales@ics.com
价格: 个人使用许可 250 美元
评论员:Robert Hartley
Builder Xcessory (BX) 是一款成熟的、高端的、基于面向对象的 UNIX GUI 开发工具,适用于 Motif 和 Java,于一年多前发布,用于 Linux。 与 Cygnus 的 Code Fusion 一起,BXPro 荣获Linux Journal“编辑选择奖”最佳新应用:1999 年软件开发奖。
除了高度直观的组件布局外,BX 还允许开发人员
通过将小部件分组在一起并将它们制成主类来构建组件,这些类具有自己的方法和数据接口,而无需将它们编译成单独的共享库以放置在调色板上。
实施组织良好的方式来应用样式,以实现一致的外观和感觉。 许多组织(如政府和军事分包商)对 GUI 的外观有自己的严格标准,为特定系统声明自己的字体、颜色和其他约定。
在 GUI 经历进化性变化时,透明地保持代码完整。 当对 GUI 进行更改时,回调代码不会丢失。
调用和使用标准开发工具,例如 Code Fusion、Purify、CVS、SGI Developer Magic 等。
在调色板上添加新组件和小部件并“实时”使用它们。
使用行业标准的 Motif 和 Lesstif 开发 C、C++、ViewKit、UIL 和 Java 应用程序。
Builder Xcessory 是当今适用于使用 C/C++ 和 Java 的 OOD/OOP 开发人员的最佳 X 和 Motif GUI 开发工具,并且正在开发企业开发工具,包括其他 GUI API。 对于应用程序框架,除了为那些维护遗留应用程序的人员提供的纯 C 之外,它还允许使用 ViewKit 和基于 MotifApp 的 C++ 类系统。
ViewKit 非常适合 C++ 和 Motif 工作,但对于当前不可用的平台,当与 Motif 或 LessTif 一起使用时,提供的基于 MotifApp 的 C++ 框架运行良好。 我发现在将 Motif 应用程序移植到 Rebel NetWinder 时,这尤其有帮助,因为其 ViewKit 端口在撰写本文时仍在开发中。 当 Motif 不存在时,使用免费的 Lesstif 库的一个优点是,源代码在所有基于 UNIX/Linux 的 X11 平台上都兼容。
运行各种窗口管理器不会影响构建器的操作,因为它静态绑定了 Motif 库,这也意味着即使根本没有安装 Motif 也可以运行它。
除了全面的纸质手册外,所有文档都以 HTML 格式本地安装,并且可以从帮助菜单轻松调用。 这些手册还包含完整的教程,详细描述了使用 BX 的每个功能所需的步骤。 教程数据文件和示例代码比比皆是,并且可以通过 ICS FTP 和网站免费获得更新。
与大多数其他 GUI 构建器一样,实现所谓的门面设计模式几乎不需要任何努力。
在类中对复杂对象进行建模,提供简化的访问函数或方法来控制它,然后使用 GUI 界面来查看它,这使我们能够利用模型-视图-控制器 (MVC) 概念。 这意味着我们可以随时将我们的程序转换为 CORBA 类型的分布式应用程序。 只需从 GUI 的事件响应例程(在 X 术语中称为回调)中替换对基于 CORBA 的对象的方法调用,我们现在就有了一个现代化的分布式应用程序。 让我们的 GUI 仅与数据松散耦合意味着当更改应用程序后端的实现方式时,我们几乎不需要更新任何内容。
BX 是一款真正的 WYSIWYG GUI 构建器。 它将允许您直观地将小部件和组件添加到其他小部件和组件。 当您构建 GUI 时,设计树反映了小部件层次结构。 这比其他系统更直观,在其他系统中,小部件被添加到设计树上,并且小部件放置显示在屏幕上。 直接与小部件交互而无需这种间接级别要自然得多。 BX 还将交互式地显示窗口内容在调整大小时发生的情况,从而轻松配置 Motif 更复杂的容器小部件。

图 1. 表单小部件内按钮的小部件约束设置说明
每个 Motif 小部件都有自己的资源列表,可以使用资源编辑器进行设置。 这允许设置与几何无关的资源,例如字体、颜色和各种回调。
有许多选项可以显示哪些资源是可查看的。 与所有 BX 菜单项一样,图 4 中显示的“查看”菜单已被“撕下”并在其自己的窗口中显示,从而提高了工作效率。 如果用户选择了“所有资源”选项,则可能存在比容易扫描的资源更多的资源可供查看。 BX 提供了一个资源查找器,允许用户输入搜索字符串,并且任何包含它的资源都将被滚动到并突出显示,如图 5 所示。

图 4. 查看菜单
BX 中的样式管理器允许我们轻松地将预设值应用于任意数量的小部件的资源。 例如,假设我们想要一个带有标签“Dismiss”的按钮、粗体字体、黑色前景色和略带橄榄色的背景; 我们可以使用如图 6 所示的样式编辑器。将此样式保存为 DismissButtonStyle,我们的样式层次结构树将如图 7 所示。当我们创建一个按钮并应用样式时,它将如图 8 所示。

图 7. 层次结构树

图 8. 定义样式中的按钮
除了能够一次将样式应用于多个小部件外,样式还可以轻松共享,以便它们可用于正在开发的其他应用程序。
BX 有两种查看小部件层次结构的模式:类和实例。 类模式指示组件的预定义外观和行为将是什么,实际上定义了新类型。 实例模式针对特定的小部件或组件对其进行定制,因此我们可以调整使其与同类型其他小部件或组件不同的地方。
从最通用的类开始,我们可以定义更具体的子类,每次都逐渐变得更精细,或者随着我们的进行而更改和覆盖内容。
为了节省重新设计标准布局的时间,我们可以通过将多个逻辑上相关的小部件组合在一起并将其变成一个类来将它们组合成一个实体。 这使得重用变得轻而易举,因为所有新创建的类都会添加到调色板中。
要创建包含一个或多个小部件的类,请选择要使用的最高级别的小部件,然后选择“创建类”菜单选项。 在之前的包含表单小部件以及几个按钮和滚动列表的小部件树中,我执行了“创建类”操作,现在有了一个名为 ListProcessor 的新组件,我可以将其视为独立组件。 它不仅仅是一个简单的小部件,因为我们避免了深入研究 Xlib、Xt 和 Motif 的深处,保持在相对较高的水平,而不会放弃对任何底层小部件的控制。
在类模式下,我们可以使用小部件类树来选择要公开哪些资源,从而为我们提供了一种简化的方法来控制我们新创建的组件,而无需查看它包含的每个小部件的每个资源。 为了方便起见,任何标记为“公开”的资源都定义了 set 类型的方法,因此我们不必担心小部件资源的精确 Motif 名称以及设置它们的函数。
当我们在浏览器中选择类实体时,可以轻松添加新的类方法(函数和过程)和数据。 当我们单击“新建”按钮以添加数据或方法时,我们的资源编辑器会自动将我们置于类编辑模式。 (参见图 9 和图 10。)
我们的资源编辑器现在如图 11 所示,插入了新条目。 我们现在可以选择“编辑”按钮,如果需要,将在启动任何源代码编辑器之前生成我们的源代码。 此时,我们可以查看我们的代码,光标自动放置在函数开始的行上。
我们从图 12 的快照中注意到的一件事是用户代码块周围的“用户代码块”开始和结束注释。 程序员可以修改这些注释之间的任何内容。 BX 保留在这些用户代码块之外进行更改的权利,但在其他情况下不会干预。 BX 通过扫描并跳过开发人员保留的部分来避免覆盖用户编写的代码。 在项目开始时,这些是由注释分隔符界定的空行。 在整个 BX 生成的代码中,在任何主要代码操作之前、期间和之后都会找到这些注释块。 对于习惯于仅生成回调代码存根的新 GUI 程序员来说,这似乎是多余的,但它们对于调整主要系统的最终生产代码非常有帮助。
直到最近,Douglas A. Young 还是 Silicon Graphics Inc. (SGI) 的首席科学家。 他撰写了许多关于 Motif 开发的书籍,并且是 GUI 领域被引用和阅读最多的作者,尤其专注于 Motif。 他的Object-Oriented Programming with C++ and OSF/Motif仍然是一部备受推崇的经典之作。 在其中,他开发了 MotifApp GUI 应用程序框架,这些框架已发展成为 ViewKit 产品,最初由 SGI 提供,但现在在 Linux 上免费,并且可用于其他 UNIX 平台。
要理解“Doug Young 方法”的含义,我们需要了解应用程序框架开发人员想要使用基于非 OOP 语言(如 Motif)的 GUI API 创建 OOP 框架时可用的选择。
在某些方面,Motif 是一个 OO 包。 它使用继承来创建基于旧的小部件类的新小部件类,将数据和方法从超类传递到新派生的子类。 由于它是用 C 编写的,因此需要一些编组代码来克服 C++ 等真正的 OOP 语言中存在的语言特性。 Gtk+ 使用许多相同的概念,因为它也是用 C 编写的,因此这里的策略也适用于 Gtk+。
Doug Young 关于使用 C++ 和 C GUI 的观察结果可以用他的三种策略概括如下
我们的第一个选择是不使用 C++ 的 OOP 功能,而只是使用编译器更强的类型检查。 当然,这将使我们无法获得使用 C++ 和 OOP 的更大优势。
我们的第二个选择是将每个小部件封装到 C++ 包装器类中。 虽然这可能提供一些审美吸引力,但它掩盖了这样一个事实,即添加额外的编组代码来获取派生的 Motif 对象不是真正的 OOP,并且与纯 C 相比可能会导致性能下降。 我们不能简单地创建一个 C++ 包装的小部件的子类并期望它能正常工作,因为这只会扩展包装器类,而不会扩展小部件本身。 为了拥有完整的 OOP 小部件类层次结构,我们需要从头开始使用 OOP 语言编写我们的小部件,就像 Qt 小部件集所做的那样。
将 C++ 与 C GUI API 结合使用的第三种也是最自然的方法是创建由 GUI 小部件集合组成的(而不是派生自)高级组件。 所有程序员都在某种程度上使用这种功能性方法而不是对象方法,因为我们还没有看到完全 OO 的 CPU 得到广泛使用。 即使是芯片上的 Java 机器之类的东西,在某些微代码级别上也是非面向对象的机器。
ViewKit 应用程序框架是 MotifApp 的商业后代,已使用第三种方法开发。
为了使事情更直观,ViewKit 具有一个名为 VkEZ 的功能,它由一个头文件和一个库组成。 VkEZ 没有强迫程序员直接使用许多 Motif 函数,而是重载了许多赋值运算符,同时添加了一些额外的辅助函数。 这方面的例子包括使用“=”运算符直接轻松地将字符串分配给文本和标签小部件的能力。 虽然这可能有助于使程序的初始版本启动并运行,但通常情况下,VkEZ 函数会被直接 Motif 函数调用的对应函数替换。
Robert Hartley 可以通过电子邮件 rhartley@srougi.com 与他联系。