2008-08-18 8 views

Antwort

19

Beachten Sie, dass die ehrwürdige Bibliothek Nate Robin's GLUT das Scrollrad nicht unterstützt. Aber, spätere Implementierungen von GLUT wie FreeGLUT tun.

Die Verwendung des Scrollrads in Freeglut ist tot einfach. Hier ist wie:

Deklarieren Sie eine Callback-Funktion, die immer aufgerufen werden soll, wenn das Scrollrad gescrollt wird. Dies ist der Prototyp:

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

den Rückruf Registrieren Sie sich bei der (Free) GLUT Funktion glutMouseWheelFunc().

glutMouseWheelFunc(mouseWheel); 

Definieren Sie die Rückruffunktion. Der zweite Parameter gibt die Richtung der Bildlaufleiste an. Werte von +1 sind vorwärts, -1 ist rückwärts.

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

    return; 
} 

Das war's!

+4

Sehr zu meinem Ärger, scheint FreeGLUT den glutMouseWheelFunc() Callback nicht zu implementieren. Eher ironisch, dass Plakate sich über diese Art des Postings beschweren, aber die Antwort, die Sie für sich selbst gepostet haben, war falsch. – Rich

+15

Hinzu kommt - selbst wenn man '#include ' verwendet, damit der Code kompiliert wird, scheint glutMouseWheelFunc nicht aufgerufen zu werden (wie auf Ubuntu 10.04 x86_64 getestet, welches Freeglut 2.6.0 liefert). Die Lösung besteht darin, den regulären 'glutMouseFunc'-Callback zu verwenden und nach" button == 3 "für Rad-Up und nach" button == 4 "für Rad-Down zu suchen. –

+0

glutMouseWheelFunc Callback ist Windows-spezifische möglicherweise nicht in Linux und MAC-Systeme – AMCoded

32

freeglut der glutMouseWheelFunc Rückruf ist versionsabhängig und nicht zuverlässig in X. Verwenden Sie Standard-Mausfunktion und Test für die Tasten 3 und 4

Die OpenGlut Hinweise auf glutMouseWheelFunc Zustand:

Wegen des Mangels an Informationen über die Maus ist es unmöglich, dies zu diesem Zeitpunkt korrekt auf X zu implementieren. Die Verwendung dieser Funktion begrenzt die Portabilität Ihrer Anwendung. (Diese Funktion funktioniert auf X, nur nicht zuverlässig.) Sie sind aufgefordert, die Standard, zuverlässige Maus-Bericht, anstatt Wheel-Ereignisse zu verwenden.

Standard GLUT Maus Berichterstattung verwenden:

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

Als OP erwähnt, ist es "einfach tot". Er hat sich einfach geirrt.

+2

Leider ist die Verwendung von festen Tasten ziemlich unzuverlässig, da die Maustasten dem Mausrad entsprechen hängt davon ab, welches Gerät Sie eingesteckt haben. Tatsächlich denke ich, am häufigsten ist Taste 4/5 für hoch/runter, nicht 3/4. Für jedes verwendbare Programm möchten Sie es dem Benutzer leicht machen, dies zu ändern. –

+2

Auf meinem Mac mit freiem Überlauf entspricht 3/4 dem vertikalen Scrollen nach oben und unten und 5/6 dem horizontalen Scrollen (auf meinem Trackpad). –

+0

Danke, diese Lösung funktioniert perfekt in meinem Test-Szenario. –