我正在制作一个OpenGL应用程序,使用GLUT作为我的基础。我刚开始实现非控制台交互,鼠标很容易实现。然后,当我去实现鼠标滚动时,我发现滚动鼠标时没有事件传递给glutMouseFunc
。我在other forums上看到它应该将其3
和4
的回调称为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';
}
答案 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实现应该无论平台如何都能正确捕获鼠标滚轮。