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!

Tutorial

Eventsystem

von RedakteurMODSeite 3 von 5

Jetzt fehlt noch der Code für die Functions und Subs.

...und der kommt jetzt:

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

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 19.03.2010 von RedakteurMOD angelegt.
  • Die aktuellste Version wurde am 25.04.2010 von RedakteurMOD gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen