2008-08-18 260 views

回答

19

请注意,古老的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; 
} 

就是这样!

+4

对我来说很烦,freeGLUT似乎没有实现glutMouseWheelFunc()回调。相当具有讽刺意味的是,海报抱怨这种发帖方式,但你为自己发布的答案是不正确的。 – Rich 2009-01-12 20:57:05

+15

除此之外 - 即使使用`#include `来编译代码,glutMouseWheelFunc似乎也不会被调用(就像在Ubuntu 10.04 x86_64上发布的,它发布了freeglut 2.6.0)。 解决方法是使用常规的`glutMouseFunc`回调并检查`按钮== 3`是否在轮子上,`按钮== 4'是否轮子不亮。 – 2010-07-14 21:13:09

32

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,它是 “死简单”。他错了。