当前位置:  开发笔记 > 运维 > 正文

在GLUT中使用鼠标滚轮

如何解决《在GLUT中使用鼠标滚轮》经验,为你挑选了2个好方法。

我想在我的OpenGL GLUT程序中使用鼠标滚轮来放大和缩小场景?我怎么做?



1> BentFX..:

Freeglut的glutMouseWheelFunc回调依赖于版本,在X中不可靠.使用标准鼠标功能并测试按钮3和4.

关于glutMouseWheelFunc状态的OpenGlut注释:

由于缺少有关鼠标的信息,此时无法在X上正确实现此功能.使用此功能会限制应用程序的可移植性.(此功能适用于X,但不可靠.)建议您使用标准,可靠的鼠标按钮报告,而不是轮子事件.

使用标准GLUT鼠标报告:

#include 



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);
   }
}



glutMouseFunc(mouse);

正如OP所说,它"简单易行".他错了.


在具有免费过剩的Mac上,3/4对应于垂直向上和向下滚动,5/6对应于水平滚动(在我的触控板上).
不幸的是,使用固定按钮是非常不可靠的,因为鼠标按钮对应于鼠标滚轮取决于你插入的设备.事实上,我认为最常见的是按钮4/5用于向上/向下,而不是3/4.对于任何可用的程序,您希望用户可以轻松地修改它.

2> Ashwin Nanja..:

请注意,古老的Nate Robin的GLUT库不支持滚轮.但是,后来像FreeGLUT这样的GLUT实现了.

使用FreeGLUT中的滚轮非常简单.方法如下:

声明一个回调函数,只要滚动滚轮就会调用该函数.这是原型:

void mouseWheel(int, int, int, int);

使用(Free)GLUT函数glutMouseWheelFunc()注册回调.

glutMouseWheelFunc(mouseWheel);

定义回调函数.第二个参数给出了滚动的方向.+1的值是向前的,-1是向后的.

void mouseWheel(int button, int dir, int x, int y)
{
    if (dir > 0)
    {
        // Zoom in
    }
    else
    {
        // Zoom out
    }

    return;
}

而已!


除此之外 - 即使当使用`#include `以便代码编译时,似乎没有调用glutMouseWheelFunc(在Ubuntu 10.04 x86_64上测试,它发布了freeglut 2.6.0).解决方案是使用常规`glutMouseFunc`回调并检查`button == 3`表示向上滚动,并使用`button == 4`表示向下滚动.
令我烦恼的是,freeGLUT似乎没有实现glutMouseWheelFunc()回调.相当具有讽刺意味的是,海报正在抱怨这种发布方式,但你为自己发布的答案是不正确的.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有