Übersicht

Erstellen eines Fensters

Initialisieren von DirectX

Hauptschleife

Abmelden von DirectX

Abmelden des Fensters

Das fertige Programm

Kapitel 1 - Initialisierung von DirectX

Übersicht

In diesem Kapitel erstellen wir das Programmgerüst für die folgenden Abschnitte der Einführung. Klären wir als erstes, wie unser Programm funktionieren soll, damit wir später überhaupt einmal Grafik auf dem Bildschirm darstellen können. So ungefähr könnte der Ablauf aussehen:

  • Erstellen eines Fensters
  • Initialisieren von DirectX
  • Hauptschleife mit Löschen des Hintergrunds
  • Abmelden von DirectX
  • Abmelden des Fensters

DirectX und all seine Bestandteile sind als COM-Objekte implementiert, um von den verschiedenen Programmiersprachen, wie Visual C++, Visual Basic, Delphi etc. zugänglich zu sein. COM-Objekte werden in C++ ähnlich wie Klassen benutzt.

Erstellen eines Fensters

Wie praktisch jedes Windows-Programm braucht auch unsere Applikation ein Window um Nachrichten empfangen und bearbeiten zu können. Dieses Fenster wird später mit DirectX verbunden.

Da dieser Teil eigentlich übliche Windows-Programmierung ist gehe ich hier nicht weiter auf Details ein, sondern stelle nur kurz den Code vor.

[Quellcode 1]

Natürlich brauchen wir für unser Fenster eine WindowProc()-Funktion, die auf eingehende Nachrichten von Windows reagiert. Die wichtigste Nachricht, die uns interessiert ist WM_KEYDOWN, die Tastendrücke meldet, denn auf Druck von [ESC] wollen wir unser Programm beenden.

[Quellcode 2]

Initialisieren von DirectX

Um Grafik mit DirectX darstellen zu können bedient man sich dem Bestandteil Direct3D. Davon müssen wir also eine Instanz erzeugen und danach mittels Methoden von Direct3D ein Device erstellen, in dem wir dann zeichnen können.

Erzeugen einer Instanz von Direct3D

Das ist eine einfache Aufgabe und benötigt eigentlich nur eine Zeile Code, in der wir die Funktion Direct3DCreate8() aufrufen.

[Quellcode 3]

Ein Direct3DDevice erstellen

Um ein Device zu erstellen müssen wir eine Struktur ausfüllen, die die Eigenschaften unseres Device genauer beschreibt. Schauen wir uns die einzelnen Eigenschaften einmal genauer an.

Windowed Gibt an, ob unser Programm im Fenster oder Vollbildmodus laufen soll.
hDeviceWindow Dies ist das Handle unseres Hauptfensters, mit dem wir das Device verbinden wollen.
BackBufferCount Gibt die Anzahl der Backbuffer an. Geben wir hier eine 1 an, so haben wir einen Frontbuffer und einen Backbuffer, die wir für Double Buffering benutzen können.
SwapEffect Gibt an, was mit dem Frontbuffer passiert, wenn er zum Backbuffer wird.

Bei D3DSWAPEFFECT_DISCARD wird der Inhalt als unwichtig angesehen und man kann sich nicht darauf verlassen, dass dieser so im Backbuffer ankommt, wie er als Frontbuffer einmal war. Für unseren Fall ist das kein Problem, denn wir füllen den Backbuffer ja jedes Mal komplett mit einer Farbe auf.

BackBufferWidth

BackBufferHeight

Diese beiden Werte geben die Größe des Backbuffers an. In der Regel ist der Backbuffer genauso groß, wie der Frontbuffer, also die Auflösung, in der das Programm laufen soll.
BackBufferFormat Gibt an, in welchem Pixelformat der Backbuffer angelegt werden soll. D3DFMT_R5G6B5 bedeutet, das 5 Bit für Rot, 6 Bit für Grün und 5 Bit für Blau zur Verfügung stehen. Dieses Format wird von praktisch allen aktuellen Grafikkarten unterstützt.

Jetzt können wir die Struktur mit den entsprechenden Werten füllen und dann das Device mittels CreateDevice() erzeugen.

[Quellcode 4]

Hauptschleife

In der Hauptschleife unseres Programms machen wir nichts weiter, als zwischen dem Backbuffer und dem Frontbuffer hin- und herzuschalten und diesen jeweils mit einer Hintergrundfarbe zu füllen. Das Ganze passiert solange bis der Benutzer das Programm beendet, also durch Druck auf [ESC] in der WindowProc() g_Quit auf true gesetzt wird.

Das Füllen des Hintergrunds geschieht mittels der Methode Clear() des Direct3DDevice. Wir verändern die Hintergrundfarbe jedes Mal ein wenig, damit man auch sieht, das sich etwas tut.

Zwischen den beiden Buffern umzuschalten erledigt die Methode Present(), die ebenfalls zum Direct3DDevice gehört.

[Quellcode 5]

Jetzt haben wir alles zusammen, um Grafik anzuzeigen, aber wir wollen unser Programm natürlich auch wieder verlassen können und müssen deshalb die belegten Ressourcen wieder freigeben.

Abmelden von DirectX

Das Abmelden von DirectX ist ähnlich unkompliziert, wie das Anmelden. Zuerst wird das Device mittels Release() freigeben, anschließend Direct3D ebenfalls mittels Release().

[Quellcode 6]

Abmelden des Fensters

Zu guter Letzt melden wir auch noch unser Fenster ab und haben damit alle belegten Ressourcen freigegeben und können das Programm verlassen.

[Quellcode 7]

Das fertige Programm

Nun haben wir die Basis für die folgenden Teile der Einführung.

Alles zusammen genommen ergibt folgendes Programm:

[Quellcode Gesamt]