1.4FLTK事件处理
优质
小牛编辑
141浏览
2023-12-01
对于一般构件的如按钮,菜单等常用事件的处理一般可以使用回调函数实现,回调函数的原型是:
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();
}
编译运行程序,在按钮上按下鼠标左键,移动到按钮外,松开鼠标按键,仍然会弹出对话框,对比上面的两程序,看看有什么不同。