我怎样才能在 FLTK 中离开 Fl_Button?

How can I tab away from a Fl_Button in FLTK?

我有一个扩展 Fl_Button 的自定义 class、CustomButton。在我的屏幕上有一堆 Fl_InputCustomButton 小部件,我希望能够使用 Tab 键在它们之间导航。输入字段之间的 Tab 键工作正常,但一旦 CustomButton 获得焦点,我似乎无法离开它。

这是我的句柄函数

int CustomButton::handle ( int event )
{
  int is_event_handled = 0;
  switch (event)
  {
    case FL_KEYBOARD:
      // If the keypress was enter, toggle the button on/off
      if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter)
      {
        // Do stuff...
      }
      is_event_handled = 1;
      break;

    case FL_FOCUS:
    case FL_UNFOCUS:
      // The default Fl_Button handling does not allow Focus/Unfocus
      // for the button so mark the even as handled to skip the Fl_Button processing
      is_event_handled = 1;
      break;

    default:
      is_event_handled = 0;
      break;
  }

  if ( is_event_handled == 1 ) return 1;
  return Fl_Round_Button::handle ( event );
}

我正在使用 fltk 1.1.10。

有关演示如何控制焦点的非常简单、最小的示例,请查看 navigation.cxx 测试文件。

也许您的小部件确实获得了焦点(使用 Fl::focus() 检查),但它没有显示出来(您需要处理 FL_FOCUS and/or FL_UNFOCUS 事件)?

我的问题是我的 CustomButton::handle()FL_KEYBOARD 事件后返回 1 而没有实际使用 Tab 键按下。

is_event_handled = 1 移动到 if 语句中让我仅使用 FL_Enter 按键并让其他小部件(即控制导航的 Fl_Group )接受任何其他按键。

或者删除 if 并替换为

switch(Fl::event_key())
{
    case FL_Enter:
    case FL_KP_Enter:
        // Do stuff
        is_event_handled = 1;
        break;
    default:
        is_event_handled = 0;
        break;
}