FLTK(Fast Light Tool Kit )是一个轻量级的GUI系统,{BANNED}最佳新的稳定版本是1.1.10,编译下来,fltk.a为836K,加上jpeg ,png,openGL 等,大小也才1.4M .确实很小。
Fltk 主要做控件,对X API的封装,对事件处理很简单 .
Fltk
----------------------------
X Lib
=================================
X Server
但如果是上面的架构的话, Fltk简直是一点用处都没有。为什么这么说呢?因为虽然fltk小,但是X却不小,就算用Tiny X ,X lib + Tiny X也不小。所以如果选择fltk基于X,那就没什么优势了,
人们也许会去选择QT embedded .
Fltk还有一套接口 ,nano-x .
fltk
--------------------------
nano -x
=====================================
micro window
这样构成的GUI系统,非常小,性能也很好。适合很多小系统。
Fltk应用程序的框架 :
Fl_Window * window = new Fl_Window(320,130); //每个App 都有一个主窗口
.....
window->end(); //上面的widget都属于window
window->show(argc,argv); //显示
return Fl::run(); //消息循环,处理消息
在Fltk中画图的三种方法:
1)继承一个Fl_Widget ,然后实现它的draw
2) 对于Box , Label
Box : 存在一个表 fl_box_table[256] 里面定义了每种box的 draw function
可以用Fl::set_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f,uchar a, uchar b, uchar c, uchar d)来设置box的draw function
具体为:
实现了一个 my_box_draw函数
#define MY_BOX FL_FREE_BOXTYPE
然后 Box = new Fl_Box(x,y,w,h,"my box");
Box->box(MY_BOX);
Fl::Set_boxtype(MY_BOX,my_box_draw,....)
注意: 由于fl_box_table是全局的,比如Fl_Window中它的box=1 ,所以对于MY_BOX不要用别的,而用FL_FREE_BOXTYPE, 如果你定义MY_BOX=1 ,则所有的window的draw函数为my_box_draw了
查看Box中的src ,可以发现 Box的draw ()
{
draw_box();
draw_label();
}
而draw_box()除了Fl_No_Box外,其他的调用Fl_Box_Table中的函数来画
对于Label 也一样,可以用Fl::set_labeltype
3) 用make_current(),然后直接画
比如我有一个Button 1 ,按下button 1后,画一红色小框
button1cb(Fl_Widget* w , void* )
{
Fl_Window * window ;
window = w->window();
window->make_current();
fl_color(FL_RED);
fl_rect(100,80,150,80);
}
Fltk的不好之处 :
一 代码比较乱
1)文件名 :
fl_draw.H , Fl.H 有的用小写,fl 有的用大写Fl .
对于头文件,也是如此, 有的用小写 比如gl.h 而有的大写 比如 Enumerations.H
2) 定义了很多枚举 比如 Fl_Align
但在Fl_Widget.h中,
void align(uchar a) {align_ = a;}
为什么不用Fl_Align呢 ? 而用 uchar类型 ?
二 图形界面比较 ugly ,所以要想怎么去修改,变得更漂亮? 用图?
三 对于GIF不支持,相对来说,功能还不够强大,不适合做那些需要丰富界面的消费电子
三 在Fl::run中是无限循环 ,这样占cpu资源
我们项目中用Fltk的情况:
我们曾经有一个项目也用了fltk,{BANNED}最佳终失败。原因是:
1)我们公司在2007年5月开始采用的版本为1.1.3 . 原因是公司的架构师在前一家公司采取的也是这个版本。
现在看来,不一定正确,在1.1.7版本中已经集成了jpeg, png,jpeg也来自open source jpeg6b . 而公司在1.1.3版本上,去实现jpeg,png等库,有点自己造轮子的意味,
而且结果是花了很多时间,效果又不好,后来还是在选GTK平台后,jpeg库才换成open source 的jpeg6b .
2)当时对于项目没有进行一个很好的系统分析
一开始用fltk+x ,后来用fltk+microwindow ,但{BANNED}最佳后发现问题太多,比如自己实现部分的质量问题,fltk的unicode问题。{BANNED}最佳终放弃而转为GTK
事实上,在项目开始前,我对于GUI的选择也提出了一些异议:
1) 在GUI系统中,还有其他的选择,比如qtopia , GTK , MiniGUI ,为什么不选择其他的,而选择fltk ?
2) 选择fltk 1,面临着unicode的问题,可是如果选择fltk 2,fltk 2的正式版本一直没发布过 。
不过我的担忧和建议没有被采纳。这也是当时我linux的知识还不够,导致老板没听我的意见,而采纳了linux专家的建议,{BANNED}最佳后导致项目的被动。
现在看起来,对于当时linux专家的很多观点,比如:
代码: 尽量不加注释 ;文档 尽量simple ;详细设计文档 没有
真想大笑。
结论:
对于很多小系统,可以用fltk + microwindow
对于其他的系统,{BANNED}最佳好别用。用QT embedded 更好。
阅读(4118) | 评论(1) | 转发(0) |