如何在 C++ FLTK 中同时处理左拖动和右拖动

How do I handle simultaneous Left and Right drags in C++ FLTK

提问人:Harris Lau 提问时间:7/11/2023 最后编辑:Harris Lau 更新时间:7/12/2023 访问量:38

问:

我正在使用 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 本身,而不是通过使用自定义代码跟踪保留的点击来绕过它。

C++ FLTK语言

评论

0赞 Kozydot 7/11/2023
您使用的是哪个版本的 FLTK?另外,您是否遇到任何特定的错误消息?
0赞 Harris Lau 7/11/2023
我正在使用 FLTK 1.3.3,我没有收到错误消息,只是我找不到相关信息的违反直觉的行为。
0赞 Harris Lau 7/13/2023
这已被确认是 FLTK 核心中的一个问题,正在调查中,同时,可以通过解决方法修复它,修复的详细信息在这里: groups.google.com/g/fltkgeneral/c/EnQ6QIysqrg

答: 暂无答案