Chinaunix首页 | 论坛 | 博客
  • 博客访问: 521551
  • 博文数量: 237
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-05 22:02
个人简介

目前在一家公司担任软件总监,主要涉及智能手机,笔记本电脑的开发

文章分类

全部博文(237)

文章存档

2024年(18)

2023年(68)

2022年(13)

2021年(7)

2020年(11)

2019年(3)

2018年(10)

2017年(8)

2012年(7)

2011年(4)

2010年(32)

2009年(41)

2008年(6)

2007年(9)

分类: LINUX

2010-03-21 23:49:23

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 更好。
 
 
阅读(4099) | 评论(1) | 转发(0) |
0

上一篇:ffmpeg及其wma解码

下一篇:C#学习笔记

给主人留下些什么吧!~~

chinaunix网友2010-07-28 09:04:44

请问哪一个GUI系统最后没有一个无限循环, 图形界面比较 ugly ,所以要想怎么去修改,变得更漂亮? 用图? 贴图是一个方便和灵活的方式,只要用得好,GTK难道提供了很多丰富漂亮的界面吗,如果有,那可能也是第三方提供的,MiniGUI也提供基本的窗口管理,然后给点扩展控件,不会上来把控件做的很漂亮,那未必符合你的需求