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