www.codeworx.org/directx_tuts/Einführung in DirectDraw, Teil 3: Die ersten Schritte mit DirectDraw

Einführung in DirectDraw Teil 3: Die ersten Schritte mit DirectDraw
Datum: 27.1.00
Autor: Tim-Oliver Husser

Themen für Teil 3 dieses Tutorials:
Der neue Programmkopf
Das DirectDraw-Objekt
Cooperative Level
Display Mode
Aufräumarbeiten

Der neue Programmkopf
Nachdem Sie den ersten beiden Teilen dieses Tutorials gelernt haben, wie man die IDE konfiguriert und ein einfaches Windows-Programm erstellt, werden Sie jetzt Ihre ersten Schritte mit DirectDraw machen.
Los geht's mit dem Programmkopf, also den Include-Dateien und den Variablendeklarationen. Als neue Include-Datei ist die "ddraw.h" hinzugekommen; in ihr sind alle Funktionen und Konstanten von DirectDraw definiert:

#include <windows.h>
#include <ddraw.h>

Außerdem brauchen wir noch zwei Variablen, die wie folgt deklariert werden:

LPDIRECTDRAW7 lpDirectDraw;
HRESULT ddrval;

Die erste Variable ist ein Pointer (LP) auf DirectDraw-Objekt. Die "7" zeigt an, dass es sich um eine Methode von DirectX Version 7 handelt. Über dieses Objekt werden wir, nachdem wir es erstellt haben, Zugriff auf alle Funktionen von DirectDraw haben.
Fast alle Funktionen von DirectDraw liefern einen Fehlercode zurück, der angibt, ob alles problemlos geklappt hat, und wenn nicht, was schiefgegangen ist. Diese Rückgabewerte haben den Datentyp HRESULT.

Das DirectDraw-Objekt
Jetzt erstellen wir das DirectDraw-Objekt. Fügen Sie dazu folgende Zeilen in Ihren Code ein, und zwar direkt nach der UpdateWindow-Anweisung:

   ddrval = DirectDrawCreateEx(NULL, (VOID**)&lpDirectDraw,    IID_IDirectDraw7, NULL);
   if (ddrval != DD_OK)
   {
      return (0);
   }

Als ersten Parameter erwartet DirectDrawCreate einen Grafiktreiber, auf dem die Ausgabe erfolgen soll. Mit NULL geben wir an, daß der primäre Treiber benutzt werden soll.
Als zweites übergeben wir die DirectDraw-Variable, in der das DirectDraw-Objekt erstellt werden soll Die Methode erwartet einen Parameter vom Typ VOID**, also müssen wir lpDirectDraw erst mit (VOID**) konvertieren.
Das "IID_DirectDraw7" gibt an, daß wir ein DirectDraw-Objekt der Version 7 erstellen wollen.
Der letzte Parameter hat noch keine Funktion. Er ist nur für zukünftige Kompatibilitäten mit COM gedacht.
Dann überprüfen wir noch den Rückgabewert. Ist er ungleich DD_OK (=Operation erfolgreich), wird das Programm beendet.

Cooperative Level
Als nächstes müssen wir Windows sagen, wieviel Freiheit wir für unser Programm brauchen. Wir setzen den sogenannten Cooperative Level. Dies geschieht sofort nach der Erstellung des DirectDraw-Objektes:

   ddrval = lpDirectDraw->SetCooperativeLevel (hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
   if (ddrval != DD_OK)
   {
      lpDirectDraw->Release();
      lpDirectDraw = NULL;
      return (0);
   }

SetCooperativeLevel ist eine Methode des DirectDraw-Objektes.
Das erste Argument ist der Window-Handle des Hauptfensters.
Das zweite gibt den "Freiheitsgrad" an. Die Einstellung DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN gibt an, daß wir eine Vollbildanwendung haben und das diese exklusiven Zugriff auf den primären Grafikreiber haben soll. Möchten Sie ein DirectDraw-Programm im Fenster betreiben, müssen Sie hier DDSCL_NORMAL angeben.
Jetzt überprüfen wir noch den Rückgabewert. Ist dieser ungleich DD_OK, wird die Methode Release des DirectDraw-Objektes aufgerufen, der Speicherplatz freigegeben und das Programm beendet.
Die Release-Methode ist eine Eigenart aller COM-Objekte, zu denen auch das DirectDraw-Objekt zählt. Bei jeder Erstellung eines solchen Objektes wird ein interner Zähler um eins hochgezählt. Erst beim Aufruf von Release wir der wieder erniedrigt und wenn er bei Null angekommen ist, wird der Speicherplatz schließlich freigegeben. Vergessen Sie diesen Aufruf einmal, wird sich Ihr Programm höchstwahrscheinlich ins ewige Nirwana der Bits und Bytes begeben.

Display Mode
Als nächstes ändern wir die Grafikauflösung und die Farbtiefe auf die Werte, die wir brauchen. In unserem Fall wollen wir uns einmal auf eine Auflösung von 640x480 mit 265 Farben beschränken.
Dazu brauchen wir die Methode SetDisplayMode des DirectDraw-Objektes, die wir nach SetCooperativeLevel aufrufen:

   ddrval = lpDirectDraw->SetDisplayMode (640, 480, 8, 0, 0);
   if (ddrval != DD_OK)
   {
      lpDirectDraw->Release();
      lpDirectDraw = NULL;
      return (0);
   }

SetDisplayMode erwartet für die ersten drei Parameter: die Auflösung in x-Richtung (640), die in y-Richtung (480) und die Farbtiefe, angegeben in Bits Per Pixel (2^8 =265).
Der vierte Parameter gibt die "Refresh Rate" an. Diese ist für uns unwichtig, also übergeben wir eine "0", was bewirkt, daß die Standard-Refresh-Rate verwendet wird.
Der letzte Parameter bestimmt, ob wir den "Mode 13" verwenden wollen. Dies ist ein beschleunigter Grafikmodus für eine Auflösung von 320x200x8. Da wir darüber liegen, muß auch dieser Parameter gleich "0" sein.

Aufräumarbeiten
Beim Programmende brauchen wir nur das, was Sie sowieso schon kennen: Die Release-Methode.

   if (lpDirectDraw != NULL)
   {
      lpDirectDraw->Release();
      lpDirectDraw = NULL;
   }

So! Jetzt können Sie sich freuen! Sie haben Ihr erstes DirectDraw-Programm geschrieben!
Wenn Sie das Programm starten, wird die Auflösung geändert und das Fenster wird in Vollbild angezeigt. Mit einem Klick auf das "X" oben rechts beenden Sie das Programm.

Das Projekt können Sie hier herunterladen.

Teil 4