SDL: Maus

Aus Wikibooks

Mit der Maus können leicht Objekte auf grafischen Oberflächen markiert oder von einem Container in den nächsten verschoben werden. Aktionen werden durch das Klicken ausgelöst und bei allen Aufgaben, die keine Tastatureingabe erfordern, bietet sie uns ihre Hilfe an.

Mauspositionen[Bearbeiten]

absolute Mauspostion[Bearbeiten]

Wir können mit der Funktion

 Uint8 SDL_GetMouseState (int *x, int *y);

den Ort der Maus (x, y) abfragen und bekommen darüberhinaus noch den Status der Mausknöpfe angezeigt. Das Makro SDL_BUTTON hilft uns dabei, die Mausknöpfe zu erkennen:

 knoepfe = SDL_GetMouseState (NULL, NULL);
 if (knoepfe & SDL_BUTTON (SDL_BUTTON_LEFT))
   /* Linker Mausknopf wurde betätgt */

NULL bedeutet, daß die Positionsangabe nicht von Belang ist.

SDL kennt die folgenden Konstanten für Mausknöpfe:

  • SDL_BUTTON_LEFT - Linker Knopf
  • SDL_BUTTON_MIDDLE - Mittlerer Knopf
  • SDL_BUTTON_RIGHT - Rechter Knopf
  • SDL_BUTTON_WHEELUP - Mausrad hoch
  • SDL_BUTTON_WHEELDOWN - Mausrad runtern


relative Mausposition[Bearbeiten]

Um lediglich die Veränderung der Mausposition seit dem letzten Aufruf dieser Funktion zu ermitteln gibt es

 Uint8 SDL_GetRelativeMouseState (int *x, int *y);

Sie übergibt die Differenz zwischen alter und neuer Position seit dem letzten Aufruf von sich selbst. Ansonsten ist diese Funktion identisch zu SDL_GetMouseState. Auch hier kann man NULL übergeben, falls man sich nicht für die Positionsangaben interessiert.


Maus positionieren[Bearbeiten]

Die Maus kann mit

 void SDL_WarpMouse (Uint16 x, Uint16 y);

an eine beliebige Stelle innerhalb des SDL-Fensters gesetzt werden. Der Aufruf dieser Funktion generiert ein SDL_MOUSEMOTION-Event.

Mauszeiger[Bearbeiten]

Anzeige[Bearbeiten]

Ein Mauscursor kann mit

 int SDL_ShowCursor (int ja_nein);

angezeigt oder versteckt werden. Folgende Konstanten können übergeben werden:

  • SDL_ENABLE - zeigt den Mauscursor an
  • SDL_DISABLE - versteckt den Mauszeiger
  • SDL_QUERY - fragt den gegenwärtigen Status ab

SDL_ShowCursor gibt den aktuellen Status des Mauszeigers zurück, also SDL_ENABLE oder SDL_DISABLE.

Mauszeiger erstellen[Bearbeiten]

Die Funktion

 SDL_Cursor *SDL_CreateCursor (Uint8 *daten, Uint8 *maske, int breite, int hoehe, int hot_x, int hot_y);

erstellt einen Mauszeiger. Es können nur Schwarz-Weiss-Mauszeiger erstellt werden. daten und maske sind die Mauszeigerdaten. Die Breite eines Mauszeigers muss ein Vielfaches von 8 sein. hot_x und hot_y ist der so genannte Hotspot eines Mauszeigers, also der Ort der Mausgrafik, dessen Bewegung verfolgt wird und der beim Klicken bestimmt, wohin geklickt wurde. daten und maske sind jeweils gleichgroße Arrays aus 0 und 1. Folgende Bildpunkte ergeben sich aus der Überlagerung der Daten:

Daten Maske Aktion
0 0 Transparent
0 1 Weiss
1 0 Invertiert
1 1 Schwarz

Die Datenstruktur des Mauscursors ist wie folgt:

 typedef struct SDL_Cursor
 {
   SDL_Rect area;
   Sint16 hot_x, hot_y;
   Uint8 *data;
   Uint8 *mask;
   Uint8 *save[2];
   WMcursor *wm_cursor;
 } SDL_Cursor;

Folgendes Beispiel erzeugt einen kreuzförmigen Mauszeiger, wobei wir die Einsen im Kommentar rotfarben gezeichnet haben:

 void zeige_maus (void)
 {
   SDL_Cursor *cursor;
   Uint8 Daten[8] = {0, 0, 0, 0, 0, 0, 0, 0};
   Uint8 Maske[8] =
     {
       0x81, /*10000001*/
       0x42, /*01000010*/
       0x24, /*00100100*/
       0x18, /*00011000*/
       0x18, /*00011000*/
       0x24, /*00100100*/
       0x42, /*01000010*/
       0x81  /*10000001*/
     };
   cursor = SDL_CreateCursor (Daten, Maske, 8, 8, 4, 4);
   SDL_SetCursor (cursor);
 }

Cursor anzeigen[Bearbeiten]

Einen z. B. mit SDL_CreateCursor erzeugten Mauscursor kann man mit

 void SDL_SetCursor (SDL_Cursor *cursor);

anzeigen lassen. Der Mauscursor wird sofort angezeigt, es sei denn, mit SDL_ShowCursor wurde etwas anderes voreingestellt.


Mauszeigerdaten holen[Bearbeiten]

Die aktuellen Mauszeigerdaten kann man mit

 SDL_Cursor *SDL_GetCursor (void);

laden und selbstverständlich verändern.


Mausdaten freigeben[Bearbeiten]

Hat man einen Mauscursor mit SDL_CreateCursor erstellt, so kann man die Daten mit

 void SDL_FreeCursor (SDL_Cursor *cursor);

wieder freigeben.