Code-Beispiel
Fenster
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | raph ael | 21.02.2008 |
Fenster sind das Hauptthema der WinAPI. Es gibt hundert(e) Funktionen und Methoden, die sich auf Fenster beziehen. Hier zeige ich, wie man ein solches erzeugt. Ausführlich kommentiert und beschrieben.
Das Fenster kann verschoben, vergrößert, verkleinert usw. werden. Und wenn man in dieses klickt, wird der Text "Hallo Welt" in einer MessageBox ausgegeben.
#Include "windows.bi" 'Enthält WinAPI Definitionen
'Die WinMain- Funktion deklarieren. Wir rufen sie nämlich sofort auf:
Declare Function WinMain(hThisInstance As HINSTANCE,_ 'Die Instanz des Programms.
hPrevInstance As HINSTANCE,_ 'Irrelevant, aus Kompatiblitätsgründen
_ 'Vorhanden.
szCommand As String,_ 'Mit welchem Befehl das Programm aufgerufen wurde.
howToShow As Integer) As Integer 'Kann man (meines Wissens nach) aus FB nicht abfragen.
End WinMain(GetModuleHandle(NULL),_ 'GetModuleHandle(NULL) gibt uns die Instanz unseres
_ 'Programms
NULL,_ 'hPrevInstance muss NULL sein
Command(),_
SW_NORMAL)
Function WndProc(_ 'Fenster- Prozedur. Behandelt alles was der User macht.
hWnd As HWND,_ 'Das Handle zu unserem Fenster.
msg As UINT,_ 'Die Nachricht(beinhaltet Information was passiert ist).
wParam As WPARAM,_ 'Zusätzliche Infos zur Nachricht
lParam As LPARAM) As LRESULT 'Zusätzliche Infos zur Nachricht
Select Case msg
Case WM_CREATE
Return 0 'Alles OK, Fenster wurde erzeugt
Case WM_LBUTTONDOWN 'Linke Maustaste wurde gedrückt
MessageBox(hWnd, "Hallo Welt", "WinAPI", MB_OK Or MB_ICONINFORMATION)
Return 0
Case WM_DESTROY 'Das Fenster soll geschlossen werden
PostQuitMessage(0) 'Das Programm beenden
Return 0
Case Else 'Anderes (Maximieren, minimieren, Größe ändern...)
Return DefWindowProc(hWnd, msg, wParam, lParam) 'Das überlassen wir Windows.
End Select
End Function
Function WinMain(hThisInstance As HINSTANCE, hPrevInstance As HINSTANCE,_
szCommand As String, howToShow As Integer) As Integer
Dim wMsg As MSG
Dim wCls As WNDCLASS 'Beinhaltet Information zur Fensterklasse
Dim hWnd As HWND
With wCls
.style = CS_HREDRAW Or CS_VREDRAW 'Fenster- Stil
.lpfnWndProc = @WndProc 'Pointer zur Fensterprozedur
.cbClsExtra = 0
.cbWndExtra = 0 'Beides (im Moment) unwichtig.
.hInstance = hThisInstance 'Die Instanz des Programms
.hIcon = LoadIcon(NULL, IDI_APPLICATION) 'Das Icon des Programms
.hCursor = LoadCursor(NULL, IDC_ARROW) 'Standard- Cursor
.hbrBackground = GetStockObject(WHITE_BRUSH) 'Hintergrundfarbe
.lpszMenuName = NULL 'Kein Menü
.lpszClassName = @"WinAPITest" 'Klassenname
End With
'Klasse registrieren
If RegisterClass(@wCls) = FALSE Then 'Fehler
MessageBox(NULL, "Konnte Fensterklasse nicht registrieren.", "WinAPI Test",_
MB_OK Or MB_ICONERROR)
Return 1
EndIf
hWnd = CreateWindowEx(0,_ 'Extra- Style
@"WinAPITest",_ 'Klassenname
"WinAPI Test",_ 'Fenstertitel
WS_OVERLAPPEDWINDOW,_ 'Style
CW_USEDEFAULT,_ 'X- Koordinate
CW_USEDEFAULT,_ 'Y- Koordinate
200,_ 'Breite
100,_ 'Höhe
NULL,_ 'Übergeordnetes Fenster(Desktop = NULL)
NULL,_ 'Menü(keines)
hThisInstance,_ 'Instanz des Programms
NULL)
ShowWindow(hWnd, howToShow)
UpdateWindow(hWnd)
'Die Nachrichten- Schleife. Sie erhält die Nachrichten des Fensters und
'leitet sie an die WndProc weiter.
While GetMessage(@wMsg, NULL, 0, 0) <> FALSE
TranslateMessage(@wMsg) 'Extra- Behandlung(z.B. Tastendrücke)
DispatchMessage(@wMsg) 'Weitergabe an die WndProc
Wend
Return wMsg.wParam 'wMsg.wParam enthält jetzt den Exit- Code
'des Programms.
End Function
So, jetzt zu der genauen Bedeutung der WinAPI Funktionen, die Details, die ich in den Kommentaren nicht erwähnt habe:
GetModuleHandle
...liefert die Instanz eines Moduls. Wird NULL übergeben, bekommt man die Instanz des Programms, die GetModuleHandle aufgerufen hat.
DefWindowProc
DefWindowProc macht viele Sachen, z.B. das Fenster verschieben, die Größe ändern, Minimieren... Man übergibt dieser Funktion normalerweise die Sachen, die die WndProc auch erhalten hat.
RegisterClass
Registriert eine Klasse. In einer Fensterklasse werden einige Informationen über das Fenster gespeichert. Man kann viele Fenster mit der gleichen Fensterklasse erzeugen.
WNDCLASS Struktur
Name | Inhalt |
Style | Enthält Informationen über das Verhalten des Fensters (siehe MSDN für Details) |
lpfnWndProc | Ein Funktionspointer zur Fensterprozedur der Klasse. |
cbClsExtra | Extra- Speicher für die Klasse. Wenn angegeben, wird der Speicher mit NULL- Bytes initialisiert. |
cbWndExtra | Extra- Speicher für das Fenster. Mit NULL- Bytes initialisiert. |
hInstance | Instanz, welche die WndClass enhtält (normalerweise unsere Instanz) |
hIcon | Das Symbol. Wird sowohl im Fenster, der Taskleiste, im Taskmanager und im Alt+Tab Menü angezeigt. |
hCursor | Der Cursor. |
hbrBackground | Der Hintergrund. |
lpszMenuName | Pointer zu einer Zeichenkette, welche den Namen eines Menüs enthält. NULL heißt kein Menü. |
lpszClassName | Pointer zu einer Zeichenkette. Diese sollte einen Namen enthalten. Unter jenem wird die Klasse verfügbar. |
Mehr Infos zur WNDCLASS in der MSDN.
CreateWindowEx
Parameter | Beschreibung |
dwExStyle | Erweiterter Fenster- Stil. Ein DWORD. NULL heißt keiner. |
lpClassName | Name der vorher registrierten Klasse. |
dwStyle | Regulärer Stil des Fensters. |
x, y, nWidth, nHeight | Position und Größe des Fensters. CW_USEDEFAULT kann bei allen 4 Parametern verwendet werden. Dann wird die Standard- Position und Größe verwendet. |
hWndParent | Übergeordnetes Fenster. NULL ist der Desktop. |
hMenu | Menü. NULL heißt keines. |
hInstance | Instanz des Programms, welches mit dem Fenster verbunden werden soll. |
lpParam | Extra- Parameter fürs Fenster. Ein Pointer. Kann auch NULL sein (und das ist es meistens). |
Mehr Infos zu CreateWindowEx in der MSDN.
Und jetzt?
Ein gutes Tutorial ist das hier. Es behandelt Fenster, Steuerelemente und die GDI ausführlich.
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 21.02.2008 von raph ael angelegt.
- Die aktuellste Version wurde am 21.02.2008 von raph ael gespeichert.
|
|