www.codeworx.org/directx_tuts/Einführung in DirectDraw: Teil 5, Grafiken anzeigen

Einführung in DirectDraw: Teil 5, Grafiken anzeigen
Datum: 27.1.00
Autor: Tim-Oliver Husser

Themen für Teil 5 dieses Tutorials:
Bildschirm löschen
Ein Bild laden
Hinweis

Bildschirm löschen
Das erste, was man meisten machen will, ist, den Bildschirm zu löschen. Dazu kopieren wir einfach ein schwarzes Rechteck auf den Bildschirm.
Wen wunderts? Zuerst brauchen wir wieder zwei neue Variablen:

DDBLTFX ddbltfx;
RECT fill_area;

Dann füllen wir ddbltfx mit den Informationen über die gweünschte Farbe:

ddbltfx.dwSize = sizeof(DDBLTFX);
ddbltfx.dwFillColor = RGB(0, 0, 0);

Jetzt füllen wir die fill_area-Struktur mit den Ausmaßen unseres Bildschirms:

SetRect(&fill_area, 0, 0, 640, 480);

Jetzt blitten wir dieses Rechteck auf den Bildschirm. Dazu verwenden wir die Methode Blt. Diese wird in der SDK folgendermaßen definiert:

HRESULT Blt
(
   LPRECT lpDestRect,
   LPDIRECTDRAWSURFACE7 lpDDSrcSurface,
   LPRECT lpSrcRect,
   DWORD dwFlags,
   LPDDBLTFX lpDDBltFx
);

lpDestRect beinhaltet die Koordinaten des Ziels, lpSrcRect die der Quelle, lpDDSrcSurface hält die Quell-Surface, mit dwFlags stellt man erweiterte Optionen ein und lpDDBltFx definiert eine Farbe zum Blitten.
Mit diesen Information können wir jetzt unser Rechteck auf den Back Buffer blitten:

lpddsBack->Blt(&fill_area, NULL, NULL, DDBLT_COLORFILL    | DDBLT_WAIT, &ddbltfx);

und anschließend flippen:

while(lpddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK);

Die letzten beiden Anweisungen müssen in die Nachrichtenschleife ("while(1)...").
Indem wir bei Blt für lpDDSrcSurface und lpSrcRect NULL übergeben, geben wir an, daß es sich nicht um ein Surface, sondern nur um ein Rechteck handelt. Das Flag DDBLT_COLORFILL veranlaßt Blt mit der in ddbltfx definierten Farbe zu blitten und DDBLT_WAIT besagt, daß das Programm erst fortgesetzt wird, wenn das Blitten beendet ist.
Die while-Schleife beim Flippen soll sicherstellen, daß wirklich geflipt wurde, befor das Programm fortgesetzt wird.
Wenn Sie das Programm jetzt starten, bekommen Sie einen schwarzen Bildschirm.

Ein Bild laden
Zuerst brauchen wir eine Variable, die das Bild aufnehmen soll:

LPDIRECTDRAWSURFACE7 lpddsBitmap;

Das eigentlich Laden des Bitmaps machen wir uns jetzt schön einfach. In dem Verzeichnis, in das sie die DirectX-SDK installiert haben, finden sich irgendwo die beiden Dateien "ddutil.cpp" und "ddutil.h". Kopieren Sie diese beiden Dateien in Ihr Projekt-Verzeichnis und fügen Sie sie mit Projekt->Dem Projekt hinzugügen->Dateien dem Projekt hinzu.
Jetzt noch an den Anfang des Codes eine Include-Anweisung, um die Funktionen aus den beiden Dateien auch nutzen zu können:

#include "ddutil.h"

Jetzt können wir mit der Funktion DDLoadBitmap ein Bitmap in eine Surface laden (vor das "running=true"):

lpddsBitmap = DDLoadBitmap(lpDirectDraw, "Test.bmp"200, 150);

Wir übergeben zuerst das DirectDraw-Objekt, dann den Dateinamen des zu ladenden Bitmaps und schließlich dessen Größe in Pixeln.
Wir laden also ein Bitmap "Test.bmp" mit den Außmaßen 200x150.
Um es auf den Back Buffer zu kopieren, müssen wir erst angeben, wohin es kopiert werden soll. Dazu brauchen wir noch eine RECT-Variable:

RECT rectbitmap;

Diese füllen wir jetzt mit den Zielkoordinaten:

SetRect(&rectbitmap, 220, 165, 420, 315);

Die Koordinaten entsprechen der Bildschirmmitte.
Und jetzt blitten:

lpddsBack->Blt(&rectbitmap, lpddsBitmap, NULL, DDBLT_WAIT,    NULL);

Hinweis
Bevor ich weitermache, muß ich erst einmal auf eine Sache hinweisen. Ich schreibe den Code für dieses Tutorial so, daß man ihn gut verstehen kann. Deshalb schreibe ich alles in einem Stück. Wenn Sie Ihre eigenen Programme schreiben, sollten Sie das ganze natürlich noch optimieren. Dazu gehört z.B. durch die Auslagerung einzelner Programmteile in Funktionen und die Einschränkung des Gültigkeitsbereiches der Variablen. Auf dieses Thema werde ich hier nicht mehr weiter eingehen, da es eigentlich nichts mit DirectDraw zu tun hat.

Das Projekt können Sie hier herunterladen.

Teil 6