我对FL_Value_Input进行了子类化,这样当小部件被修改时,我可以给它一个颜色,但是用户还没有按enter键。
愚蠢的是,在事件是FL_KEYDOWN事件的情况下,handle(int e)函数永远不会被调用,其他事件(如FL_KEYUP、FL_DRAG、FL_FOCUS等)会被很好地传播。
小部件是小部件层次结构的一部分...会不会是这个层次结构中的某个父级正在吸收这个特定的FL_KEYDOWN事件?
编辑:显然,这个小部件也没有焦点(通过比较this和Fl::focus()进行了测试),这很奇怪,因为我正在输入它。
任何帮助都将不胜感激。
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;
}发布于 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键时不会设置。当满足该条件时,可以将颜色改回原来的颜色。
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
}
}发布于 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小部件的所有父组都会尝试将事件传递给它们的所有子级。
https://stackoverflow.com/questions/40284104
复制相似问题