Использование колесика мыши в GLUT - PullRequest
31 голосов
/ 18 августа 2008

Я хочу использовать колесо прокрутки мыши в моей программе OpenGL GLUT для увеличения и уменьшения масштаба сцены? Как мне это сделать?

Ответы [ 3 ]

34 голосов
/ 25 октября 2011

Обратный вызов Freeglut glutMouseWheelFunc зависит от версии и ненадежен в X. Используйте стандартную функцию мыши и проверьте кнопки 3 и 4.

Примечания OpenGlut о состоянии glutMouseWheelFunc:

Из-за недостатка информации о мышке невозможно реализовать это правильно на 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);

Как указывалось в ОП, это "очень просто". Он был просто неправ.

23 голосов
/ 18 августа 2008

Обратите внимание, что почтенная библиотека GLUT Нейта Робина не поддерживает колесо прокрутки. Но более поздние реализации GLUT, такие как FreeGLUT do.

Использование колеса прокрутки во 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;
}

Вот и все!

0 голосов
/ 14 ноября 2018

наблюдайте случаи 3 и 4 в приведенной ниже инструкции switch в обратном вызове mouseClick

glutMouseFunc(mouseClick);

...

void mouseClick(int btn, int state, int x, int y) {
  if (state == GLUT_DOWN) {
    switch(btn) {
    case GLUT_LEFT_BUTTON:
      std::cout << "left click at: (" << x << ", " << y << ")\n";
      break;
    case GLUT_RIGHT_BUTTON:
      std::cout << "right click at: (" << x << ", " << y << ")\n";
      break;
    case GLUT_MIDDLE_BUTTON:
      std::cout << "middle click at: (" << x << ", " << y << ")\n";
      break;
    case 3:  //mouse wheel scrolls
      std::cout << "mouse wheel scroll up\n";
      break;
    case 4:
      std::cout << "mouse wheel scroll down\n";
      break;
    default:
      break;
    }
  }
  glutPostRedisplay();
}
...