Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [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!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Eventmanager.bi

Uploader:MitgliedMB Interactive Labs
Datum/Zeit:02.04.2010 20:09:16

'Mein Eventmanager nach vorlage von Modd
'Meine Gui soll als Anfang nicht mehr können als Bottons auf ein Fenster zeichen.
'Dazu nutze ich meine 2DGrafik.bi und meine aus ein vorherigen Projekt stammenden Grafikelemente
#Include "inc/2dgrafik.bi"

'Type um Bottons Werte zu erfassen
Type BottonType
    As Integer btnsx,btnsy,btnex,btney
    As Sub onClick 'Nimmt die Funktion auf die dann ausgeführt werden soll
End Type

'Der minimale Eventmanager
Type EventType
    Declare Function windowCreate(x As Integer, y As Integer, wndClick As Sub) As Integer
    Declare Function buttonCreate(startx As Integer, starty As Integer, endx As Integer, endy As Integer, onButtonClick As Sub) As Integer

    Declare Static Sub eventSub(temp As Any Ptr)

    As Sub windowClick

    As Integer wndx, wndy
    As Integer buttonZaehler
    As Integer terminate

    As ButtonType Ptr newButtonArray

    As Any Ptr mutex
    As Any Ptr eventSubThread
End Type

'Die Applikation initieren
Dim As EventType APP

'Vereinfachung der Syntax für den User
#Define WindowScreen APP.windowCreate
#Define Button APP.buttonCreate

'Um jetzt noch einen Selbstläufer aus dem ganzen zu machen, definieren wir ein StartMacro
#Macro StartAPP()
    Dim As String keyInput
    APP.mutex = MutexCreate 'Mutex erstellen

    'Hauptschleife des Fensters
    Do
        MutexLock(APP.mutex)
            keyInput = InKey
        MutexUnLock(APP.mutex)
    Sleep 15
    Loop While keyInput <> Chr(255, 107) 'X-Button zum Fenster schließen

    APP.terminate = 1 'Thread beenden
    ThreadWait(APP.eventSubThread) 'Auf Beendigung warten
    MutexDestroy(APP.mutex)
    DeAllocate(APP.newButtonArray) 'Gibt den Speicher wieder frei
#EndMacro

Function  EventType.windowCreate(x As  Integer, y As  Integer, wndClick As  Sub) As  Integer
    If wndClick = 0 Then 'hier wird geprüft, ob eine HandlerSub angegeben wurde
        Return 0 'FALSE
    EndIf
    If windowClick <> 0 Then 'hier wird überprüft, ob nicht schon ein Fenster erstellt wurde
        Return 0 'FALSE
    EndIf

    'Zuordnung der übergebenen Werte an den EventType
    wndx = x
    wndy = y
    windowClick = wndClick

    'Erstellen des Fensters
    ScreenRes wndx, wndy, 32

    'Hier wird der EventHandlerThread gestartet, @This ist der Übergabewert an die ThreadSub
    eventSubThread = ThreadCreate(Cast(Any Ptr, @eventSub), @This)

    Return 1 'TRUE
End Function

Function EventType.buttonCreate(startx As Integer, starty As Integer, endx As Integer, endy As Integer, onButtonClick As Sub) As Integer
    If startx < 0 Or starty < 0 Or endx > wndx Or endy > wndy Then 'prüfen ob der Button im Fenster liegt
        Print "Werte außerhalb des Bereichs"
        Return 0 'FALSE
    EndIf
    If onButtonClick = 0 Then 'checken ob eine HandlerSub angegeben wurde
        Print "Kein EventHandler definiert"
        Return 0 'FALSE
    EndIf

    'Zeichnen eines sehr einfachen Buttons
    Line (startx, starty)-(endx, endy), &hFFFFFF, BF
    Draw String (startx + (endx - startx)/2 - 4, starty + (endy - starty)/2 - 4), Str(buttonZaehler + 1), &h000000

    'Hier ist unser dynamisches Array. Es muss mit ReAllocate an die aktuelle Anzahl der Buttons angepasst werden
    newButtonArray = ReAllocate(newButtonArray, (buttonZaehler + 1) * SizeOf(ButtonType))

    'Zurodnung der übergebenen Werte an den ButtonType
    newButtonArray[buttonZaehler].btnsx = startx
    newButtonArray[buttonZaehler].btnsy = starty
    newButtonArray[buttonZaehler].btnex = endx
    newButtonArray[buttonZaehler].btney = endy
    newButtonArray[buttonZaehler].onClick = onButtonClick

    'Zähler hochzählen
    buttonZaehler += 1
End Function

Sub EventType.eventSub(temp As Any Ptr)
    'Die Übergabe des eigenen Types an die Sub ist nötig, die statische Sub sonst Probleme mit den Type-Variablen hat
    Dim As EventType Ptr uebergabe = temp

    Dim As Integer evt
    Dim As Integer mx, my, mb, mouse
    Dim As Integer i

    'Hauptschleife des EventHandlers
    Do
        Do 'Schleife für die Mausereignisse
            MutexLock(uebergabe->mutex)
            mouse = GetMouse(mx, my,, mb)
            If mouse = 0 And mb = 1 Then 'Falls geklickt wurde, wird die Maus-Schleife verlassen
                MutexUnLock(uebergabe->mutex)
                Exit Do
            EndIf
            MutexUnLock(uebergabe->mutex)
            If uebergabe->terminate = 1 Then Exit Sub 'Beenden des Threads auf Anweisung
                Sleep 15
        Loop

        'Für eine Überprüfung welcher Button nun geklickt wurde, muss dabei jeder geprüft werden
        For i = 0 To uebergabe->buttonZaehler
            If uebergabe->terminate = 1 Then Exit Sub 'Beenden des Threads auf Anweisung

                'Hier werden die Buttons überprüft, ob der Mausklick in ihrem Feld stattgefunden hat
                If uebergabe->newButtonArray[i].btnsx <= mx And mx <= uebergabe->newButtonArray[i].btnex And uebergabe->newButtonArray[i].btnsy <= my And my <= uebergabe->newButtonArray[i].btney Then
                    evt = 2 'Button wurde angeklickt. Welcher es war, wird durch den Index i angegeben
                    Exit For
                EndIf
        Next

        If evt <> 2 Then evt = 1 'Es wurde geklickt, aber kein Button wurde angeklickt, also war es das Fenster selbst

        'Hier wird das Event ausgewertet. In unserem einfachen Beispiel wir dabei nur unterschieden, ob ein Button oder das Fenster selbst geklickt wurde
        Select Case evt
            Case 1 'Fenster wurde angeklickt, starte die entsprechende Sub
            uebergabe->windowClick()
            Case 2 'Button wurde angeklickt, starte die entsprechende Sub
            uebergabe->newButtonArray[i].onClick()
        End Select

        evt = 0 'Rückstellen des Events
        Sleep 15
    Loop
End Sub