API-Windows-Programmierung (ohne MFC)
Inhalt
1.
WinMain(...) und windows.h
2.
Eigene Fenster erzeugen
3.
Zwei Fenster auf Basis einer WNDCLASS-Struktur erzeugen
4.
Nachrichtenverarbeitung
5.
Interaktionen mit Kindfenstern
6.
DLL-Programmierung
Bevor wir zur Nachrichtenverarbeitung,
dem Kernstück der Windows-Programmierung, kommen,
werden wir zunächst zwei Fenster
mittels CreateWindow(...) auf Basis einer gemeinsamen WNDCLASS-Struktur
in einem Programm aufrufen.
3. Zwei Fenster auf Basis einer WNDCLASS-Struktur erzeugen
Mit CreateWindow(...) kann man auf
Basis
einer registrierten WNDCLASS-Struktur in einem einzigen Programm
auch mehrere Fenster erzeugen. Damit Sie
hierfür eine experimentelle Basis haben, ändern Sie bitte auf
folgenden Code ab:
#include
<windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int
WINAPI
WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
HWND
hwnd
= CreateWindow //
Fenster 1
ShowWindow
(hwnd, iCmdShow);
HWND
hwnd2
= CreateWindow //
Fenster 2
ShowWindow
(hwnd2,
SW_SHOWNORMAL);
//-----------------------------------------------------------------------------------
MSG
msg;
//----------------------------------------------------------------------------------- LRESULT
CALLBACK
WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_DESTROY:
return
DefWindowProc
(hwnd, message, wParam, lParam);
|
Nach dem Kompilieren verfügt unser Programm über zwei Fenster mit jeweils eigener Titelzeile und Systemmenü:
Dies liegt daran, dass
für
beide Fenster der Stil WS_OVERLAPPEDWINDOW festgelegt wurde.
Sie können das zweite
Fenster auch außerhalb des Bereichs des ersten Fensters bewegen:
Anders verhält sich
dies,
wenn Sie beim zweiten Fenster anstelle des Stils WS_OVERLAPPEDWINDOW
den Stil WS_CHILD |
WS_THICKFRAME
verwenden.
Jetzt ist das zweite
Fenster
"gefangenes Kind" des ersten Fensters und darf sich nur in dessen
Anwendungsbereich
(client area) bewegen.
Da wir zusätzlich WS_THICKFRAME
angegeben haben, kann man den Rahmen des zweiten Fensters mit der Maus
anpacken
und damit dessen
Größe
verändern. Der Code im zweiten CreateWindow(...) sieht nun
folgendermaßen
aus:
HWND hwnd2
= CreateWindow
(
szName,
"Dies ist unser zweites kleines Fenster",
WS_CHILD | WS_THICKFRAME,
200, 200, 200, 50,
hwnd,
NULL,
NULL,
NULL
);
ShowWindow
(hwnd2, SW_SHOWNORMAL);
UpdateWindow
(hwnd2);
Nach dem Kompilieren / Starten bietet sich folgendes Bild:
Systemmenü und
Titelzeile
des zweiten Fensters sind verschwunden,
und das zweite Fenster hat
klare Grenzen innerhalb des ersten Fensters.