2008-08-18 18 views

Respuesta

19

Tenga en cuenta que venerable Nate Robin's GLUT biblioteca no es compatible con la rueda de desplazamiento. Pero, las implementaciones posteriores de GLUT como FreeGLUT hacen.

El uso de la rueda de desplazamiento en FreeGLUT es muy simple. Aquí se muestra cómo:

Declara una función de devolución de llamada que se invocará cada vez que se desplace la rueda de desplazamiento. Este es el prototipo:

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

Registre el de respuesta con el (gratuito) Función de GLUT glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel); 

Define la función de devolución de llamada. El segundo parámetro proporciona la dirección del desplazamiento. Los valores de +1 son hacia adelante, -1 están hacia atrás.

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

    return; 
} 

Eso es todo!

+4

Para mi molestia, freeGLUT no parece implementar la devolución de llamada glutMouseWheelFunc(). Es bastante irónico que los carteles se quejaran de este estilo de publicación, pero la respuesta que publicaste para ti era incorrecta. – Rich

+15

Agregando a eso, incluso cuando se usa '#include ' para que el código se compile, glutMouseWheelFunc no parece ser llamado (como se probó en Ubuntu 10.04 x86_64, que envía freeglut 2.6.0). La solución es usar la devolución de llamada regular 'glutMouseFunc' y comprobar si' button == 3' para la rueda hacia arriba, y 'button == 4' para la rueda hacia abajo. –

+0

glutMouseWheelFunc callback es específico de Windows podría no en Linux y sistemas MAC – AMCoded

32

de devolución de llamada de glutMouseWheelFunc freeglut es la versión dependiente y no fiable en X. El uso de funciones estándar del ratón y prueba de los botones 3 y 4.

Las notas OpenGlut en estado glutMouseWheelFunc:

Debido a la falta de información sobre el mouse, es imposible implementar esto correctamente en X en este momento. El uso de esta función limita la portabilidad de su aplicación. (Esta característica funciona en X, simplemente no de manera confiable.) Se le recomienda utilizar el informe de botón de mouse estándar , en lugar de eventos de rueda.

El uso de informes estándar GLUT ratón:

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

A medida que la OP se ha dicho, es "muerto simple". Él solo estaba equivocado.

+2

Desafortunadamente usar botones fijos es bastante poco confiable ya que CUALQUIER botón del mouse corresponde a la rueda del mouse depende de qué dispositivo haya enchufado. De hecho, creo que el más común es el botón 4/5 para arriba/abajo, no 3/4. Para cualquier programa utilizable, desea que sea fácil para el usuario modificar esto. –

+2

En mi Mac con exceso libre, 3/4 corresponden al desplazamiento vertical hacia arriba y hacia abajo y 5/6 corresponden al desplazamiento horizontal (en mi panel táctil). –

+0

Gracias amigo, esta solución funciona perfectamente en mi escenario de prueba. –

Cuestiones relacionadas