22
SEP09WinAPI C++ Das erste Fenster unter Windows
Heute fangen wir mal gaaaanz klein an und zwar werden wir mit C++ ein Windows-Fenster erstellen mit dem wir die Nachrichten von Windows verarbeiten werden. Als Entwicklungsumgebung könnt ihr das eurer Wahl benutzen, ich empfehle euch aber VisualStudio 2008 Express, natürlich kannst du aber auch andere Umgebungen wie z.B. DevC++ benutzen, ich werde das/die Tutorials so erklären das man diese auch mit anderen Umgebungen machen kann. ( Zumindest die, die mir bekannt sind )
Neues Projekt
Zunächst startet eure Umgebung und erstellt ein neues leeres Win32 Projekt, nennen wir es “WinApi_1″. Erstellt dann eine neue Cpp-Datei mit dem Namen “WinApi_1.cpp”.
Es ist hier völlig egal wie Ihr die Datei nennt, der Compiler geht später alle Cpp-Dateien durch und sucht sich als seinen Einsprungspunkt entweder den Aufruf von “WinMain()” oder für die Konsole: “main()”
Zunächst müssen wir unserem Programm ein paar Funktionen beibringen die von extern kommen. Bindet dazu die Header-Datei von Windows ein. Damit wir mit unseren Zeichen und unsere Strings überall kompatibel sind werden wir noch die TChar-Headerdatei einbinden. Ich werde später dazu mal ein Tutorial schreiben damit ihr genau wisst warum das ganze.
1 2 |
#include <windows.h>
#include <tchar.h>
|
Startet wir nun mit der definition unseres Einsprungpunkts.
1 2 3 |
int WINAPI WinMain( HINSTANCE p_hInstance, HINSTANCE p_hPrevInstance, LPSTR p_szCmdLine, int p_nShowCmd )
{
}
|
Wenn wir ein Programm starten, dann sucht Windows diesen Punkt in unseren Cpp-Dateien und ruft diese Funktion auf. Lasst uns nun ein paar Variablen definieren die wir für unser Fenster brauchen, schreibt bitte in den geschweiften Klammern in der Funktion weiter.
1 2 3 4 5 6 7 8 9 10 11 |
// Fensterklasse
WNDCLASS WindowClass;
// NachrichtenStruktur für das Fenster
MSG WindowMessages;
// Fensterhandle
HWND WindowHandle;
// Name unserer Fensterklasse
const TCHAR* WinClassName = _T("WinAPI_1");
|
Jedes Fenster das erstellt wird bekommt einen Style zugewiesen, dies macht man mit der Struktur WNDCLASS. Beim Erzeugen eines Fensters bekommen wir ein Handle-Pointer auf dieses Fenster zurück, diesen speichern wir dann in eine HWND-Variable. In die Variable WindowMessages werden später die Nachrichten unseres Fensters abgelegt bevor wir diese verarbeiten. Das TChar-Objekt werden wir später als Name für unser Window-Style verwenden, um dies zu identifizieren.
In der letzten Zeit hab ich mir auch immer angewöhnt die Variablen vorher zu nullen, damit in den Strukturen kein Datenmüll vorhanden ist und ich beim Erstellen keine = 0 Zuweißungen machen muss, da dieser Zustand schon gegeben ist. Also, nullen wir jetzt alle Variablen:
1 2 3 4 |
// Alle Werte zurücksetzen
ZeroMemory( &WindowClass, sizeof( WNDCLASS ) );
ZeroMemory( &WindowMessages, sizeof( MSG ) );
ZeroMemory( &WindowHandle, sizeof( HWND ) );
|
Lasst uns nun unserem Fenster ein Style verpassen.
1 2 3 4 5 6 7 |
WindowClass.style = CS_HREDRAW|CS_VREDRAW;
WindowClass.lpfnWndProc = winProc;
WindowClass.hInstance = p_hInstance;
WindowClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
WindowClass.hCursor = LoadCursor (NULL, IDC_ARROW);
WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
WindowClass.lpszClassName = WinClassName;
|
Für die Standard-Zuweisungen solltet ihr euch besser mal die Struktur in MSDN anschauen, WNDCLASS ich werde hier jetzt nicht auf Alle eingehen. Mit dem Wert lpszClassName wird unser Fensterklassen-Name zugewiesen. Mit lpfnWndProc definieren wir eine Callback-Funktion die immer aufgerufen wird wenn das Betriebssystem uns eine Nachricht schickt, diese Funktion werden wir aber erst zu einem späteren Zeitpunkt erstellen. Wenn wir die Window-Klasse erstellt haben dann müssen wir diese bei Windows anmelden, dies geschiet mit RegisterClass
1 2 |
if( !RegisterClass( &WindowClass ) )
return -1;
|
Wenn aus irgendwelchen Gründen die Klasse nicht registriert werden kann dann wird das Programm mit Code -1 verlassen, ansonsten läuft es weiter.





8 Kommentare
Na ENDLICH! Wurde ja auch langsam mal Zeit
Werste später direkt mal Visual Studio E Installieren und das ganze mal Ausprobieren
*hehe Jep nur zu, und danach lernste das alles erst mal auswendig xD
Auswendig ? Kannst du es denn ? *muhaha
Ähm, ja? !!
*hihi
Edit: Deine Uhr geht Falsch
man leute man muss das nicht auswendig lernen man sollte eher wissen was man da macht!
Das ist z.B. ein Grund wieso wir damals Klugscheißer immer verdroschen haben *lach*
Natürlich ist es nicht ein “auswendig lernen” vielleicht seh ich es aber auch nur als eine Selbstverständlichkeit das man aus solchen Tutorials einfach auch mal Werte solang ändert bis man versteht was da passiert, ggf. auf anderen Seiten, unter anderem auch MSISDN, nachliest was da geschieht.
Somit nehmt meinen Kommentar mit “auswendig lernen” nicht Wort wörtlich
Kommentar schreiben