第一章FLTK编程模型1.1FLTK功能简介1.2搭建FLTK开发环境1.21windows下搭建FLTK开发环境1.22ubuntu下搭建FLTK开发环境1.3FLTK构件简介1.4FLTK事件处理1.5FLTK消息处理1.6OpenGL编程第二章常用的控件和属性2.1按钮2.2文本2.3颜色2.4Box类型第三章FLTK的画图函数3.1何时可以画图3.2FLTK的画图函数3.3剪切3.4颜色3.5设置线条的属性3.6画一般的图形函数3.7画封闭的线,一次连接个顶点3.8画三边形或四边形,并填充内部3.9复杂图形函数3.10字体3.11覆盖画图函数第四章在FLTK中自定义控件4.1定制图形控件说明4.2如何开发一个控件的子类4.3处理事件4.4画控件第一章:FLTK编程模型FLTK(FastLightToolKit发音为fulltick)是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。FLTK(FastLightToolKit发音为fulltick)是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。本文就FLTK编程的一些基本方法进行介绍。1.1FLTK功能简介(1)提供丰富的跨平台的GUI构件(Widget)。有按钮,菜单,窗口等,近六十个。(2)支持OpenGL,提供Fl_GL_Window,支持OpenGL相关的操作。(3)提供界面设计工具FLUID,非常方便进行界面的设计。(4)良好的跨平台移植性。(5)支持多种C++编译器,Gcc,BC,VC等等。(6)灵活性。FLTK本身可以定制,以满足不同的需要。这使得FLTK在嵌入式开发上有着极大的竞争力,这正是我要推荐使用FLTK的原因。本文就FLTK编程的一些基本方法进行介绍.1.2搭建FLTK开发环境安装FLTK很简单,我们只需要下载它的源文件,解压缩到目录下,在Linux下我们只需要输入make,编译完成然后makeinstall就头文件安装到/usr/include/FL目录下。库文件就在/usr/lib下,也可以自己编译之后把这些文件复制到这些目录,或者不需要复制,只在编译连接的时候指定路径。在window下可以使用VC,BC打开相应目录下的工程文件编译即可。1.21windows下搭建FLTK开发环境第一步:下载FLTK源码包FLTK官网:下载后解压缩到C盘根目录下,命名为FLTK进到C:\FLTK\ide\visualc目录下,找到fltk.dsw用VisualC++6.0打开项目,然后选择【组建】--全部重建,就开始编译了编译完成后关闭VisualC++6.0第二步:添加FTLK库文件(1)重新打开VisualC++6.0,新建一个Win32Application项目,命名为FLTK,然后再新建一个hello.cxx文件(2)建立好之后选择【工程】-【设置】--选择“连接”选项卡--“分类”下拉框选择输入,在对象/库模块添加:fltkd.libfltkgld.libcomctl32.libwsock32.libopengl32.libglu32.lib还要在忽略库中添加:LIBCDlibcd.lib(3)之后选择“C/C++选项卡,分类”下拉框选择:codegeneration,在“userun-timelibrary中选择”Multi-threadedDLL“最后确定。(4)选择【工具】--【选项】--》目录选项卡在”目录“下拉框中选择IncludeFiles然后新增一项C:\FLTK(导入头文件)(5)在“目录“下拉框中选择LibraryFiles”然后新增一项C:\FLTK(导入类库)(6)编译运行hello.cxx1.22ubuntu下搭建FLTK开发环境第一步:配置基础开发环境GCCxhy@xhy-desktop:~$sudoapt-getinstallbuild-essential第二步:安装QT开发环境xhy@xhy-desktop:~$sudoapt-getinstallqt4-dev-toolsqt4-docqt4-qtconfigqt4-demosqt4-designer第三步:下载FLTK源码包FLTK官网:下载后解压缩:xhy@xhy-desktop:~$sudotarzxvfFLTK.tar.gz第四步:编译安装FLTKxhy@xhy-desktop:~$cdFLTKxhy@xhy-desktop:~$makexhy@xhy-desktop:~$sudomakeinstall第五步:测试环境写一个简单的FLTK程序#includeFL/Fl.H#includeFL/Fl_Window.H#includeFL/Fl_Box.Hintmain(intargc,char**argv){Fl_Window*window=newFl_Window(300,180);Fl_Box*box=newFl_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);returnFl::run();}包含了需要的头文件后,该程序创建了一个窗口Fl_Window*window=newFl_Window(300,180);还创建了一个box类,标签是“HelloWorld!”Fl_Box*box=newFl_Box(20,40,260,100,Hello,World!);下一步,我们设置了box的类型,大小,字体和标签的类型box-box(FL_UP_BOX);box-labelsize(36);1.3FLTK构件简介FLTK作为GUI开发包,包含了常用的图形用户接口需要的一些构件,视觉表现非常丰富,如下两图所示:常用按钮构件按钮名称头文件按钮名称头文件Fl_ButtonFl_Button.HFl_Check_ButtonFl_Check_Button.HFl_Light_ButtonFl_Light_Button.HFl_Repeat_ButtonFl_Repeat_Button.HFl_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.HFl_Multiline_InputFl_Multiline_Input.HFl_Multiline_outputFl_Multiline_output.H设置和取得文本内容使用value();如:(newFl_Input(x,y,width,height,Label))-value(HelloWorld!);其他构件参见FLTK.org的文档说明。写一个简单的FLTK程序#includeFL/Fl.H#includeFL/Fl_Window.H#includeFL/Fl_Box.Hintmain(intargc,char**argv){Fl_Window*window=newFl_Window(300,180);Fl_Box*box=newFl_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);returnFl::run();}包含了需要的头文件后,该程序创建了一个窗口Fl_Window*window=newFl_Window(300,180);还创建了一个box类,标签是“HelloWorld!”Fl_Box*box=newFl_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);returnFl::run();运行该程序得到的界面如下,你能直接关闭该窗口退出,也可以按ESC键退出1.4FLTK事件处理对于一般构件的如按钮,菜单等常用事件的处理一般可以使用回调函数实现,回调函数的原型是:voidXXX_callback(Fl_Widget*w,void*data){//添加自己处理的内容}使用F1_Widget-callback(XXX_callback,data)注册回调函数/***************************************************************按钮事件例子***************************************************************/#includeFL/Fl.H#includeFL/Fl_Window.H#includeFL/Fl_Button.H#includeFL/Fl_ask.HvoidBtn01_cb(Fl_Widget*w,void*data){((Fl_Button*)w)-label((char*)data);fl_alert(Hello);}intmain(intargc,char**argv){char*buff=Hello;Fl_Window*w=newFl_Window(272,144);Fl_Button*Btn01=newFl_Button(85,50,105,25,&Testcallback);Btn01-shortcut(FL_ALT+'t');//定义按钮的快捷键Btn01-callback((Fl_Callback*)Btn01_cb,buff);//调用处理函数buff作为参数w-end();w-show(argc,argv);returnFl::run();}编译运行程序,鼠标点击按钮,按钮标签会发生改变,并且会弹出提示框。通常的callback是当构件的value改变时调用,可以使用when()改变为其他事件发生调用回调函数,主要事件有以下事件事件说明FL_WHEN_NERVER从不调用回调函数FL_WHEN_CHANGED当构件值改变时调用FL_WHEN_RELEASE当释放按键或者鼠标并且构件值改变FL_WHEN_RELEASE_ALWAYS当释放按键或者鼠标,即使构件值没有改变FL_WHEN_ENTER_KEY按下