4.4画控件

当FLTK需要重画控件时将调用虚拟函数draw().只有在damage()返回非0值时调用该函数,draw()返回后,damage()被清0。Draw()应该被声明为保护成员函数,避免在不需要写画图代码时用到。

Damage()将包含从最后一次调用draw()后damage(n)调用产生的所有与或位信息,根据该信息只重画需要重画的位置,只有FLTK认为需要全部重画时才打开FL_DAMAGE_ALL位,比如收到expose事件。

修改控件的尺寸

resize(int x,int y,int w,int h)在控件被移动和改变大小时被调用,这些参数分别是新位置,宽度和高度。但是x(),y(),w(),h(),还是以前的值,若要改变这些值,必须在基类中也调用resize()函数

不需要调用redraw()函数,至少只改变x(),y()时不需要,因为一个组合控件有一套更有效的方法来画新的位置

如何制作一个组合控件

一个组合控件包括一个或多个子控件。制作组合控件必须继承Fl_Group类.不继承Fl_Group类当然也可能可以制作一个组合控件,但是你还是要重新写Fl_Group类里面的工作

子控件可能在类里面声明

class MyClass : public Fl_Group
{
    Fl_Button the_button;
    Fl_Slider the_slider;
    ...
};

构造函数要初始化这些子控件。他们将被自动的add()到group中。因为Fl_Group构造函数调用了begin().在构造函数中不要忘记调用end()函数

MyClass::MyClass(int x, int y, int w, int h) :
Fl_Group(x, y, w, h),
the_button(x + 5, y + 5, 100, 20),
the_slider(x, y + 50, w, 20)
{
    ...(you could add dynamically created child widgets here)...
    end(); // don't forget to do this!
}