没有ScrollWheel生成的事件 - GLUT

时间:2018-03-23 22:39:10

标签: c++ opengl glut

我正在制作一个OpenGL应用程序,使用GLUT作为我的基础。我刚开始实现非控制台交互,鼠标很容易实现。然后,当我去实现鼠标滚动时,我发现滚动鼠标时没有事件传递给glutMouseFunc。我在other forums上看到它应该将其34的回调称为int button,分别向上和向下滚动。

我尽量避免使用glutMouseWheelFunc(...),因为它不是独立于平台的。

那么,我如何以与平台无关的工作方式实现滚动?

谢谢!

以下是显示问题的简短代码段 -

#pragma once
#include <iostream>

#include <GL/glut.h>
#include <GL/glext.h>

void onMouse(int button, int state, int x, int y);

int main(int argc, char** argv) {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(256,256);

    glutCreateWindow("Mousewheel Test");

    glutMouseFunc(onMouse);

    glutMainLoop();
}

void onMouse(int button, int state, int x, int y){
    //Here, an event is generated for left, right, and middle clicks (though middle is the same as right...), 
    //but not scrolling!
    std::cout << "Mouse event. Button: " << button << " state: " << state << '\n';
}

1 个答案:

答案 0 :(得分:1)

使用freeglut 3.0.0 + Linux + gcc您的示例可以正常工作(需要进行微调,必须注册glutDisplayFunc或者过剩才能打开窗口),并且在onMouse中将滚轮报告为按钮3和4。

使用GLUT 3.7.6 + Windows 10 + Visual Studio 2017鼠标轮显然无法被过剩捕获(没有轮回调,鼠标和键盘的回调都没有报告)。

最初的GLUT(Mark Kilgard)很老,自2001年以来一直没有更新(https://user.xmission.com/~nate/glut.html),所以可能没有办法编写适用于任何GLUT的车轮感知代码和任何平台。

freeglut实现应该无论平台如何都能正确捕获鼠标滚轮。