Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Windows GUI

Fenster

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Mitgliedraph 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

NameInhalt
StyleEnthält Informationen über das Verhalten des Fensters (siehe Externer Link!MSDN für Details)
lpfnWndProcEin Funktionspointer zur Fensterprozedur der Klasse.
cbClsExtraExtra- Speicher für die Klasse. Wenn angegeben, wird der Speicher mit NULL- Bytes initialisiert.
cbWndExtraExtra- Speicher für das Fenster. Mit NULL- Bytes initialisiert.
hInstanceInstanz, welche die WndClass enhtält (normalerweise unsere Instanz)
hIconDas Symbol. Wird sowohl im Fenster, der Taskleiste, im Taskmanager und im Alt+Tab Menü angezeigt.
hCursorDer Cursor.
hbrBackgroundDer Hintergrund.
lpszMenuNamePointer zu einer Zeichenkette, welche den Namen eines Menüs enthält. NULL heißt kein Menü.
lpszClassNamePointer zu einer Zeichenkette. Diese sollte einen Namen enthalten. Unter jenem wird die Klasse verfügbar.

Mehr Infos zur WNDCLASS in der Externer Link!MSDN.

CreateWindowEx

ParameterBeschreibung
dwExStyleErweiterter Fenster- Stil. Ein DWORD. NULL heißt keiner.
lpClassNameName der vorher registrierten Klasse.
dwStyleRegulärer Stil des Fensters.
x, y, nWidth, nHeightPosition 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.
hMenuMenü. NULL heißt keines.
hInstanceInstanz des Programms, welches mit dem Fenster verbunden werden soll.
lpParamExtra- Parameter fürs Fenster. Ein Pointer. Kann auch NULL sein (und das ist es meistens).

Mehr Infos zu CreateWindowEx in der Externer Link!MSDN.

Und jetzt?
Ein gutes Tutorial ist Externer Link!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 Mitgliedraph ael angelegt.
  • Die aktuellste Version wurde am 21.02.2008 von Mitgliedraph ael gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen