FLTK编程模型

FLTK(Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。

FLTK(Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。本文就FLTK编程的一些基本方法进行介绍。

FLTK功能简介

1. 提供丰富的跨平台的GUI构件(Widget)。有按钮,菜单,窗口等,近六十个。

2. 支持OpenGL,提供Fl_GL_Window,支持OpenGL相关的操作。

3. 提供界面设计工具FLUID,非常方便进行界面的设计。

4. 良好的跨平台移植性。

5. 支持多种C++编译器,Gcc,BC,VC等等。

6. 灵活性。FLTK本身可以定制,以满足不同的需要。这使得FLTK在嵌入式开发上有着极大的竞争力,这正是我要推荐使用FLTK的原因。

本文就FLTK编程的一些基本方法进行介绍。





回页首


安装

安装FLTK很简单,我们只需要下载它的源文件,解压缩到目录下,在Linux下我们只需要输入make,编译完成然后make install就头文件安装到/usr/include/FL目录下。库文件就在/usr/lib下,也可以自己编译之后把这些文件复制到这些目录,或者不需要复制,只在编译连接的时候指定路径。

在window下可以使用VC,BC打开相应目录下的工程文件编译即可。





回页首


FLTK构件简介

FLTK作为GUI开发包,包含了常用的图形用户接口需要的一些构件,视觉表现非常丰富,如下两图所示:



常用按钮构件

按钮名称头文件按钮名称头文件
Fl_ButtonFl_Button.HFl_Check_ButtonFl_Check_Button.H
Fl_Light_ButtonFl_Light_Button.HFl_Repeat_ButtonFl_Repeat_Button.H
Fl_Return_ButtonFl_Return_Button.HFl_Round_ButtonFl_Round_Button.H

对于具有Fl_Check_Button、Fl_Loght_Button和Fl_Round_Button当状态为off时value() =0 ,On时value()返回1。

处理按钮时间可以使用回调(callback)函数,参见后面的事件处理。

文本处理构件

构件名称头文件构件名称头文件
Fl_InputFl_Input.HFl_OutputFl_Output.H
Fl_Multiline_InputFl_Multiline_Input.HFl_Multiline_outputFl_Multiline_output.H

设置和取得文本内容使用value();

如:

(new  Fl_Input(x,y,width,height,"Label"))->value("Hello World!");

其他构件

参见FLTK.org的 文档说明。

这些构件是使用C++开发的,具有完善的继承关系,下面是构件继承关系图



构件使用例子-HelloWorld

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
int  main (int argc, char *argv[])
{
    Fl_Window  *window;
    Fl_Box  *box;
window  =  new  Fl_Window (300, 180);
window-> label("HelloWorld!");   //添加window的标题
    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);  //设置label的类型
/***************************************************************
进入FLTK的事件循环处理过程
***************************************************************/
    window->end ();
    window->show (argc, argv);
    return  Fl::run();
}

在window下程序编译运行后如图所示:[使用VC6编译优化后大小为116K]


Linux下图片[编译未优化大小358K]






回页首


FLTK事件处理

对于一般构件的如按钮,菜单等常用事件的处理一般可以使用回调函数实现,回调函数的原型是:

void  XXX_callback( Fl_Widget *w,void *data )
{
//添加自己处理的内容
}

使用F1_Widget->callback( XXX_callback,data) 注册回调函数

/***************************************************************
按钮事件例子
***************************************************************/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_ask.H>
void Btn01_cb(Fl_Widget *w,void *data)
{
 ((Fl_Button *)w)->label((char *)data);
fl_alert("Hello");
 }
int main(int argc, char **argv)
 {
 char *buff ="Hello";
 Fl_Window* w = new Fl_Window(272, 144);
 Fl_Button* Btn01 = new Fl_Button(85, 50, 105, 25, "&Test callback");
 Btn01->shortcut(FL_ALT+'t');               //定义按钮的快捷键
 Btn01->callback((Fl_Callback*)Btn01_cb,buff); //调用处理函数 buff作为参数
 
 w->end();
 w->show(argc, argv);
  return Fl::run();
}

编译运行程序,鼠标点击按钮,按钮标签会发生改变,并且会弹出提示框。

通常的callback是当构件的value改变时调用,可以使用when()改变为其他事件发生调用回调函数,主要事件有以下事件

事件说明
FL_WHEN_NERVER从不调用回调函数
FL_WHEN_CHANGED当构件值改变时调用
FL_WHEN_RELEASE当释放按键或者鼠标并且构件值改变
FL_WHEN_RELEASE_ALWAYS当释放按键或者鼠标,即使构件值没有改变
FL_WHEN_ENTER_KEY按下Enter键并且构件值改变
FL_WHEN_ENTER_KEY_ALWAYS按下Enter键,即使构件值没有改变

通过使用F1_Widget->when(FL_WHEN_XXXX)来改变回调事件。

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_ask.H>
void Btn01_cb(Fl_Widget *w, void *data)
{
  fl_alert("Hello");
 }
int main(int argc, char **argv)
 {
 char *buff = "Hello";
 Fl_Window* w = new Fl_Window(272, 144);
 Fl_Button* Btn01 = new Fl_Button(85, 50, 105, 25, "&Test callback");
 Btn01->shortcut(FL_ALT + 't');
 Btn01->callback((Fl_Callback*) Btn01_cb, buff);
 Btn01->when(FL_WHEN_RELEASE_ALWAYS);
 w->end();
 w->show(argc,  argv);
  return Fl::run();
}

编译运行程序,在按钮上按下鼠标左键,移动到按钮外,松开鼠标按键,仍然会弹出对话框,对比上面的两程序,看看有什么不同。





回页首


FLTK消息处理

在FLTK中是通过Fl_Widegt::handle(),虚拟函数来处理系统的消息。我们可以查看Fltk的源代码来分析系统是怎样处理一些系统消息的,如按钮的消息处理

/*******************************************************
Fl_Button中处理消息的代码,省略了具体的处理代码
*******************************************************/
int Fl_Button::handle(int event) {
switch (event) 
{
case FL_ENTER:
case FL_LEAVE:     return 1;
case FL_PUSH:         ……
case FL_DRAG:        ……
case FL_RELEASE:     ……
case FL_SHORTCUT:   ……
case FL_FOCUS :       ……
case FL_UNFOCUS :    ……
case FL_KEYBOARD :  ……
default:
return 0;
}
}

可以看出了,系统的一些消息,都是在构件的handle()中进行处理的。

系统的主要消息有以下

鼠标事件消息焦点事件消息
FL_PUSHFL_ENTER
FL_DRAGFL_LEAVE
FL_RELEASEFL_FOCUS
FL_MOVEFL_UNFOCUS
键盘事件消息剪贴板事件消息
FL_KEYBOARDFL_PASTE
FL_SHORTCUTFL_SELECTIONCLEAR
 构件事件消息
FL_DEACTIVATEFL_ACTIVE
FL_HIDEFL_SHOW

通过重载handle函数我们可扩充标准构件,下面是一个鼠标移动到上面就改变颜色的按钮的实现源代码。

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/fl_ask.H> 
class EnterButton : public Fl_Button 
{
  int handle(int e)
 {  switch (e)
   {
      case  FL_ENTER:
              color(FL_GREEN);
              labelsize(18); redraw(); 
              return 1;
      case   FL_LEAVE:
             color(FL_GRAY);
             labelsize(18); redraw(); 
             return 1; 
      default:
            return Fl_Button::handle(e);         
}
}
public:  EnterButton(int  x,  int y,  int w, int  h, const char  *l ) 
                        : Fl_Button(x,y,w,h,l) {   }
};
static void  cb(Fl_Widget* s,  void *data)
{
  fl_alert( "Hello World!" );
}
int main(int argc, char **argv) 
{
      Fl_Window* w  =  new  Fl_Window(130, 50);
      EnterButton *eBtn  =  new  EnterButton(25,50,120,25,"HelloWorld");
      eBtn->callback((Fl_Callback*)cb);
      w->end();
      w->show(argc, argv);
      return Fl::run();
}

运行显示效果如图:


Linux下演示[截屏时鼠标没有取到]






回页首


FLUID简介

FLUID (FLTK UserInteface Designer)是FLTK进行程序界面设计的有力工具,如同GTK界面开发工具Glade一样。

它包含在FLTK源代码中,需要自己编译成可执行文件。在Window平台可以使用VC/BC编译成可执行文件。启动和设计时界面如图所示:



Fluid非常容易使用,首先是新建,输入文件名,后点Bin 窗口的Function 图标,建立main主函数[清空name就可以],然后可以选择window 图标,建立窗口,然后拖放其他构件,可以在双击构件设置构件的属性【如下图】,在GUI属性页中设置标签和快捷键,位置大小,图片,提示,对齐方式等,在style中设置它的显示风格等,在C++中设置名字,书写它的回调函数等。


设计好界面后,我们可以把这些转换为C++源代码,选菜单File中的write Code即可,使用编辑器可以打开与工程同名的源文件和头文件,怎么做,不再赘述。





回页首


OpenGL编程

在FLTK中很容易使用OpenGL进行图形编程的,我们只需要使用它的Fl_Gl_Window构件,重新定义一个派生于Fl_Gl_Window的类,重载draw()和handle()就可以。所需要的代码和步骤如下:

包含以下头文件

#include <FL/Fl.H>
#include <FL/gl.h>
#include <FL/Fl_Gl_Window.H>

定义一个子类,如下代码所示

class MYGLWindow : public Fl_Gl_Window
{
	void draw(); //作图操作
    void handle( int ); //消息事件处理
	public : 
		MYGLWindow(int x,int y,int w,int h,const char *L) : Fl_Gl_Window(x,y,w,h,L){};
};

实现draw()事件

void MYGLWindow::draw() //作图
{
	if ( ! valid() )
		{
          //设置viewport窗口大小等等 例如
        /********************************************** 
valid(1);
        glLoadIdentity();
        glViewport(0,0,w(),h());
        ***********************************************/
		}
	   //添加使用OPENGL作图操作 
	  /* ……..*/
};

事件处理实现

void MYGLWindow::handle( int event) //事件处理
{  switch (event)
 {  case FL_PUSH :  //操作等
                return 1;
    case …….
}
}

注意

1. 编译时需要包含openGL32的库文件,名字在不同的平台名字稍微不同。

2. 使用<FL/gl.h>代替<GL/gl.h>头文件,不要使用后者的头文件。

例子程序比较长,附在参考中。运行显示,弹出菜单后如图所示:






回页首


VC中使用FLTK

在Vc中无法直接使用FLTK,需要下载FLTK的源文件编译之后再进行一些简单的设置,设置步骤如下:

1. 打开Project->Settings->Link, 添加以下库文件:
wsock32.lib opengl32.lib glu32.lib fltk.lib fltkgl.lib
[fltk.lib fltkgl.lib 需要自己编译FLTK源文件生成,直接打开源文件下的visualc目录下的工程文件就可以编译]

2. 在Project->Settings->Link的PROJECT OPTIONS中 添加 /nodefaultlib:"LIBCD",如果你要生成release版本的那么是 /nodefaultlib:"LIBC"

3. 在Tools->Options->Directories, 选择 include files 添加路径如
C:/Program Files/fltk [对照自己的修改]

4. 在Tools->Options->Directories, 选择 library files 设定为如下所示
C:/Program Files/fltk/lib [对照自己的修改]

5. Project->Settings->C/C++ 中的category 选择 C++ Language

6. 在Project->Settings->C/C++,的PROJECT OPTIONS添加:
/I "c:/program files/fltk" [对照修改],此处不修改也可以编译





回页首


KDevelop中使用FLTK

作为跨平台的一种轻量级的GUI Tools,在Linux下得到更为广泛的使用,所以我们使用Linux下的最常用的Kdevelop也能很方便使用它。下面简述需要注意的配置步骤:

1. 我们建立C++工程后,需要修改的配置都在菜单[项目]-->[选项]'[连接器选项]中修改

2. 在[库]中选定 X11和Xext,根据自己的需要还需要选定 math等库

3. 在[附加库]那里输入 -L/usr/X11R6/lib -lfltk

4. 如果开发OpenGL应用需要 在附加库中输入 -lfltk_gl -lglut 指定连接库。


提示:因为我使用的Linux为RedHat 8,为选择中文环境,所以配置说明也是中文,英文版本可能有所不同,对照修改即可.



参考资料

1. 想了解更多的FLTK的知识和下载FLTK源代码等可以到 www.fltk.org 网站。 FLTK的编程手册你想了解FLTK构件的事件方法等都在里面。OpenGL

2. 还是参考一下 www.opengl.org上的资料吧,有文档说明还有教学和源代码。



关于作者

 

左锦,就职南沙资讯科技园,喜爱 Linux,Java 还有蓝天白云青山绿水。通过 zuo170@163.com和他联系。


 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值