Tutorial
Eventsystem
von MOD | Seite 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
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|