所有的程序到必须包含头文件<FL/Fl.H>,另外还要包含该程序用到的类的头文件。List 1说明了如何用FLTK显示一个窗口,窗口中显示“Hello World!”
Listing 1 - "hello.cxx"
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
int main(int argc, char **argv) {
Fl_Window *window = new Fl_Window(300,180);
Fl_Box *box = new Fl_Box(20,40,260,100,"Hello, World!");
box->box(FL_UP_BOX);
box->labelsize(36);
box->labelfont(FL_BOLD+FL_ITALIC);
box->labeltype(FL_SHADOW_LABEL);
window->end();
window->show(argc, argv);
return Fl::run();
}
包含了需要的头文件后,该程序创建了一个窗口
Fl_Window *window = new Fl_Window(300,180);
还创建了一个box类,标签是“Hello World!”
Fl_Box *box = new Fl_Box(20,40,260,100,"Hello, World!");
下一步,我们设置了box的类型,大小,字体和标签的类型
box->box(FL_UP_BOX);
box->labelsize(36);
box->labelfont(FL_BOLD+FL_ITALIC);
box->labeltype(FL_SHADOW_LABEL);
最后,我们显示该窗口并进入FLTK 事件循环
window->end();
window->show(argc, argv);
return Fl::run();
运行该程序得到的界面如下,你能直接关闭该窗口退出,也可以按ESC键退出
图2-1 Hello,World! 窗口
创建控件用c++ new 操作符。很多控件的参数都如构造函数中的:
Fl_Widget(x, y, width, height, label)
X ,y 参数决定窗口在屏幕中的位置,在FLTK中,左上角的就是屏幕的原点(x=0,y=0),单位是象素。
Width,height参数是控件或窗口的大小。Label是一个指向标签字符串的指针,也可以为NULL.如若没有特别指定,label默认的NULL.label字符串必须是静态存储的,因为FLTK并不复制她,而只是用他的指针。
Box->box(FL_UP_BOX)设置box的类型。默认的是FL_NO_BOX,意思是什么都不用画。在我们”Hello,World!”例子中,我们使用了FL_UP_BOX,意思是一个突起的方框。
Box->box()是用来得到当前的box 的类型,FLTK用重载来简化Get/Set函数,一个set函数通常用这种形式"void name(type)",而一个Get函数通常用"type name() const".
set/get函数是非常有效率的。但是set函数不需要调用redraw(),你必须使用的时候自己调用它。这将最大的减少代码的大小和执行时间。有两个例外,一个是value()要调用redraw()一个是label()要调用redraw_label(),如果有需要的话。
所有的控件都支持标签。不如说窗口控件,标签被用来作为标题,我们的程序调用了labelfont,labelsize,和labeltype函数。
Labelfont函数设置标签字体的字体类型。比如粗体FL_BOLD,斜体FL_ITALIC等。
Labelsize函数设置字体的大小
Labeltype函数设置标签的样式。FLTK支持normal,embossed,shadowed样式,你也可以自己定义需要的样式,比如我们例子中用的是shadowed样式
show()函数显示控件或窗口。对于窗口来说你还可以通过命令行设置窗口的外观,大小或位置。
与其他GUI一样,FLTK也是基于消息循环。用户产生的事件,比如鼠标移动,按纽点击,键盘活动都被发送给应用程序。应用程序可能会忽略该事件,也可能会对该事件产生响应。比如按纽按下的时候的重画,输入框内容的输入等等。
FLTK同时也支持idle,timer,和file 的模拟事件。当他们发生时会调用某个已经定义好的函数。Idle函数被调用当没有用户输入,也没有定时器发生,也没有文件监听的时候。简而言之,当应用程序不做任何事情的时候调用idle函数。该函数一般用来更新3D显示或做一些后台工作。
当某个定义的时间到时,定时器函数被调用。他可以用来弹出进度的对话筐,或做一些有规律的间歇的事情。FLTK的定时器不是百分之百的准确,所以不能用来等测量时间间隔等比较精确的定时。
File函数在数据已经准备读或写的时候被调用,或者是当文件有错误发生时也被调用,他们通常被用来监视网络连接(sockets).
在NUIX环境下,你需要告诉编译器到哪里去找到头文件,通常用-I选项
CC -I/usr/local/include ...
gcc -I/usr/local/include ...
fltk-config脚本能自动找到头文件,但是你的头文件需要安装在指定的目录下。
CC `fltk-config --cxxflags` ...
同样,当连接你的程序时需要告诉编译器你的FLTK库
CC ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
gcc ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
除了fltk库之外,还有fltk_forms库支持Xforms类,fltk_gl支持OpenGL和GLUT类,fltk_image库支持image文件类,Fl_Help_Dialog控件和系统图标
注意:以上库的名称分别为 "fltk.lib", "fltkgl.lib", "fltkforms.lib", and "fltkimages.lib"
类似,fltk-config脚本也能获得库文件
CC ... `fltk-config --ldflags`
Forms,GL,images库在编译时应该使用”—use-foo”选项。比如:
CC ... `fltk-config --use-forms --ldflags`
CC ... `fltk-config --use-gl --ldflags`
CC ... `fltk-config --use-images --ldflags`
CC ... `fltk-config --use-forms --use-gl --use-images --ldflags`
最后你可以用fltk-config脚本编译一个简单的FLTK程序
fltk-config --compile filename.cpp
fltk-config --use-forms --compile filename.cpp
fltk-config --use-gl --compile filename.cpp
fltk-config --use-images --compile filename.cpp
fltk-config --use-forms --use-gl --use-images --compile filename.cpp
以上的编译将会产生一个可执行文件filename.