Fenster erstellen
Kommen wir nun zum zweiten Schritt, dem Festlegen der individuellen Eigenschaften eines Fensters und dessen Erstellung.
 |
Festlegen der generellen Eigenschaften
eines Fensters über die Fensterklasse. |
 |
Festlegen der individuellen
Eigenschaften eines Fensters und Erstellung des Fensters. |
 |
Anzeigen des Fensters. |
 |
Schreiben der Nachrichtenschleife um
die Nachrichten abzuholen und zu verteilen. |
 |
Schreiben des Programmteiles zur
Verarbeitung der Nachrichten. Dieser Programmteil wird auch als Fensterprozedur
bezeichnet. |
Um nun ein Fenster zu erstellen (bisher haben wir ja nur die Fensterklasse definiert)
wird 'lediglich' die API-Funktion CreateWindowEx(...)
aufgerufen. Diese Funktion ist aber ein abschreckendes Beispiel dafür wie man eine
Funktion eigentlich nicht definieren sollte. Sie erhält 12 (in Worten: zwölf!) Parameter
übergeben um die individuellen Eigenschaften des zu erstellenden Fensters festzulegen.
Sehen Sie sich jetzt unbedingt einmal die Beschreibung dieser Funktion an.
Als Returnwert liefert die Funktion das so wichtige Fenster-Handle. Dieses
Fenster-Handle wird für alle weiteren Funktionen benötigt die sich mit der Steuerung
des Fenster befassen. Schlug die Erstellung des Fenster fehl, so liefert CreateWindowEx(...)
den Wert '0' zurück.
 |
Erweitern Sie nun das in der letzten Lektion begonnene Beispiel FirstWin
um die Erstellung eines Fensters das folgende Eigenschaften besitzen soll:
- keinen erweiterten Fensterstil
- das Fenster soll ein überlappendes Fenster sein
- der Fenstertitel soll lauten: "Mein erstes Fenster"
- die Größe und Position des Fensters soll durch WINDOWS bestimmt werden
Verwenden Sie unbedingt die Online-Hilfe zur Funktion um das
entsprechende Fenster zu erstellen. Die Online-Hilfe ist Ihr wichtigstes
Hilfsmittel!
Übersetzen Sie nach der Erweiterung das Beispiel wieder um eventuelle Fehler zu
beseitigen. Und dazu nochmals folgender Hinweis: die Fehlermeldung, dass die
Fensterprozedur WndProc nicht definiert ist, werden wir erst später beseitigen.
 |
Soll ich Ihnen meine Lösung zeigen? Aber vorher sollten Sie es unbedingt einmal
selbst versucht haben! |
Lösung zur Erstellung eines Fensters
 |
Dies ist nun unwiderruflich der letzte Hinweis zur Handhabung der Listings.
Die kursiven, schwarzen Anweisungen wurden entweder durch den Assistenten erstellt oder in
einem früheren Schritt schon eingegeben. Diese brauchen Sie nicht mehr
in ihr Projekt
kopieren. Kopieren Sie also nur die nicht-kursiven blauen und brauen Anweisungen. Aber
kopieren Sie alle notwendigen Teile! Beachten Sie dabei, dass es auch mehrere, einzeln zu
kopierende Programmteile geben kann. |
....
// Fensterklassen-Name
LPCTSTR lpszWCLASSNAME = "ERSTES FENSTER";
// Fenstername und -titel
LPCTSTR lpszTITLE = "Mein erstes Fenster";int APIENTRY WinMain(HINSTANCE
hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
....
// Fensterklasse registrieren
RegisterClassEx(&WndClass);
// Fenster erzeugen
HWND hWindow;
// Fenster-Handle
hWindow = CreateWindowEx(0,
// kein erweiterter Stil
lpszWCLASSNAME, //
Fensterklassen-Name
lpszTITLE,
// Fenstertitel
WS_OVERLAPPEDWINDOW, // Fensterstil
CW_USEDEFAULT, 0, // Position
CW_USEDEFAULT, 0, // Groesse
(HWND)0, // kein Parent-Fenster
(HMENU)0, // kein Menu
hInstance, // Instanzen-Handle
NULL);
// keine zusaetzl. Daten
// Fehler abfangen
if (hWindow == NULL)
{
MessageBox(0,"Fehler beim
CreateWindowEx(...)!",
"FEHLER",MB_OK);
return 0;
}
return 0;
}
|
Zunächst wird eine weitere Konstante, diesmal für den Fensternamen (gleich
Fenstertitel), definiert.
Die Festlegung der individuellen Eigenschaften eines Fensters sowie dessen Erstellung
erfolgt mit der Funktion CreateWindowEx(...). Als Ergebnis liefert die Funktion
ein Fenster-Handle auf das neu erstellte Fenster. Hierzu wird vor dem Aufruf der Funktion
eine weitere Variable hWindow vom Typ HWND definiert, die den Returnwert
der Funktion aufnimmt.
Das Fenster erhält im ersten Schritt keine erweiterten Fensterstile weshalb der erste
Parameter der Funktion mit '0' belegt wird. Danach folgt der Name der
Fensterklasse der
dieses Fenster angehört. Hier geben wir wieder die Konstante lpszWCLASSNAME
an
die auch schon beim Aufruf der vorherigen Funktion RegisterClassEx(...) verwendet
wurde. Dadurch gehört dieses Fenster zur Fensterklasse 'ERSTES FENSTER' und übernimmt
deren Grundeinstellungen, d.h. das Fenster wird z.B. mit einem grauem Hintergrund
dargestellt werden. Als nächstes folgt die Angabe des Fenstertitels. Die Position und
Größe des Fensters lassen wir durch WINDOWS festlegen. Aus diesem Grund geben wir für
die Parameter die Konstante 'CW_USEDEFAULT' an. Da das zu erstellende Fenster das
Hauptfenster der Anwendung ist besitzt es selbst kein weiteres übergeordnetes Fenster.
Das Fenster-Handle des übergeordneten Fenster wir daher auf '0' gesetzt. Das gleiche gilt
für das Menü, das dem Fenster zugewiesen wird (Menüs folgen erst später). Die Werte
für die beiden restlichen Parametern ergeben sich von selbst.
Ende der Lösung
|
|
So viel zur Erstellung eines Fensters. Als nächstes sehen wir uns an, wie man ein
Fenster letztendlich zur Anzeige bringt. Denn der alleinige Aufruf von CreateWindowEx(...)
bringt das Fenster noch zum Vorschein.
|