我正在使用FLTK 1.3.3,在实现
Fl_Widget::Handle()
功能时,我试图同时处理左键单击拖动和右键单击拖动,但是,我得到的事件不是我所期望的。当我同时按住左键和右键,然后释放其中一个,然后继续拖动时,就会出现问题。我仍在单击拖动,但收到了 FL_MOVE。
预期事件 | 实际事件 | |
---|---|---|
FL_PUSH | FL_PUSH | |
FL_PUSH | FL_PUSH | |
FL_拖动 | FL_拖动 | |
FL_RELEASE | FL_RELEASE | |
FL_拖动 | < | |
FL_RELEASE | FL_RELEASE |
这是说明该问题的代码示例:
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Widget.H>
#include <FL/names.h> // fl_eventnames[]
#include <FL/fl_draw.H>
#include <stdio.h>
class MyWidget : public Fl_Widget {
public:
MyWidget(int X,int Y,int W,int H) : Fl_Widget(X,Y,W,H) { }
int handle(int event) {
int ret = Fl_Widget::handle(event); // let Fl_Widget access events too
printf("Event was %s (%d)\n", fl_eventnames[event], event); // For illustrating the bug.
switch(event) {
case FL_ENTER:
return 1;
case FL_PUSH:
if (Fl::event_button()>1) printf("Right Click\n");
else printf("Left Click\n");
return 1;
case FL_DRAG:
return 1;
case FL_RELEASE:
return 1;
case FL_MOVE:
return 1;
}
return ret; // return Fl_Widget::handle()'s value
}
void draw() {
fl_color(color());
fl_rectf(x(),y(),w(),h());
}
};
int main() {
Fl_Window win(300,300);
MyWidget widget(10,10,100,100);
widget.color(FL_RED);
win.show();
return Fl::run();
}
如何正确跟踪同时左右拖动?最好通过 FLTK 本身,而不是通过使用自定义代码跟踪保持的点击来解决它。
该问题已在即将发布的 FLTK 1.4.0 中得到修复。您可以从 FLTK 下载页面下载当前快照或使用 git(分支
master
)。
FLTK 1.3.9 仍然显示该错误(并且不会修复)。