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 回调的主要内容,如果未能解决你的问题,请参考以下文章

Hive if(表达式,true时的结果,非true时的结果)

浅谈青年在选择职业时的考虑

推送时的 Git 本地提交时间戳

FlinkFlink运行时的架构

构建WebGL目标时的内存考量

注入 asyncReducers 时的 preloadedState