fb:porticula NoPaste
Eventmanager.bi
Uploader: | MB 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