提问人:Harris Lau 提问时间:7/11/2023 最后编辑:Harris Lau 更新时间:7/12/2023 访问量:38
如何在 C++ FLTK 中同时处理左拖动和右拖动
How do I handle simultaneous Left and Right drags in C++ FLTK
问:
我正在使用 FLTK 1.3.3,在实现该功能时,我正在尝试同时处理左键单击拖动和右键单击拖动,但是,我得到的事件不是我所期望的。当我同时按住左键和右键单击,然后松开其中一个,然后继续拖动时,问题就出现了。我仍然在点击拖动,但我收到了FL_MOVE。Fl_Widget::Handle()
行动 | 预期事件 | 实际事件 |
---|---|---|
左键点击下方 | FL_PUSH | FL_PUSH |
右键单击 | FL_PUSH | FL_PUSH |
拖动 | FL_DRAG | FL_DRAG |
左键单击 | FL_RELEASE | FL_RELEASE |
更多拖拽 | FL_DRAG | > FL_MOVE < |
右键单击 | 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 本身,而不是通过使用自定义代码跟踪保留的点击来绕过它。
答: 暂无答案
评论