企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 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(); } ``` 编译运行程序,在按钮上按下鼠标左键,移动到按钮外,松开鼠标按键,仍然会弹出对话框,对比上面的两程序,看看有什么不同。