1.4FLTK事件处理

对于一般构件的如按钮,菜单等常用事件的处理一般可以使用回调函数实现,回调函数的原型是:

void  XXX_callback( Fl_Widget *w,void *data )
{
    //添加自己处理的内容
}

使用F1_Widget->callback( XXX_callback, data) 注册回调函数

/***************************************************************
按钮事件例子
***************************************************************/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_ask.H>

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 <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_ask.H>

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

编译运行程序,在按钮上按下鼠标左键,移动到按钮外,松开鼠标按键,仍然会弹出对话框,对比上面的两程序,看看有什么不同。