Die Methode CreateSurface erzeugt beide Surfaces
Über den Aufruf der Methode CreateSurface werden beide Surfaces in einem Rutsch erzeugt. Zugriff auf den Backbuffer
erhält man allerdings erst, wenn man die Methode GetAttachedSurface aufruft, die als Ergebnis den Backbuffer in Form
eines weiteren DirectDrawSurface7-Objektes liefert. Die Offscreen-Surfaces, in denen Animations- und Hintergrundbilder
verwaltet werden, lassen sich dagegen auf die übliche Art und Weise, also wie in einer Fensteranwendung, erzeugen. Dasselbe
gilt für die ColorKeys, mit denen transparente Blt-Operationen realisiert werden. Anschließend erfolgt der Bildaufbau
in aller Ruhe im Backbuffer. Weil der Backbuffer nicht sichtbar ist, kann der Bildaufbau problemlos vonstatten gehen. Ist das
Bild komplett erstellt, vertauschen Primary-Surface und Backbuffer durch einen Aufruf der Flip Methode ihre Rollen: der
Backbuffer wird angezeigt, die Primary-Surface vom Bildschirm entfernt. Nach einem Aufruf von Flip referenziert das
ehemalige Primary-Surface-Objekt den Backbuffer und umgekehrt, so dass das Zeichnen im Hintergrund erneut durch Beschreiben
des Backbuffers erfolgen kann. Eine Vollbildanwendung führt damit stets alle Grafikausgaben über den Backbuffer durch, und
sobald dieser komplett erstellt ist, wird zwischen Primary-Surface und Backbuffer umgeschaltet:
primarySurface.Flip _
backSurface, DDFLIP_WAIT
Solange die Vollbildanwendung sichtbar ist, ist die DirectDraw-Welt in Ordnung. Allerdings kann der Anwender beispielsweise
über die Tastenkombination [Alt-Tab] eine andere Anwendung in den Vordergrund holen. Dabei gibt die Vollbildanwendung ihre
Kontrolle zeitweilig wieder an
Windows ab, was bei der Rückkehr zur DirectDraw-Anwenung dazu führt, dass die im Grafikspeicher
gesicherten Surfaces ihren Inhalt verlieren. Das bedeutet, dass nach einem derart folgenschweren Ereignis alle Surfaces restauriert
werden müssen. Dabei wird zum einen der ehemals vom Surface allokierte Speicher erneut allokiert, zum anderen müssen die Grafikdateien
erneut geladen werden - das ist der Grund, warum die Rückkehr zu einem aufwendigen Spiel nach Betätigung der Tastenkombination [Alt-Tab]
auch auf ansonsten sehr schnellen Maschinen einige Sekunden in Anspruch nehmen kann. Um zu erkennen, dass eine Restauration der Surfaces
angesagt ist, muss vor dem Aufbau des Hintergrundbildes die Methode TestCooperatveLevel des DirectDraw-Objektes aufgerufen werden.
Liefert diese Methode einen Rückgabewert verschieden von DD_OK, so kann DirectDraw den ehemaligen Zustand der Surfaces nicht mehr
garantieren und das Programm muss die Surfaces wiederherstellen. Allerdings nur dann, wenn der Aufruf von TestCooperatveLevel
wieder anzeigt, dass die DirectDraw-Anwendung wieder im Vollbesitz ihrer Kräfte bzw. des Bildschirms ist. Falls TestCooperatveLevel
also einen Wert ungleich DD_OK liefert, ist es eine gute Programmierpraxis, so lange zu warten, bis diese Methode wieder den
Wert DD_OK anzeigt. In der Zwischenzeit sollte die Anwendung allerdings durch Aufrufe von DoEvents am Laufen gehalten werden:
Dim bRestorationNeeded _
As Boolean
bRestorationNeeded = False
While dd.TestCooperative
Level() <\<><\>> DD_OK
bRestorationNeeded = True
DoEvents
Wend
If offscreenSurface.isLost()
Then
Set offscreenSurface = _
Nothing
offscreenDesc.lFlags = _
DDSD_CAPS
'Grafik in Offscreen-Surface
' laden
offscreenDesc.ddsCaps.lCaps _
= DDSCAPS_OFFSCREENPLAIN
Set offscreenSurface = _
dd.CreateSurfaceFromFile _
(App.Path & "\cloud.bmp", _
offscreenDesc.lFlags = _
DDSD_CAPS Or DDSD_HEIGHT _
Or DDSD_WIDTH
offscreenSurface. _
GetSurfaceDesc offscreenDesc
End If
If bRestorationNeeded Then
dd.RestoreAllSurfaces
End If