Fl_Tree FL_WHEN_RELEASE 回调

Fl_Tree callback when FL_WHEN_RELEASE

documentation for Fl_Tree in FLTK 1.3.4 说:

The callback() is invoked depending on the value of when()

  • FL_WHEN_RELEASE -- callback invoked when left mouse button is released on an item
  • FL_WHEN_CHANGED -- callback invoked when left mouse changes selection state

但如果松开鼠标,我无法调用回调,而且我看不出两者之间的区别。有什么想法吗?

#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,此代码段也会在每次更改时输出 "callback"。

如果您下载了发行版,请查看 test/input.cxx 和 test/tree.cxx。两者都有针对不同选择时的测试。

WHEN_CHANGED 仅对编辑框、浏览器和表格有意义 - 您可以在输入时验证数据。WHEN_RELEASE 不会发生这种情况。对于所有其他小部件,几乎没有区别。

编辑

为了每次都触发释放,有以下三个选项之一

  1. 修改来源FL_Tree.cxx。寻找 FL_Tree::select。将 alreadySelected 更改为 false。
  2. 如果您查看源代码,在同一个例程中,再往下看,它说

    #if FLTK_ABI_VERSION >= 10301
    

    如果库是在 FLTK_ABI_VERSION 设置为 10301 的情况下构建的,它将调用重新选择,但是当设置此 #define 时它​​还会执行大量其他操作,因为它会影响所有小部件

  3. 注释掉FL_Tree::select中的#if FLTK_ABI_VERISON和对应的#endif。