Pre DirectX Tutorial: Teil 1 - Einführung in die WinAPI
Ich brauchte mal ne Pause vom neuen Design von Sundancer (ja Flupdi, wird kommen
:) ). Etwa da erinnerte ich mich, das hier ja noch ein DirectX Tutorial zu schreiben
war. Nun auf.
Bevor wir zum Planeten X aufbrechen noch ein paar Kleinigkeiten. Zunächst
braucht ihr einen Compiler der DirectX Programme erstellen kann. MS VC++ ist
fein, Borland und alle anderen taugen genauso gut. Worauf ich aber hinauswill
ist folgendes - wenn ihr mit eurer Compilerumgebung nicht umgehen könnt
wird das auch nix mit DirectX. Also, für diejenigen, die noch nicht mit
VC++ oder gar noch nichts in C gemacht haben, LERNT ERST DAS! Betreibt RTFM
und kompiliert ein paar Programme bevor ihr los legt.
In diesem Teil gehen wir es locker an und lassen den Planeten X unberührt.
Vielmehr geht es erst einmal um das Universum: Windows.
Andre LaMothe sagte mal "In Windows zu programmieren ist wie zum Zahnarzt
zu gehen: Man weiß das es gut für einen ist, aber niemand mag es."
Ich für meinen Teil habe Windows-Programmierung lange Zeit höflich
vermieden. Als es dann doch Zeit war verbrachte ich 3 Wochen in der Hölle,
aber inzwischen mag ich es sogar. Wirklich. Ganz ehrlich. Mist, das glaube ich
mir nicht mal selber ;)
Wenn wir heute von Windows reden meinen wir eine Version von Win32, also Win95,
98, NT4 oder 2000. Diese sind Multitasking und Multithreading fähig. Das
bedeutet: mehrere Programme können gleichzeitig ausgeführt werden
und diese Programme können aus mehreren Unterprogrammen und Aufgaben bestehen,
die ebenfalls gleichzeitig ausgeführt werden. So - und jetzt zur Realität.
Windows hat im Kern den sogenannten Scheduler. Dieser macht nichts anderes
als jedem Programm welches gerade startet eine Prozessnummer zuzuweisen. Aus
der Sicht von Windows ist jedes Programm ein Prozess. Jene Prozessnummern werden
nun in eine Prozessliste eingetragen. Unter NT kann man sich diese Prozessliste
bequem anzeigen lassen: CRTL, ALT, DEL und dann "Task Manager" und
"Prozessliste". Der Scheduler ruft die Prozesse in der Prozessliste
nacheinander für Sekundenbruchteile auf. Gleichzeitig läuft da also
gar nichts, nur so schnell das man den Eindruck hat.
Und hier liegt auch schon ein Vierbeiner vergraben, denn die Entscheidung wie
lange welcher Prozess läuft liegt bei Windows. Win kann und wird (!) euch
gnadenlos den Teppich unter eurer Applikation weg ziehen wenn es mal gerade
Lust drauf hat. Der User hat kaum einen Einfluß darauf, da nützt
auch das erhöhen der Priorität eurer Programme wenig.
Windows ist "event driven". Das bedeutet das Windows alles erst einmal
als Ereignis (event) welches es dann als Nachricht (message) weiter verarbeitet.
Allerdings sieht es so aus das Windows die Nachrichten an euer Programm weiter
leitet und ihr dann etwas mit diesen Nachrichten anfangen müsst. Ein Event
kann z.B. ein Tastendruck des Nutzers sein aber auch die Aktivierung des Bildschirmschoners...
Wenn Windows Nachrichten an unser Programm weiter gibt brauchen wir eine Art
Schnittstelle um diese Nachrichten zu verarbeiten. Dazu aber später noch
mehr als euch lieb ist.
Sehen wir uns erst einmal ein simples Windows Programm an.
--------------------------------------------------------------------------------
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <windowsx.h>
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
MessageBox(NULL, "Hello World!",
"Hello Title",
MB_OK | MB_ICONEXCLAMATION);
return(0);
}
--------------------------------------------------------------------------------
Das Programm gibt einfach nur ein Nachrichtenfenster aus. Kompiliert es mal
und schaut es euch an. Jetzt zur Obduktion ;)
#define WIN32_LEAN_AND_MEAN
Hmmm. Man hat erst einmal 2 Möglichkeiten ein Windows-Programm zu schreiben:
MFCs oder SDKs. Die MFCs (Microsoft Foundation Classes) sind typische Microsoft
Ausgeburten: völlig mit Features überladen, aufgeblasen und so logisch
aufgebaut, das sie schon wieder viel zu komplex sind. Die SDKs (Software Development
Kits) sind kleiner, enthalten nur das nötigste und man kann den Umgang
in ein paar Wochenenden lernen.
WIN32_LEAN_AND_MEAN weist den Compiler nun an diesen ganzen MFC Kram zu vergessen
und sich auf das nötigste zu beschränken.
Windows.h repräsentiert die wichtigsten Windows Header und windowsx.h
enthält einige nette Spielzeuge, die uns das Leben in Windows erleichtern.
Jetzt wird es wichtig, also aufwachen. Der Einstiegspunkt aller Windows Programme
ist die WinMain() Prozedur. Sie ist das Äquivalent zu der Main() Prozedur
von DOS Programmen.
Diese WINAPI Deklaration ist die neumodische PASCAL Funktionen Deklaration.
WINAPI sagt einfach nur das die folgenden Parameter von links nach rechts statt
von rechts nach links bearbeitet werden. Und jetzt zu eben jenen Parametern.
hinstance - Diesen Parameter nutzt Windows um eine Applikation zu überwachen
und ihr eine Nummer zuzuweisen. Es ist quasi die Adresse eures Programmes.
hprevinstance - Das ist eine Krankheit, die noch aus der Zeit der 16 Bit Windows
Versionen übrig geblieben ist. Win16 Programme nutzten das, um die Instanz
des Programmes zu speichern, die das aktuelle Programm aufgerufen hat. Nicht
drüber nachdenken, seid einfach froh, das es jetzt Geschichte ist ;)
lpcmdline - Das sind die Kommandozeilen Parameter, die beim Start überliefert
werden. Ist ganz nützlich für eigene Debug Erweiterungen ;)
ncmdshow - Dieser Parameter zeigt an wie euer Programm gestartet wird. So kann
es beim Start gleich minimiert werdenoder gar nciht angezeigt werden (in bestimmten
Fällen durchaus sinnvoll).
So! Wenn ihr die ganzen Parameter, Flags oder sonst was lernen wollt holt euch
ein Buch über Windows Programmierung (solltet ihr so wie so). Auch gut
ist eine Referenz oder Nachschalgewerk, welches nur die Befehle und Inhalte
aufführt.
Jetzt kommen wir zum Nachrichtenfenster. Die Message Box ist eine nette Funktion
der Windows API, die einfach nur ein kleines Fenster öffnet. Gehen wir
wieder die Parameter durch:
hwnd - In unserem Falle NULL. Es ist das Handle der Box und zeigt an an welche
Applikation die Box gebunden ist. Indem wir NULL setzen ist der Desktop das
übergeordnete Fenster.
lptext - Das ist der Text den ihr ausgeben wollt - in unserem Falle "Hello
World!"
lpcaption - Der Titel unseres Fenster "Hello Title"
utype - Das ist der einzig aufregende Parameter. Hier könnt ihr festlegen
welche Buttons (OK, Cancel, Retry, ...) euer Fenster haben soll und welche Icons
(Ausrufezeichen, ...) angezeigt werden sollen. Hierbei verweise ich wieder auf
ein Buch über die Windows API. Schnappt euch ne Liste und schlagt nach,
was alles möglich ist.
So. Das war unser kleines Programm. Dummerwesie ist jedes Programm nicht ganz
so einfach, deshalb macht an der Stelle erst einmal eine Pause und Compiliert
das obere Programm. Schaut es euch an, spielt mit den Parametern und schaut
dann, was dabei heraus kommt.
Pause! Erst mal so weit. Das nächste Mal geht es noch etwas tiefer in
Windows hinein.
Wenn ihr jetzt alle sagt "Boah, langeweilig - ich weiß schon, wie
man ein Windows Fenster öffnet, einen DirectX Kontext daran bindet und
WinProc ruft nur noch ein Gähnen hervor" werde ich gleich zum "Real
Stuff" übergehen. Ansonsten werde ich alles Schritt für Schritt
erklären. Sagt mal was.
Obwohl ich alles langsam durchgehe soll das kein Windows API Kurs sein, sondern
eher ein ganz schneller Überblick sein, gerade genug um ein DirectX Fenster
zu öffnen. Bei entsprechender Nachfrage kann ich das zwar vertiefen, aber
im Moment halte ich Windows sehr einfach.
Dann noch eine Empfehlung für ein Windows Buch: "Tricks of the Windows
Game Programming Gurus" von Andre LaMothe. SAMS Verlag, ISBN: 9-780672-31361-5.
Hat knapp über tausend Seiten und behandelt nicht nur DirectX mit fast
allen seinen Komponenten, sondern auch noch Windows, Künstliche Intelligenz,
Physikalische Modelle und viele andere nette Dinge. Es ist in englisch, aber
echt leicht zu lesen. Ein Schock ist der Preis von knapp 150.-, aber anstatt
5 Bücher über die ganzen Themen zu kaufen braucht man nur dieses.
Des weiteren sind auf der beiliegenden CD noch weitere Bücher und hunderte
von Texten über Optimierung und tiefer gehendes Material. Auf der 2. CD
liegt der uneingeschränkte MS VC++ 6.0 Compiler in der Introductory Version
vor. Einziger Haken: die kompilierten Programme dürfen nicht für Kommerzielle
Zwecke verwendet werden, sonst hat er alles! Und wenn das nicht mal Gegenwert
fürs Geld ist!
So...bis zum nächsten Mal...
Delax
[delax@sundancerinc.de]