首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FLTK: Fl_Value_Input子类不接收FL_KEYDOWN事件(仅FL_KEYUP)

FLTK: Fl_Value_Input子类不接收FL_KEYDOWN事件(仅FL_KEYUP)
EN

Stack Overflow用户
提问于 2016-10-27 20:01:40
回答 2查看 289关注 0票数 0

我对FL_Value_Input进行了子类化,这样当小部件被修改时,我可以给它一个颜色,但是用户还没有按enter键。

愚蠢的是,在事件是FL_KEYDOWN事件的情况下,handle(int e)函数永远不会被调用,其他事件(如FL_KEYUPFL_DRAGFL_FOCUS等)会被很好地传播。

小部件是小部件层次结构的一部分...会不会是这个层次结构中的某个父级正在吸收这个特定的FL_KEYDOWN事件?

编辑:显然,这个小部件也没有焦点(通过比较thisFl::focus()进行了测试),这很奇怪,因为我正在输入它。

任何帮助都将不胜感激。

代码语言:javascript
运行
复制
Fx_Value_Input::Fx_Value_Input(int x, int y, int w, int h, const char* l)
: Fl_Value_Input(x, y, w, h, l)
{}

int Fx_Value_Input::handle(int e)
{
    int r = Fl_Value_Input::handle(e);

    if (e == FL_KEYBOARD)
    {
            if ((Fl::event_key() != FL_Enter && Fl::event_key() != FL_KP_Enter ) )
                    color(Fx::get_modified_color());
            else if ((Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter) &&             color() == Fx::get_modified_color())
                    color(FL_WHITE);
            redraw();
        }

    return r;
}
EN

回答 2

Stack Overflow用户

发布于 2016-10-29 02:55:46

使用FL_KEYDOWN是Windows的工作方式,正如你已经发现的,这是不起作用的,因为你需要子类Fl_Input_:而不是Fl_Input,即使那样,它也不能正常工作。

而应使用when(FL_WHEN_CHANGED|FL_WHEN_ENTER_KEY)。选中changed()和clear_changed()。按enter键时不会设置。当满足该条件时,可以将颜色改回原来的颜色。

代码语言:javascript
运行
复制
inputkey = new Fl_Input...
inputkey->when(FL_WHEN_CHANGED| FL_WHEN_ENTER_KEY);
inputkey->callback(cb);
....

void cb(Fl_Widget *ob)
{
   Fl_Input* ip = dynamic_cast<Fl_Input*>(ob);
   if (ip->changed())
   {
       // change colour
       ip->clear_changed();
   }
   else
   {
      // change colour
   }
}
票数 1
EN

Stack Overflow用户

发布于 2016-10-28 18:57:14

FLTK Google group上得到了回复,解释了这个问题...这个问题没有简单的变通办法……

FLTK直接向focus小部件传递键击。Fl_Value_Input包括一个Fl_Input小部件,当您在输入字段中单击时,该小部件将成为焦点小部件。

因此,“父”Fl_Value_Input永远不会看到Fl_KEYDOWN事件。请注意,我引用了"parent“,因为Fl_Value_Input是一个非常特殊的情况。它不是从Fl_Group派生的,但是它的行为有点像Fl_Group小部件。

那么,为什么您的派生小部件要使用FL_KEYUP事件呢?这是FLTK的另一个特性: FL_KEYUP事件首先也会传递给focus小部件。然而,AFAICT没有核心FLTK小部件处理FL_KEYUP事件-它们都在其handle()方法中返回0。如果focus小部件没有处理事件,FLTK会尝试将其传递给父小部件,然后在小部件层次结构中向上传递,直到到达顶层窗口。因此(这很奇怪)最终所有的小部件都将接收所有的FL_KEYUP事件,除非有一个小部件从它的handle()方法返回1(通常不是这样)。根据focus小部件在整个小部件层次结构中的深度,某些小部件可能会多次获得相同的FL_KEYUP事件,因为focus小部件的所有父组都会尝试将事件传递给它们的所有子级。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40284104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档