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