Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [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

Windows GUI Vorlage

Lizenz:Erster Autor:Letzte Bearbeitung:
WTFPLMitgliedLothar Schirm 13.03.2021

Vielleicht wünscht sich mancher ein "Kochrezept" oder ein "Gerüst" für ein GUI, das man durch "Copy and Paste" und Modifizierungen und Erweiterungen vielseitig verwenden kann.

Im folgenden habe ich mir selbst eine kleine Vorlage mit der Windows API gebaut, die die gängigsten Elemente für ein GUI enthält. Als Gerippe dient der Code "hello.bas" aus den FreeBASIC examples\gui\win32 des FreeBASIC-Compilers. Um "hello.bas" zu verstehen, sollte man sich im FreeBASIC Manual das Tutorial "Windows API / Introduction to Message-Based Programming" in den Community Tutorials durchlesen. Oder auch dieses hier: code-beispiele/windows-gui/fenster-118.html.

In der Function WinMain wird mit "CreateWindowEx" das Fenster definiert. In der Function WndProc werden Menü und alle Controls in der Message "WM_CREATE" ebenfalls mit "CreateWindowEx" definiert. Die WM_COMMAND ist das Arbeitspferd und führt alles aus, was der Benutzer mit den Controls veranstalten möchte. Die entsprechenden Codeteile können natürlich auch in separate Ereignisprozeduren ausgelagert werden.

Da das Programm Testausgaben mit "Print" enthält, muss es als Konsolenprgramm kompiliert werden.

'===============================================================================
' WinAPI_GUI.bas
' Windows API GUI
' Vorlage mit Menue, Textbox, Editor, Buttons, Listbox
' Erstellt am 20.02.2021
' Letzte Bearbeitung am 22.02.2021
'===============================================================================

#include once "windows.bi"

Dim Shared As HMENU hMenu, hDatei, hHilfe
Dim Shared As HWND Edit1, Edit2, List1, Button1, Button2


Function WndProc(ByVal hWnd As HWND, ByVal Msg As UINT, ByVal wParam As WPARAM, _
                 ByVal lParam As LPARAM ) As LRESULT

  Dim As HFONT Font
  Dim As Integer i
  Dim As ZString*1024 text

    Function = 0

    Select Case Msg

        Case WM_CREATE

            'Menü:
            hMenu = CreateMenu()
            hDatei = CreateMenu()
            hHilfe = CreateMenu()
            InsertMenu(hMenu, 0, MF_POPUP, CInt(hDatei), "Datei")
            InsertMenu(hMenu, 0, MF_POPUP, CInt(hHilfe), "Hilfe")
            AppendMenu(hDatei, 0, 1, "Neu" )
            AppendMenu(hDatei, 0, 2, "Oeffnen" )
            AppendMenu(hDatei, 0, 3, "Speichern" )
            AppendMenu(hDatei, 0, 4, "Beenden" )
            AppendMenu(hHilfe, 0, 5, "?")
            SetMenu(hwnd, hMenu)

            'Controls:
        Var hStatic1 = CreateWindowEx(0, "STATIC", "Geben Sie hier einen Text ein:", _
                WS_VISIBLE Or WS_CHILD, _
                20, 20, 200, 20, hWnd, 0, 0, 0)
            Edit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "Text ...", WS_BORDER Or WS_VISIBLE Or WS_CHILD Or ES_AUTOHSCROLL, _
                20, 50, 200, 20, hWnd, 0, 0, 0 )
            Button1 = CreateWindowEx(0, "BUTTON", "Kopieren", WS_VISIBLE Or WS_CHILD, _
                60, 80, 100, 20, hWnd, 0, 0, 0 )
            Edit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "Bitte Text eingeben!", _
                WS_BORDER Or WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_MULTILINE Or ES_WANTRETURN, _
                20, 120, 300, 200, hWnd, 0, 0, 0 )
            Button2 = CreateWindowEx(0, "BUTTON", "Kopieren", WS_VISIBLE Or WS_CHILD, _
                340, 200, 100, 20, hWnd, 0, 0, 0 )
            List1 = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", _
                WS_BORDER Or WS_VISIBLE Or WS_CHILD Or WS_VSCROLL Or LBS_NOTIFY, _
                20, 350, 200, 200, hWnd, 0, 0, 0 )

            'Schriftart fuer den Editor:
            Font = CreateFont(0, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, FALSE, FALSE, _
        DEFAULT_QUALITY, DEFAULT_PITCH or FF_ROMAN, "Courier New")
            SendMessage(Edit2, WM_SETFONT, Cast(WPARAM, Font), True)
            SetWindowText(Edit2, "Bitte hier einen Text schreiben!")

            'Listbox befuellen:
            For i = 0 To 20
                text = "Eintrag Nr. " + Str(i)
                SendMessage(List1, LB_ADDSTRING, 0, Cast(LPARAM, @text))
            Next

        Case WM_COMMAND

            Select Case LoWord(wParam)
                'Menü:
                Case 1
                    MessageBox(0, "Neue Datei ...", "Datei", 0)
                Case 2
                    MessageBox(0, "Oeffnen ...", "Datei", 0)
                Case 3
                    MessageBox(0, "Speichern ...", "Datei", 0)
                Case 4
                    SendMessage(hWnd, WM_CLOSE, 0, 0)
                Case 5
                    MessageBox(0, "Ich kann Ihnen leider nicht helfen!", "Hilfe", 0)
            End Select

            Select Case HiWord(wParam)

                Case BN_CLICKED
                    Select Case lParam
                        Case Button1
                            'Text aus Edit1 auf die Konsole kopieren:
                            GetWindowText(Edit1, text, SizeOf(text))
                            text = RTrim(text)
                            Print text
                        Case Button2
                            'Text aus Edit2 auf die Konsole kopieren:
                            GetWindowText(Edit2, text, SizeOf(text))
                            text = RTrim(text)
                            Print text
                    End Select

                Case LBN_SELCHANGE
                    If lParam = List1 Then
                        'Gewählten Index mit Text auf Konsole ausgeben
                        i = SendMessage(List1, LB_GETCURSEL, 0, 0)
                        SendMessage(List1, LB_GETTEXT, i, Cast(LPARAM, @text))
                        text = RTrim(text)
                        Print i; Space(1); text
                    End If

            End Select

        Case WM_PAINT

        Case WM_SIZE

        Case WM_KEYDOWN
            'Beenden mit ESC-Taste:
            If(LoByte(wParam) = 27) Then PostMessage(hWnd, WM_CLOSE, 0, 0)

        Case WM_DESTROY
            PostQuitMessage(0)
            Exit Function

    End Select

    Return DefWindowProc(hWnd, Msg, wParam, lParam)

End Function


Function WinMain(ByVal hInstance As HINSTANCE, ByVal hPrevInstance As HINSTANCE, _
                  ByVal szCmdLine As zstring ptr, ByVal iCmdShow As integer) As integer

    Dim Msg As MSG
    Dim wcls As WNDCLASS
    Dim hWnd As HWND

    Function = 0

    with wcls
        .style         = CS_HREDRAW or CS_VREDRAW
        .lpfnWndProc   = @WndProc
        .cbClsExtra    = 0
        .cbWndExtra    = 0
        .hInstance     = hInstance
        .hIcon         = LoadIcon(0, IDI_APPLICATION )
        .hCursor       = LoadCursor(0, IDC_ARROW )
        .hbrBackground = Cast(HBRUSH,COLOR_WINDOW)
        .lpszMenuName  = 0
        .lpszClassName = @"MainWindow"
    End with

    If(RegisterClass( @wcls) = FALSE ) Then
         MessageBox(0, "Failed to register wcls", "Error", MB_ICONERROR )
         Exit Function
    End If

    'Fenster:
    hWnd = CreateWindowEx(0, @"MainWindow", "Windows GUI", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, _
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 650, 0, 0, hInstance, 0 )

    ShowWindow(hWnd, iCmdShow)
    UpdateWindow(hWnd)

    While( GetMessage(@Msg, 0, 0, 0 ) <> FALSE )
        TranslateMessage(@Msg )
        DispatchMessage(@Msg )
    Wend

    Return Msg.wParam

End Function

WinMain(GetModuleHandle(0), 0, Command(), SW_NORMAL)

End

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 11.03.2021 von MitgliedLothar Schirm angelegt.
  • Die aktuellste Version wurde am 13.03.2021 von MitgliedLothar Schirm gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen