在GLUT中使用鼠标滚轮
答
请注意,古老的Nate Robin's GLUT库不支持滚轮。但是,稍后GLUT的实现像FreeGLUT那样。
在FreeGLUT中使用滚轮非常简单。方法如下:
声明一个回调函数,当滚动滚轮时应该调用该函数。这是原型:
void mouseWheel(int, int, int, int);
与(免费)转运蛋白功能glutMouseWheelFunc()注册回调。
glutMouseWheelFunc(mouseWheel);
定义回调函数。第二个参数给出了滚动的方向。 +1的值是前向的,-1是向后的。
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
就是这样!
答
Freeglut的glutMouseWheelFunc回调取决于版本,并在十用标准鼠标功能不可靠,测试按钮3和4
上glutMouseWheelFunc状态OpenGlut注释:
由于缺乏信息关于鼠标,此时不可能在X上正确地实现此操作。使用此功能 限制了您的应用程序的可移植性。 (此功能在 X上工作,只是不可靠。)鼓励您使用标准的可靠鼠标按钮报告,而不是轮式事件。
使用标准GLUT鼠标报告:
#include <GL/glut.h>
<snip...>
void mouse(int button, int state, int x, int y)
{
// Wheel reports as button 3(scroll up) and button 4(scroll down)
if ((button == 3) || (button == 4)) // It's a wheel event
{
// Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP
if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events
printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
}else{ // normal button event
printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y);
}
}
<snip...>
glutMouseFunc(mouse);
如前所述的OP,它是 “死简单”。他错了。
对我来说很烦,freeGLUT似乎没有实现glutMouseWheelFunc()回调。相当具有讽刺意味的是,海报抱怨这种发帖方式,但你为自己发布的答案是不正确的。 – Rich 2009-01-12 20:57:05
除此之外 - 即使使用`#include`来编译代码,glutMouseWheelFunc似乎也不会被调用(就像在Ubuntu 10.04 x86_64上发布的,它发布了freeglut 2.6.0)。 解决方法是使用常规的`glutMouseFunc`回调并检查`按钮== 3`是否在轮子上,`按钮== 4'是否轮子不亮。 –
2010-07-14 21:13:09