Fensterdekoration Bearbeiten

Fenstertitel Bearbeiten

Fensterdekoration beschränkt sich bei SDL hauptsächlich auf einen Fenstertitel, den sie angeben können. Selbstverständlich ist dieser nicht sichtbar, wenn Sie sich im Vollbild-Modus befinden:

 void SDL_WM_SetCaption (const char *titel, const char *icon_titel);

titel ist der Fenstertitel, der im Fensterrahmen angezeigt wird, icon_titel ein String, der unter einem Icon angezeigt wird, welches sich beim Verkleinern in der Programmliste oder auf dem Desktop befindet.

Falls Sie vergessen haben, wie ihre aktuelle Anwendung heißt können Sie mit

 void SDL_WM_GetCaption(char **titel, char **icon_titel);

die entsprechenden Daten herausbekommen.

Icon Bearbeiten

Die Funktion

 void SDL_WM_SetIcon (SDL_Surface *icon, Uint8 *maske);

erstellt Ihnen ein Programm-Icon. icon ist dabei ein normales Programmicon, 32*32 Pixel im Ausmaß. In maske sind nur diejenigen Bits gesetzt, die nicht transparent erscheinen sollen. Wollen Sie also ein Icon verwenden, welches nur als Rand gezeichnet wird, können sie etwa folgenden Code verwenden:

 SDL_Surface *icon;
 Uint8 Maske [] = {
     255, 255, 255, 1, 128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 128, 0, 0, 1,
     128, 0, 0, 1,  128, 0, 0, 1, 128, 0, 0, 1, 255, 255, 255, 255};
 icon = SDL_LoadBMP ("icon.bmp");
 SDL_WM_SetIcon (icon, Maske);

Für ein vollständig gezeichnetes Icon können Sie maske auf NULL setzen.

Um das Fenster als Programmicon darzustellen verwenden Sie die Funktion

 int SDL_WM_IconifyWindow (void);

Falls diese Funktion 0 zurückliefert, unterstützt Ihr System keine Programmicons.

Sonstiges Bearbeiten

Mit Hilfe der Funktion

 int SDL_WM_ToggleFullScreen (SDL_Surface *surface);

können Sie zwischen Vollbild- und Fensterbild hin- und herschalten. Die Funktion liefert 0 im Fehlerfall, 1 sonst.

Um die gesamte Eingabe von Maus und Tastatur auf Ihr gegenwärtiges Fenster umzulenken bedienen Sie sich der Funktion

 SDL_GrabMode SDL_WM_GrabInput (SDL_GrabMode modus);

Es wird wirklich jede Aktion von Maus und Tastatur von Ihrer Anwendung verarbeitet, normale Funktionen um das Programm zu beenden funktionieren dann nicht mehr, es sei denn, Sie haben sie in Ihrem Programm vorgesehen. Verwenden Sie diese Funktion mit Bedacht! Die Parameter sind:

  • SDL_GRAB_QUERY - fragt den gegenwärtigen Status ab
  • SDL_GRAB_OFF - Gibt die Eingabe wieder frei
  • SDL_GRAB_ON - Programm versucht jedes Ereignis selbst zu verarbeiten

Die Funktion liefert den letzten Modus zurück.

Beispielprogramm Bearbeiten

Das folgende Programm erzeugt ein Programmicon für die Programmliste. Mit der Taste ESC brechen Sie das Programm ab, mit PfeilHoch können Sie den Vollbildmodus ein- oder ausschalten, mit PfeilRunter iconifizieren Sie das Programm.

   #include <SDL/SDL.h>
   #include <stdio.h>

   int main (void)
   {
     SDL_Surface *screen, *icon;
     SDL_Event event;
     int ende;
     if (SDL_Init (SDL_INIT_VIDEO) != 0)
       {
         fprintf (stderr, "FEHLER: SDL_INIT\n");
         exit (-1);
       }
     atexit (SDL_Quit);
     screen = SDL_SetVideoMode (640, 480, 16, SDL_HWSURFACE);
     if (screen == NULL)
       {
         fprintf (stderr, "FEHLER: SetVideoMode\n");
         exit (-1);
       }

     icon = SDL_LoadBMP ("icon.bmp");
     if (icon == NULL)
       {
         fprintf (stderr, "Fehler: Kann Bitmap nicht laden!\n");
         exit (-1);
       }
     SDL_WM_SetIcon (icon, NULL);
     SDL_WM_SetCaption ("WikiBooks-SDL", "WikiBooks - SDL");

     ende = 0;
     while (SDL_WaitEvent(&event) && !ende)
       {
         if (event.type == SDL_KEYDOWN)
           {
             if (event.key.keysym.sym == SDLK_ESCAPE)
               ende = 1;
             else if (event.key.keysym.sym == SDLK_UP)
               SDL_WM_ToggleFullScreen (screen);
             else if (event.key.keysym.sym == SDLK_DOWN)
               SDL_WM_IconifyWindow ();
           }
       }
     return 0;
   }