Erstellen von Fenstern

Einführung

Jede Anwendung, welche unter Windows mit dem Benutzer kommunizieren soll benötigt eine graphische Oberfläche bestehend aus den sogenannten Fenstern. Fenster können sehr vielfältig sein. Jedes Dialogfeld, jedes Eingabefeld , jede Schaltfläche und auch jedes Textfeld kann ein Fenster sein. Jedes Fenster besitzt eine sogenannte Fensterklasse, welche in Form einer Struktur die grundsätzlichen Einstellungen des Fenster speichert. Sie enthält u.a. Information über Hintergrundfarbe, Menü, Verhalten beim Ändern der Größe etc. Außerdem besitzt jede Fensterklasse einen eindeutigen Namen in Form einer Zeichenkette. Diese ermöglicht das Erstellen beliebig vieler Fenster ein und derselben Fensterklasse anhand des Namens. Die Windows-API besitzt bereits einige vordefinierte Fensterklassen:

Name Art des Fensters
edit Eingabefeld
button Schaltfläche (auch Radio-feld)
static z.B. für Textfelder
combobox Kombobox (z.B. bei Auswahl von Schriftarten)
listbox Listenfeld

Außerdem existiert noch eine Vielzahl weiterer. Zunächst beschäftigen wir uns aber mit eigenen Fenstern. Dazu betrachten wir die Fensterklassen erst einmal genauer.

Fensterklassen

Fensterklassen verweilen nach ihrer Registrierung im System. Sie haben (so gut wie) nichts mit den Klassen in Verbindung mit C++ zu tun. Um eine Fensterklasse zu erstellen benötigt man zunächst eine Instanz der 'WNDCLASS'-Struktur. Die Struktur sieht wie folgt aus:

struct WNDCLASS 
{
    UINT style;
    WNDPROC lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    HANDLE hInstance;
    HICON hIcon;
    HCURSOR hCursor;
    HBRUSH hbrBackground;
    LPCTSTR lpszMenuName;
    LPCTSTR lpszClassName; 
};

Die Datentypen:

Datentyp Erläuterung
WNDPROC - Funktionszeiger auf eine Fensterprozedur
HANDLE - eine allgemeines Handle (kann beliebiges Handle einnehmen hier: HINSTANCE)
HICON - Handle für ein Symbol
HBRUSH - Handle für ein Pinsel
LPCTSTR - Konstante Zeichenkette (entspricht const TCHAR*)

Die Parameter:

Parameter Erläuterung
style - Konstanten für das Fensterverhalten in der Form CS_x (CS: Class Style)*
lpfnWndProc - Zeiger auf die Fensterprozedur
cbClsExtra - Anzahl der Extrabytes für Fensterklasse (normalerweise 0)
cbWndExtra - Anzahl der Extrabytes für Fenster (normalerweise 0)
hInstance - Anwendungsinstanz (sollte aus WinMain entnommen werden)
hIcon - Icon, welches links auf der Titelleiste zu sehen ist
hCursor - Standardcursor für das Fenster
hbrBackground - Pinsel für Hintergrundfarbe
lpszMenuName - Name der Menüresource (bei NULL, kein Menü)
lpszClassName - Name der Fensterklasse

*Erklärung der Konstanten in der MSDN unter WNDCLASS

Nach Ausfüllen der Struktur muss die Fensterklasse registriert werden. Dies wird mit einem einfachen Aufruf von 'RegisterClass(...)' erreicht. Im Programm sieht das wie folgt aus:

...
WNDCLASS wc;
//ausfüllen der Struktur
...
RegisterClass(&wc);
...

Nach der Registrierung der Fensterklasse kann nun das erste Fenster auf Grundlage dieser Klasse erstellt werden.

Erstellen von Fenstern

Ein Fenster kann mithilfe der Funktion 'CreateWindow(...)' erstellt werden. Diese Funktion liefert ein Fensterhandle (Datentyp: 'HWND') zurück, mit dem das Fenster eindeutig bestimmt wird. Die Deklaration sieht wie folgt aus:

HWND CreateWindow(	LPCTSTR lpClassName, 
			LPCTSTR lpWindowName, 
			DWORD dwStyle, 
			int x, int y, 
			int nWidth, int nHeight, 
			HWND hWndParent, 
			HMENU hMenu, 
			HANDLE hInstance, 
			LPVOID lpParam);

Die Datentypen:

Datentyp Erläuterung
HMENU - Handle für ein Menü
LPVOID - void-Zeiger (entspricht void*)

Die Parameter:

Parameter Erläuterung
lpClassName - Name der gewünschten Klasse
lpWindowName - Fenstertitel
dwStyle - Konstanten für Fensterstil in der Form WS_x (WS: Window Style)*
x, y - Koordinaten für Fenster 0, 0 entspricht linker oberer Ecke**
nWidth, nHeight - Breite und Höhe**
hWndParent - Parentfenster (bei NULL keins)
hMenu - Handle Für Menü (bei NULL kein Menü) / ID des Fensters (hWndParent != NULL)
hInstance - Anwendungsinstanz (sollte von WinMain übernommen werden)
lpParam - benutzerdefinierte Zusatzparameter (bei NULL keine Parameter)

*Die Fensterstile lassen sich der MSDN unter CreateInstance entnehmen
** Hier können jeweils die Konstanten CW_USEDEFAULT eingesetzt werden um die Standardwerte zu verwenden

Es existiert außerdem eine erweiterte Funktion namens 'CreateWindowEx(...)' Sie besitzt neben den oben genannten einen Zusatzparameter mit erweiterten Fensterstilen:

HWND CreateWindowEx(	DWORD dwExStyle,
			LPCTSTR lpClassName,
			LPCTSTR lpWindowName,
			DWORD dwStyle,
			int x, int y, 
			int nWidth, int nHeight, 
			HWND hWndParent, 
			HMENU hMenu, 
			HINSTANCE hInstance, 
			LPVOID lpParam);

Anzeigen des kompletten Fensters

Die Parameter:

Parameter Erläuterung
dwExStyle - Konstanten für erweiterten Fensterstil in der Form WS_EX_x *

*Die erweiterten Fensterstile lassen sich der MSDN unter CreateWindowsEx entnehmen

Nach der Erstellung des Fensters muss das Fenster zunächst angezeigt werden. Dies geschieht mit der vielversprechenden Funktion 'ShowWindow(...)':

BOOL ShowWindow( HWND hWnd, int nCmdShow);

Die Parameter:

Parameter Erläuterung
hWnd - Fensterhandle des anzuzeigenden Fensters
nCmdShow - gibt an wie das Fenster angezeigt werden soll*
- sollte von WinMain übernommen werden oder SW_SHOW sein

*die Konstanten lassen sich aus der MSDN unter ShowWindow entnehmen

Anschließend muss noch der Anwendungsbereich aktualisiert werden. Dies geschieht mit einem einfachen Aufruf von 'UpdateWindow(...)'

BOOL UpdateWindow(HWND hWnd);

Die Parameter:

Parameter Erläuterung
hWnd - Fensterhandle des zu aktualisierenden Fensters

Zusammenfassung

Folgende Schritte müssen durchgeführt werden um ein Fenster zu erstellen und anzuzeigen:

  1. Deklarieren einer 'WNDCLASS'-Instanz
  2. Ausfüllen der Instanz
  3. Registrieren der Fensterklasse mit 'RegisterClass(...)'
  4. Erstellen des Fensters mit 'CreateWindow(...)' bzw. 'CreateWindowEx(...)'
  5. Anzeigen des Fensters mit 'ShowWindow(...)'
  6. Aktualisieren des Anwendungsbereiches mit 'UpdateWindow(...)'

Die nächsten Lektionen

Nachdem wir uns mit dem Erstellen des Fensters beschäftigt haben, werden wir in der nächsten Lektion noch einmal näher auf die Behandlung von Nachrichten eingehen, um dann endlich die erste WIN32-Anwendung schreiben zu können.

Zurück Nach oben Weiter