c语言fltk图形库,FLTK编程模型
2003 年 5 月 10 日
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编程的一些基本方法进行介绍。
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作为GUI开发包,包含了常用的图形用户接口需要的一些构件,视觉表现非常丰富,如下两图所示:
常用按钮构件
按钮名称
头文件
按钮名称
头文件
Fl_Button
Fl_Button.H
Fl_Check_Button
Fl_Check_Button.H
Fl_Light_Button
Fl_Light_Button.H
Fl_Repeat_Button
Fl_Repeat_Button.H
Fl_Return_Button
Fl_Return_Button.H
Fl_Round_Button
Fl_Round_Button.H
对于具有Fl_Check_Button、Fl_Loght_Button和Fl_Round_Button当状态为off时value() =0 ,On时value()返回1。
处理按钮时间可以使用回调(callback)函数,参见后面的事件处理。
文本处理构件
构件名称
头文件
构件名称
头文件
Fl_Input
Fl_Input.H
Fl_Output
Fl_Output.H
Fl_Multiline_Input
Fl_Multiline_Input.H
Fl_Multiline_output
Fl_Multiline_output.H
设置和取得文本内容使用value();
如:
(new Fl_Input(x,y,width,height,"Label"))->value("Hello World!");
其他构件
参见FLTK.org的 文档说明。
这些构件是使用C++开发的,具有完善的继承关系,下面是构件继承关系图
构件使用例子-HelloWorld
#include
#include
#include
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]
对于一般构件的如按钮,菜单等常用事件的处理一般可以使用回调函数实现,回调函数的原型是:
void XXX_callback( Fl_Widget *w,void *data )
{
//添加自己处理的内容
}
使用F1_Widget->callback( XXX_callback,data) 注册回调函数
/***************************************************************
按钮事件例子
***************************************************************/
#include
#include
#include
#include
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
#include
#include
#include
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中是通过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_PUSH
FL_ENTER
FL_DRAG
FL_LEAVE
FL_RELEASE
FL_FOCUS
FL_MOVE
FL_UNFOCUS
键盘事件消息
剪贴板事件消息
FL_KEYBOARD
FL_PASTE
FL_SHORTCUT
FL_SELECTIONCLEAR
构件事件消息
FL_DEACTIVATE
FL_ACTIVE
FL_HIDE
FL_SHOW
通过重载handle函数我们可扩充标准构件,下面是一个鼠标移动到上面就改变颜色的按钮的实现源代码。
#include
#include
#include
#include
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 (FLTK UserInteface Designer)是FLTK进行程序界面设计的有力工具,如同GTK界面开发工具Glade一样。
它包含在FLTK源代码中,需要自己编译成可执行文件。在Window平台可以使用VC/BC编译成可执行文件。启动和设计时界面如图所示:
Fluid非常容易使用,首先是新建,输入文件名,后点Bin 窗口的Function 图标,建立main主函数[清空name就可以],然后可以选择window 图标,建立窗口,然后拖放其他构件,可以在双击构件设置构件的属性【如下图】,在GUI属性页中设置标签和快捷键,位置大小,图片,提示,对齐方式等,在style中设置它的显示风格等,在C++中设置名字,书写它的回调函数等。
设计好界面后,我们可以把这些转换为C++源代码,选菜单File中的write Code即可,使用编辑器可以打开与工程同名的源文件和头文件,怎么做,不再赘述。
在FLTK中很容易使用OpenGL进行图形编程的,我们只需要使用它的Fl_Gl_Window构件,重新定义一个派生于Fl_Gl_Window的类,重载draw()和handle()就可以。所需要的代码和步骤如下:
包含以下头文件
#include
#include
#include
定义一个子类,如下代码所示
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. 使用代替头文件,不要使用后者的头文件。
例子程序比较长,附在参考中。运行显示,弹出菜单后如图所示:
在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" [对照修改],此处不修改也可以编译
作为跨平台的一种轻量级的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和他联系。
c语言fltk图形库,FLTK编程模型相关推荐
- C语言网络编程:TCP编程模型
编程模型 TCP编程模型如下 TCP服务器的工作过程如下: 服务器创建一个专门的"文件描述符"来监听来自客户端的"三次握手",然后建立链接 链接建立成功后,服务 ...
- C语言与OpenCL的编程示例比较
C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...
- 英特尔发布oneAPI软件计划及beta产品,面向异构计算提供统一可扩展的编程模型
近日,在2019年超级计算大会上,英特尔发布了一项全新软件行业计划oneAPI,助力充分释放高性能计算与人工智能技术融合时代多架构计算的潜力,同时发布了一个oneAPI beta产品. 英特尔oneA ...
- Silverlight编程模型
Silverlight支持Javascript API编程模型和托管API编程模型这两种编程模型,它们的基本作用都是用于XAML界面文件中的XAML对象,基于托管API编程的XAML应用程序是通过x: ...
- GPU — CUDA 编程模型
目录 文章目录 目录 GPGPU CUDA 编程模型 CUDA 的架构 CUDA 的工作原理 Grid.Block.Thread Warp GPGPU GPU 起初是用来处理图像的,但是后来人们发现其 ...
- mapreduce工作流程_详解MapReduce中的五大编程模型
前言 我们上一节讲了关于 MapReduce 中的应用场景和架构分析,最后还使用了一个CountWord的Demo来进行演示,关于MapReduce的具体操作.如果还不了解的朋友可以看看上篇文章:[初 ...
- 代码解析深度学习系统编程模型:TensorFlow vs. CNTK
from: http://geek.csdn.net/news/detail/62429 CNTK是微软用于搭建深度神经网络的计算网络工具包,此项目已在Github上开源.因为我最近写了关于Tenso ...
- 三种方式实现观察者模式 及 Spring中的事件编程模型
观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...
- 线程/协程/异步的编程模型(CPU利用率为核心)
最近看了一个b站博主的视频https://www.bilibili.com/video/av64066246/讲到了线程/协程/异步的编程模型,这里做下记录 1.线程 上篇文章有聊到进程和线程的关系, ...
- 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)
1.背景-流式计算与storm 2011年在海量数据处理领域,Hadoop是人们津津乐道的技术,Hadoop不仅可以用来存储海量数据,还以用来计算海量数据.因为其高吞吐.高可靠等特点,很多互联网公司都 ...
最新文章
- mysql ls命令,Linux 常用 ls命令详解
- ubuntu gcc安装总结
- NTU 课程笔记: CV6422 regression
- 14门Linux课程,打通你Linux的任督二脉!
- 使用Mybatis-plus更新null字段的解决方案
- 批量激活管理工具VAMT 3.0的安装与基本使用方法简介
- Opencv笔记(二十一)——傅里叶变换
- 洛必达法则及极限问题总结
- 自定义控件ViewGroup上下滑动
- Spring AOP配置 之 @Aspect
- POJ3322(bfs+状态限制)
- JavaScript对象与内置对象——对象(一)
- java计算机毕业设计ssm+vue酒店VIP客户管理系统
- “互联网+可视农业”模式有哪些?
- system call——系统调用
- Arcpy基础入门-3、arcpy创建地理处理工具
- Halide学习笔记----Halide tutorial源码阅读5
- 邓西百度网盘批量分享工具
- 模拟一个类似LinkedList的集合
- 软件全家桶-持续收录中(个人常用软件)
热门文章
- 微积分 --- 以e为底的指数函数(个人学习笔记)
- 【JavaScript】封装对象与强制类型转换
- win10系统安装jdk8全过程
- 软件工程实验报告一软件开发准备及Visio应用
- Java开发手册(嵩山版)
- 计算机无线网络无法连接网络,笔记本连无线网显示无法连接此网络 怎么处理...
- 视频联网云平台EasyCVR集成海康EHome协议系列——Ehome协议调用流程介绍
- 2021年第四届安洵杯WriteUp(转)
- Faster R-CNN算法
- hyperterminal使用教程_Win 7 使用 XP的超级终端 hyper terminal