Chapter 11 使用 FLUID 编程
本章介绍怎样使用 Fast Light User-Interface Designer(“FLUID”)创建你的图
形用户界面(GUIs). 章节目录如下:
1
Chapter 11 使用 FLUID 编程..................................................................................................................... 1
11.1 FLUID 是什么.................................................................................................................................. 3
11.2 UNIX 下运行 FLUID ....................................................................................................................... 4
11.3 在 Windows 下运行 FLUID ............................................................................................................5
11.4 编译.fl 文件......................................................................................................................................5
11.5 一个简短的指南..............................................................................................................................6
11.5.1 CubeView 类..........................................................................................................................8
11.5.2 CubeViewUI 类 ....................................................................................................................14
11.5.3 加入构造函数的初始化代码 .............................................................................................18
11.5.4 生成代码 .............................................................................................................................18
11.6 FLUID 参考手册 ........................................................................................................................... 18
11.6.1 构件浏览器.........................................................................................................................19
11.6.2 菜单项.................................................................................................................................20
11.6.3 构件面板 .............................................................................................................................25
11.7 GUI 属性.........................................................................................................................................26
11.7.1 Style Attributes.....................................................................................................................29
11.7.2 C++ Attributes......................................................................................................................31
11.8 Selecting and Moving Widgets ....................................................................................................... 33
11.9 Image Labels................................................................................................................................... 35
11.10 FLUID 的国际化 .......................................................................................................................... 37
11.10.1 I18N 方法 ...........................................................................................................................37
11.10.2 使用 GNU gettext 完成 I18N ...........................................................................................38
11.10.3 使用 POSIX catgets 完成 I18N .......................................................................................39
11.11 已知的缺陷.................................................................................................................................. 40
2
11.1 FLUID 是什么
快 速 轻 量 用 户 界 面 设 计 器(Fast Light User-Interface Designer) 或 者 叫
FLUID,是一个用来产生 FLTK 源代码的图形编辑器。FLUID 编辑和保存
它的状态在.fl 文件中。这些文件是文本,所以你可以在文本编辑器中编辑
它们(需要小心处理),可能会收到意想不到的效果。
FLUID 能够编译.fl 文件生成.cxx 和.h 文件。.cxx 文件定义.fl 文件中的所
有的对象而.h 文件声明所有的全局对象。FLUID 也支持标签字符串的本地
化(国际化)使用的是消息文件和 GNU 的 gettext 或者 POSIX 的 catgets 接
口。【译注:这两个应该是程序本地化的工具】。
你可以将所有的代码(包括 main()函数)都放进.fl 文件中生成一个简单
的程序,然后只生成一个用于编译的.cxx 源文件。多数程序要比这复杂得
多,所以你需要写其他的调用 FLUID 函数的 cxx 文件。这些 cxx 文件必须
#include 那些.h 文件或者它们#include 这些 cxx 文件所以它看起来仍然像一
个单独的源文件。
图 11.1 FLUID 的组织结构图
3
一般 FLUID 文件定义一个或多个输出 C++代码的函数或者类。每个函
数定义一个或多个 FLTK 窗口以及在这些窗口中的所有图形构件。
FLUID 创建的构件可以是“命名的(named)”,“复合命名的(complex
named)”或者“未命名的(unnamed)”。一个命名的构件使用一个合法的 C++
变量标示符作为它的名字(也就是数字字母和下划线)。这种情况下 FLUID
在(程序中)调用定义构件的函数之后将定义一个指向该构件的全局变量或
者类成员。一个复合命名对象在名字中有一个’.’或者’->’标点或者其他的符
号,这种情况下 FLUID 将分配一个指向构件名字【??】的指针,但是并
不尝试去声明它。这可用于将构件放入结构体中。一个未命名的构件有一
个空的名字而且没有指针被保存。
构件可以调用一个你在另一个源文件中写得命名回调函数或者你可以
提供一小段 C++源码然后 FLUID 将其生成为一个私有回调函数放入 cxx 文
件中。
11.2 UNIX 下运行 FLUID
要在 UNIX 下运行 FLUID,输入:
Fluid filename.fl &
来编辑名字为 filename.fl 的 fl 文件。如果该文件不存在,将弹出一个错误,
但是如果忽略你将可以编辑一个空的以那个名字命名的文件。你可以不通
过名字运行 FLUID,在这种情况下你可以编辑一个空的设置【??】,但是
你可以使用另存为将其保存到文件中。
你可以在文件名字前使用(以下)任何标准的 FLTK 开关【选项】:
-display host:n.n
4
-geometry WxH+X+Y
-title windowtitle
-name classname
-iconic
-fg color
-bg color
-bg2 color
-scheme schemename
如果用户调用了颜色开关选项那么改变颜色来看看你的界面看起来如何可
能是有用的。类似的,使用”-scheme plastic”将显示使用了”plastic”主题的界
面显示看起来怎么样。
在当前版本中,如果你不使用’&’将 FLUID 作为后台运行,你可以使用
在终端输入 CTRL-C 的方式退出 FLUID。它将立即退出,丢失所有的修改。
11.3 在 Windows 下运行 FLUID
要在 Win32 下运行 FLUID,只需要双击 FLUID.exe 文件就可以了。你
当然也可以通过命令提示符窗口启动。在 Win32 下 FLUID 是在后台运行的。
11.4 编译.fl 文件
FLUID 也可以被用作一个命令行“编译器“来从.fl 文件生成.cxx 和.h 文
件。要这样做,只要输入:
fluid –c filename.fl
该命令将读 filename.fl 文件并且生成 filename.cxx 和 filename.h 文件。所
5
有的 filename.fl 的前缀路径将被去除,所以它们(cxx 和 h)将被写入到当
前目录下。如果读或者写文件时发生错误,FLUID 将打印错误并且以非零
退出码退出。你可以在 makefile 中使用下面的代码来自动化生成源文件和
头文件:
my_panels.h my_panels.cxx: my_panels.fl fluid –c my_panels.fl
大部分版本的 make 都支持编译.fl 的规则:【??】
.SUFFIXES: .fl .cxx .h
.fl.h .fl.cxx:
fluid –c $<
11.5 一个简短的指南
FLUID 是一个令人惊奇的功能强劲的小程序。然而这种功能是有代价
的,那就是它不能完成看起来很简单的任务。该指南将介绍怎样使用 FLUID
生成一个在 CubeView 程序中使用的完整的用户界面类,该 CubeView 程序
是由 FLTK 提供的。
6
图 11.2 CubeView 例子
这个窗口就是类 CubeViewUI,包括所有的类函数在内,所有这些都是
由 FLUID 生成的。立方体的显示中心是一个单独的叫做 CubeView 的
Fl_Gl_Window 的子类。CubeViewUI 通过滑动块和滚轴的回调函数来控制
CubeView 类,从而实现 CubeView 的视角变换和缩放。
在本指南结束时,你将学到如下知识(希望如此):
1、 使用 FLUID 创建一个完整的用户界面类,包括构造函数和任何需要
的成员函数。
2、 使用 FLUID 设置自定义构件类的回调成员函数。
3、 子类化 Fl_Gl_Window 来满足你的需要。
7
11.5.1 CubeView 类
CubeView 类是 Fl_Gl_Window 的子类。该类具有设置缩放,x、y 平移
【摇动镜头??】以及 x、y 轴旋转角的方法。
如果你认识到 CubeView 只是由 FLUID 生成的 Fl_Gl_Window 的一个子
类并且会对 CubeViewUI 的调用产生响应,那么你可以放心的忽略本节。
CubeView 类声明
下面是在头文件 test/CubeView.h 中的 CubeView 的类声明。
class CubeView : public Fl_Gl_Window {
public:
CubeView(int x,int y,int w,int h,const char* l=0);
//这个值决定画立方体的缩放比例
double size;
/*设置垂直轴(y 轴)的旋转。该函数被 CubeViewUI 的水平滚轴和
CubeViewUI 的初始化按钮调用*/
void v_angle(float angle){vAng=angle;};
// 返回垂直轴的旋转角
float v_angle(){return vAng;};
/*设置水平轴(x 轴)的旋转。该函数被 CubeViewUI 的垂直滚轴和
CubeViewUI 的初始化按钮调用*/
void h_angle(float angle){hAng=angle;};
//返回垂直轴的旋转角
float h_angle(){return hAng;};
8