第一章 开始编写FLTK程序

写一个简单的fltk程序

所有的程序到必须包含头文件<FL/Fl.H>,另外还要包含该程序用到的类的头文件。List 1说明了如何用FLTK显示一个窗口,窗口中显示“Hello World!

Listing 1 - "hello.cxx"

#include <FL/Fl.H>

#include <FL/Fl_Window.H>

#include <FL/Fl_Box.H>

 

int main(int argc, char **argv) {

  Fl_Window *window = new Fl_Window(300,180);

  Fl_Box *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);

  window->end();

  window->show(argc, argv);

  return Fl::run();

}

包含了需要的头文件后,该程序创建了一个窗口

Fl_Window *window = new Fl_Window(300,180);

还创建了一个box类,标签是“Hello World!

Fl_Box *box = new Fl_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);

  return Fl::run();

运行该程序得到的界面如下,你能直接关闭该窗口退出,也可以按ESC键退出

 

 

 

 

 

 

2-1  Hello,World! 窗口

 

创建控件

创建控件用c++ new 操作符。很多控件的参数都如构造函数中的:

Fl_Widget(x, y, width, height, label)

X ,y 参数决定窗口在屏幕中的位置,在FLTK中,左上角的就是屏幕的原点(x=0,y=0,单位是象素。

Width,height参数是控件或窗口的大小。Label是一个指向标签字符串的指针,也可以为NULL.如若没有特别指定,label默认的NULL.label字符串必须是静态存储的,因为FLTK并不复制她,而只是用他的指针。

Get/Set函数

Box->box(FL_UP_BOX)设置box的类型。默认的是FL_NO_BOX,意思是什么都不用画。在我们”Hello,World!”例子中,我们使用了FL_UP_BOX,意思是一个突起的方框。

Box->box()是用来得到当前的box 的类型,FLTK用重载来简化Get/Set函数,一个set函数通常用这种形式"void name(type)",而一个Get函数通常用"type name() const".

改变属性后重画

set/get函数是非常有效率的。但是set函数不需要调用redraw(),你必须使用的时候自己调用它。这将最大的减少代码的大小和执行时间。有两个例外,一个是value()要调用redraw()一个是label()要调用redraw_label(),如果有需要的话。

标签

所有的控件都支持标签。不如说窗口控件,标签被用来作为标题,我们的程序调用了labelfont,labelsize,labeltype函数。

Labelfont函数设置标签字体的字体类型。比如粗体FL_BOLD,斜体FL_ITALIC等。

Labelsize函数设置字体的大小

Labeltype函数设置标签的样式。FLTK支持normal,embossed,shadowed样式,你也可以自己定义需要的样式,比如我们例子中用的是shadowed样式

显示窗口

show()函数显示控件或窗口。对于窗口来说你还可以通过命令行设置窗口的外观,大小或位置。

主事件循环

与其他GUI一样,FLTK也是基于消息循环。用户产生的事件,比如鼠标移动,按纽点击,键盘活动都被发送给应用程序。应用程序可能会忽略该事件,也可能会对该事件产生响应。比如按纽按下的时候的重画,输入框内容的输入等等。

FLTK同时也支持idle,timer,file 的模拟事件。当他们发生时会调用某个已经定义好的函数。Idle函数被调用当没有用户输入,也没有定时器发生,也没有文件监听的时候。简而言之,当应用程序不做任何事情的时候调用idle函数。该函数一般用来更新3D显示或做一些后台工作。

当某个定义的时间到时,定时器函数被调用。他可以用来弹出进度的对话筐,或做一些有规律的间歇的事情。FLTK的定时器不是百分之百的准确,所以不能用来等测量时间间隔等比较精确的定时。

File函数在数据已经准备读或写的时候被调用,或者是当文件有错误发生时也被调用,他们通常被用来监视网络连接(sockets.

用标准的编译器编译程序

NUIX环境下,你需要告诉编译器到哪里去找到头文件,通常用-I选项

CC -I/usr/local/include ...

gcc -I/usr/local/include ...

 

fltk-config脚本能自动找到头文件,但是你的头文件需要安装在指定的目录下。

CC `fltk-config --cxxflags` ...

同样,当连接你的程序时需要告诉编译器你的FLTK

CC ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
gcc ... -L/usr/local/lib -lfltk -lXext -lX11 -lm

除了fltk库之外,还有fltk_forms库支持Xforms类,fltk_gl支持OpenGLGLUT类,fltk_image库支持image文件类,Fl_Help_Dialog控件和系统图标

注意:以上库的名称分别为 "fltk.lib", "fltkgl.lib", "fltkforms.lib", and "fltkimages.lib"

类似,fltk-config脚本也能获得库文件

CC ... `fltk-config --ldflags`

Forms,GL,images库在编译时应该使用”—use-foo”选项。比如:

CC ... `fltk-config --use-forms --ldflags`
CC ... `fltk-config --use-gl --ldflags`
CC ... `fltk-config --use-images --ldflags`
CC ... `fltk-config --use-forms --use-gl --use-images --ldflags`

最后你可以用fltk-config脚本编译一个简单的FLTK程序

fltk-config --compile filename.cpp
fltk-config --use-forms --compile filename.cpp
fltk-config --use-gl --compile filename.cpp
fltk-config --use-images --compile filename.cpp
fltk-config --use-forms --use-gl --use-images --compile filename.cpp

以上的编译将会产生一个可执行文件filename.

你可能感兴趣的:(第一章 开始编写FLTK程序)