FL_WHEN_RELEASE 时的 Fl_Tree 回调
Posted
技术标签:
【中文标题】FL_WHEN_RELEASE 时的 Fl_Tree 回调【英文标题】:Fl_Tree callback when FL_WHEN_RELEASE 【发布时间】:2017-09-15 14:13:39 【问题描述】:documentation for Fl_Tree in FLTK 1.3.4 说:
根据when()的值调用callback()
FL_WHEN_RELEASE -- 鼠标左键在项目上释放时调用的回调 FL_WHEN_CHANGED -- 鼠标左键更改选择状态时调用回调
但是如果鼠标被释放,我无法调用回调,并且我看不出两者之间的区别。有什么想法吗?
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Tree.H>
static void cb_(Fl_Tree*, void*)
printf ("callback\n");
int main()
Fl_Double_Window* w = new Fl_Double_Window(325, 325);
Fl_Tree* o = new Fl_Tree(25, 25, 255, 245);
o->callback((Fl_Callback*)cb_);
o->when(FL_WHEN_RELEASE);
o->add("foo/bar");
o->add("foo/baz");
o->end();
w->show();
return Fl::run();
即使设置了 FL_WHEN_RELEASE,此 sn-ps 也会在每次更改时输出“回调”。
【问题讨论】:
【参考方案1】:如果你已经下载了发行版,请查看 test/input.cxx 和 test/tree.cxx。两者都有针对不同选择时的测试。
WHEN_CHANGED 仅对编辑框、浏览器和表格有意义 - 您可以在输入数据时验证数据。WHEN_RELEASE 不会发生这种情况。对于所有其他小部件,几乎没有区别。
编辑
为了每次都触发释放,有以下三个选项之一
-
修改源 FL_Tree.cxx。寻找 FL_Tree::select。将 alreadySelected 更改为 false。
如果您查看源代码,在同一例程中,再往下看,它会说
#if FLTK_ABI_VERSION >= 10301
如果库是在 FLTK_ABI_VERSION 设置为 10301 的情况下构建的,它将调用重新选择,但是当设置此 #define 时它还会执行大量其他操作,因为它会影响所有小部件
注释掉 FL_Tree::select 中的#if FLTK_ABI_VERISON 和对应的#endif。
【讨论】:
我应该提到我也尝试过测试/树示例。所以你说这里的文档是错误的?它清楚地表明 FL_WHEN_RELEASE -- 当鼠标左键在一个项目上释放时调用回调 它们都是正确的——这只是上下文。在树视图中,不能部分选择项目,因此更改和释放具有相同的行为。在编辑框上,可以部分选择项目,因此它们具有不同的行为。 但是在 Fl_Tree 上,如果单击已选择的项目确实会有所不同。如果之前选择了另一个项目,我希望 FL_WHEN_CHANGED 回调(因为选择已更改)。但是,如果再次单击已选择的项目,我希望回调 FL_WHEN_RELEASE @Andy - 我添加了改变行为的选项 一个关键点是 ABI 1.3.1 引入的新方法item_reselect_mode(FL_TREE_SELECTABLE_ALWAYS)
以上是关于FL_WHEN_RELEASE 时的 Fl_Tree 回调的主要内容,如果未能解决你的问题,请参考以下文章