fltk教程01-基础

==========20090511更新======================

#include <fltk/Window.h>
#include <fltk/Widget.h>
#include <fltk/run.h>

using namespace fltk;

int main(int argc, char **argv)
{
Window *window = new Window(300, 180);
window->begin();
Widget *box = new Widget(20, 40, 260, 100, "Hello, World!");
box->box(
UP_BOX);
box->labelfont(HELVETICA_BOLD_ITALIC);
box->labelsize(36);
box->labeltype(SHADOW_LABEL);
window->end();
window->show(argc, argv);
return
run();
}


代码更新详细说明参见 fltk2.0更新简介

(1)创建窗口
fltk::Window类,派生于fltk::Group类,该类代表一个窗口,可以是主窗口,有边框、标题栏、窗口控制等等,也可以是一个子窗口

构造函数为
fltk::Window( int X, int Y, int W, int H, const char *I=0, bool begin=false ); // 一般用于创建子窗口
fltk::Window( int W, int H, const char *I=0 ); // 一般用于创建主窗口,它并不指定窗口在屏幕上的坐标,而是由窗口系统选择。
// 如果需要指定主窗口位置,在调用show()方法之前调用position(x,y)或hotspot()函数.

(2)创建widget层次——begin()与end()
需要显示的调用Group::begin()和Group::end()来建立widget的层次.在该代码块之间创建的widget都属于Group的子窗口.

(3)创建widget
fltk::Widget类,派生于fltk::Rectangle,他是所有widget的基类。忽略所有的事件,仅绘制一个box和label。
构造函数为
fltk::Widget( int X, int Y, int W, int H, const char *L=0 );

(4)设置/读取widget属性(见后)

(5)显示窗口
Window::show()函数用于显示窗口。
对于子窗口(有父窗口),仅显示子窗口本身;
对于外部窗口(无父窗口),显示窗口到屏幕上,最小化或被遮挡的窗口将显示在顶部。
Window::show()和Widget::show()有区别:前者将显示正常窗口,后者仅取消windget的隐藏状态,而不改变其显示状态如图标状态。二者可以重复调用。

(6)主循环 int fltk::run()
只要有窗口存在就可调用该函数,一旦所有的窗口都被销毁或隐藏掉了,则该函数返回0。可用函数Window::first()是否返回null来判断有无窗口存在。
================= 更新20090511结束====================

先看一个简单的fltk程序

#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();
}

1. 创建widget(widget在这里怎么翻译阿?高手指点下)
widget用new操作符创建,大部分widget类的构造器如下
Fl_Widget(x, y, width, height, label);

x,y:widget在屏幕上的坐标,右上角(0, 0),单位像素
width,height:widget的大小,单位像素
label:字符串指针,可以为NULL。该指针必须指向一个静态变量(fltk不拷贝指针内容)

2. 创建widget层次(hierarchies)
多个widget一般依据其功能进行组合,而且组合本身还能被再次组合,由此形成一个widget的层次结构。
填充一个组合很简单,所有在myGroup->Begin()和MyGroup->End()函数调用之间创建的Widget都被自动加入到该组合中(myGroup)。
新创建的widget组合及其派生类(如Fl_Window)在其构造函数中隐式调用了Begin()函数,因此其后创建的Widget自动加入了该组合中,知道End()函数被调用为止。
可以使用 Fl_Group::add()  Fl_Group::insert()函数手动地向组合添加Widget。

3. Set/Get方法
FLTK采用重载的函数来实现SetXXX()和GetXXX()方法。如果需要设置某项属性(如box->box(FL_UP_BOX)设置box的属性为FL_UP_BOX),如果需要读取属性,则只需要调用无参数的重载函数即可(box->box()返回值为FL_UP_BOX)。

4. 更改属性之后需要手动进行重绘
Set/Get方法都采用inline函数,执行效率高,而且Set方法并不调用redraw()函数以重绘窗口,需要手动地调用它才能实现窗口重绘。
例外情况是:value()方法自动调用redraw()函数;label()方法自动调用redraw_label()函数。

5. 标签Label
所有的widget都支持标签。window widget的标签绘制在标题栏中。与标签相关的函数有labelfont(), labelsize(), labeltype()等。

6. 显示窗口
show()方法用于显示widget窗口。

7. 主事件循环
与其他GUI一样,FLTK也是基于事件处理模型的(类似于windows消息处理)。用户产生的事件,比如鼠标移动,按纽点击,键盘活动都被发送给应用程序。应用程序可能会忽略该事件,也可能会对该事件产生响应。比如按纽按下的时候的重画,输入框内容的输入等等。
FLTK同时也支持空闲(idle),定时器(timer),和文件(file) 等伪事件(pseudo-event)。例如:
当没有用户输入,没有定时器事件发生,也没有文件处理时,Idel函数被调用。简而言之,当应用程序不做任何事情的时候调用idle函数。该函数一般用来刷新3D显示或做一些后台工作。
当某个定义的时间到时,定时器函数被调用。他可以用来弹出进度的对话筐,或做一些有规律的间歇的事情。FLTK的定时器不是百分之百的准确,所以不能用来等测量时间间隔等比较精确的定时。
File函数在数据已经准备读或写的时候被调用,或者是当文件有错误发生时也被调用,他们通常被用来监视网络连接

FLTK程序必须周期性地循环调用Fl::check()或Fl::wait()函数来检查或等待事件的发生,也可以使用Fl::run()函数进入一个标准的事件处理循环。直到所有的窗口都被关闭run()函数才返回。

 

posted on 2012-05-23 09:28  龙猫先生  阅读(1137)  评论(0编辑  收藏  举报

导航