Использование колесика прокрутки мыши в режиме перенасыщения
-
08-06-2019 - |
Вопрос
Я хочу использовать колесо прокрутки мыши в моей программе OpenGL GLUT для увеличения и уменьшения масштаба сцены?Как мне это сделать?
Решение 2
Обратите внимание , что почтенный ИЗБЫТОК Нейта Робина библиотека не поддерживает колесо прокрутки.Но, более поздние реализации GLUT, такие как Фриглют делай.
Использовать колесо прокрутки во FreeGLUT очень просто.Вот как это делается:
Объявите функцию обратного вызова, которая должна вызываться всякий раз, когда прокручивается колесо прокрутки.Это и есть прототип:
void mouseWheel(int, int, int, int);
Зарегистрируйте обратный вызов с помощью (бесплатной) функции 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;
}
Вот и все!
Другие советы
Обратный вызов glutMouseWheelFunc от Freeglut зависит от версии и ненадежен в X.Используйте стандартную функцию мыши и проверьте наличие кнопок 3 и 4.
Примечания OpenGLUT о состоянии glutMouseWheelFunc:
Из-за отсутствия информации о мыши, на данный момент невозможно правильно реализовать это на X.Использование этой функции ограничивает переносимость вашего приложения.(Эта функция работает на X, просто ненадежно.) Рекомендуется использовать стандартные, надежные отчеты о кнопках мыши, а не о событиях на колесиках.
Использование стандартных отчетов мыши о перенасыщении:
#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, это "предельно просто".Он просто ошибался.
обратите внимание на случаи 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();
}