"Fensterln" mit DirectDraw
Jede DirectDraw-Anwendung ist auf ein Fenster angewiesen, das für die Entgegennahme aller Tastendrücke und
Mausereignisse zuständig ist (auch Vollbildanwendungen). Ohne ein solches Fenster kann eine DirectDraw-Anwendung
nicht existieren. Die Verbindung zwischen DirectDraw und diesem Eingabefenster wird durch einen
Aufruf der Methode SetCooperativeLevel hergestellt. Ihr wird das Handle des für Eingaben zuständigen
Anwendungsfensters übergeben. Außerdem bestimmt ein Flag, ob eine Fensteranwendung (DDSCL_NORMAL) oder
eine Vollbildanwendung (DDSCL_EXCLUSIVE) erstellt werden soll:
dd.SetCooperativeLevel _
Form1.hWnd, DDSCL_NORMAL
Doch das ist erst der Anfang. Denn nun geht es darum, sogenannte Surfaces, "Zeichenflächen" zu erzeugen.
Surfaces stellen die Leinwände dar, auf denen zweidimensionale Bitmaps gezeichnet werden. Neben den Surfaces,
die den Bildschirm repräsentieren, benötigt eine Anwendung außerdem Offscreen-Surfaces, in denen die Grafiken
abgelegt werden, die später auf dem Bildschirm angezeigt werden. Surfaces werden über einen Aufruf
der DirectDraw7-Methode CreateSurface erzeugt. Welche Art von Surface dabei erstellt werden soll,
wird über einen Parameter festgelegt, der eine vom DirectX-API definierte Struktur mit dem Namen DDSURFACEDESC2 übergeben wird.
Dieser Surface-Descriptor - wie der Typname zeigt, ist dieser bereits in einer aktualisierten,
zweiten Version verfügbar - ist eine Beschreibung des zu erzeugenden Surfaces. Um das PrimarySurface zu erzeugen,
müssen zwei Felder in dieser Struktur gesetzt werden:
Dim ddsd1 As DDSURFACEDESC2
Dim ddsd2 As DDSURFACEDESC2
ddsd1.lFlags = DDSD_CAPS
ddsd1.ddsCaps.lCaps = _
DDSCAPS_PRIMARYSURFACE
Set primarySurface = _
dd.CreateSurface(ddsd1)
In ddsd1.ddsCaps.lCaps wird das Flag DDSCAPS_PRIMARYSURFACE angegeben. Damit wird die Erzeugung des
Primary-Surfaces veranlasst. Das Primary-Surface entspricht dem Bildschirm und muss somit von jeder DirectDraw-Anwendung
erzeugt werden. Um dem CreateSurface-Befehl außerdem mitzuteilen, dass das Datenfeld ddsd1.ddsCaps gültige
Informationen enthält, muss im Feld ddsd1.lFlags zudem der Wert DDSD_CAPS hinterlegt werden. Um ein Hintergrund- oder
Offscreen-Surface zu erzeugen, muss anstelle des Flags DDSCAPS_PRIMARYSURFACE das Flag DDSCAPS_OFFSCREENPLAIN
in ddsd2.ddsCaps.lCaps angegeben werden. Und weil in dem Hintergrund-Surface eine Bitmap abgelegt werden soll,
wird nicht die Methode CreateSurface, sondern CreateSurfaceFromFile aufgerufen, die die im ersten Parameter
angegebene Bilddatei vom Typ BMP,
GIF oder JPG in das Surface hineinlädt:
ddsd2.lFlags = DDSD_CAPS
ddsd2.ddsCaps.lCaps = DDSCAPS_
OFFSCREENPLAIN
Set offscreenSurface = dd. _
CreateSurfaceFromFile
("grafik.bmp", ddsd2)