Syntax: SCREENEVENT [ (Ereignis) ]
Typ: Funktion
Kategorie: Eingabe/Ereignisverwaltung
SCREENEVENT gibt Informationen zu einem Systemereignis, welches das Grafikfenster betrifft, zurück.
- 'Ereignis' ist Pointer (ANY PTR) auf einen Datenpuffer, in dem die Informationen gespeichert werden sollen. Ausgegeben werden die Daten in Form des UDT (user defined type) 'EVENT'. Wird dieser Parameter ausgelassen, so wird nichts kopiert.
- Der Rückgabewert ist entweder -1, wenn Ereignisse aufgetreten sind, oder 0, wenn dies nicht der Fall ist.
Der Typ 'EVENT' ist folgendermaßen definiert:
TYPE EVENT FIELD = 1
type AS INTEGER
UNION
TYPE
scancode AS INTEGER
ascii AS INTEGER
END TYPE
TYPE
x AS INTEGER
y AS INTEGER
dx AS INTEGER
dy AS INTEGER
END TYPE
button AS INTEGER
z AS INTEGER
w AS INTEGER
END UNION
END TYPE
Diese Definition kann direkt aus der 'fbgfx.bi' übernommen werden; durch einfaches Einbinden der Datei mittels #INCLUDE ist der Typ (als Element des NAMESPACEs 'fb') verfügbar.
Diese Funktion gibt Informationen zu dem zuletzt aufgetretenen Systemereignis zurück, das in der GfxLib-Ereignistabelle eingetragen wurde. Ein Systemereignis ist eine Maus- oder Tastaturaktivität.
Sofern verfügbar werden die Informationen an die Adresse kopiert, auf die der Pointer 'Ereignis' zeigt. Dieser Pointer muss auf einen Speicherbereich zeigen, der mindestens 20 Bytes lang ist, da sonst Programmdaten überschrieben werden können, was zu unerwünschten Ergebnissen wie Programmabsturz führen kann.
In die ersten vier Bytes des Puffers wird im INTEGER-Format die ID des Ereignisses geschrieben, d.h. eine Zahl, die angibt, welches Ereignis aufgetreten ist. Welche Zahl welches Ereignis beschreibt, kann aus der Tabelle unten eingesehen werden.
Die restlichen 16 Bytes (vier INTEGER-Stellen) werden mit Informationen befüllt, die vom Typ des Ereignisses abhängig sind.
Generell ist es sinnvoll, auf den Speicherbereich wie auf einen EVENT PTR zuzugreifen, da so aussagekräftige Bezeichner für die Speicherstellen zur Verfügung stehen.
Wenn der Parameter 'Ereignis' ausgelassen wird, können keine Informationen kopiert werden; daher werden auch keine Ereignisse aus der GfxLib-Ereignistabelle entfernt. Ein Aufruf von SCREENEVENT ohne Parameter ist daher eine gute Möglichkeit, um zu prüfen, ob ein Ereignis aufgetreten ist, ohne diese tatsächlich abzufragen und auszuwerten, da der Rückgabewert angibt, ob ein relevantes Ereignis aufgetreten ist.
Folgende Bedeutung hat die erste INTEGER-Stelle (der Record .type des UDTs 'EVENT'):
(Bitte beachten Sie, dass die angegebenen Konstanten in der fbgfx.bi ebenfalls Element des NAMESPACEs 'fb' sind.)
Ereignisnummer | Konstante in der fbgfx.bi | Bedeutung |
---|---|---|
1 | EVENT_KEY_PRESS | Dieses Ereignis wird zurückgegeben, wenn eine Taste auf der Tastatur gedrückt wurde. In diesem Fall enthält der Record '.scancode' den plattformunabhängigen Scancode der Taste. Ist dieser Taste ein ASCII-Code zugeordnet, so kann dieser aus dem Record '.ascii' gelesen werden, andernfalls hat diese Stelle den Wert 0. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
2 | EVENT_KEY_RELEASE | Eine gedrückte Taste wurde wieder losgelassen. Die Records '.scancode' und '.ascii' werden in gleicher Weise ausgefüllt wie bei EVENT_KEY_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
3 | EVENT_KEY_REPEAT | Eine Taste wird so lange gedrückt gehalten, bis sie als wiederholter Tastenanschlag behandelt wird. Die Records '.scancode' und '.ascii' werden in gleicher Weise ausgefüllt wie bei EVENT_KEY_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
4 | EVENT_MOUSE_MOVE | Die Maus wurde bewegt, während sie sich auf dem Programmfenster befand. Die Records '.x' und '.y' enthalten die neuen Koordinaten des Mauszeigers. Die Records '.dx' und '.dy' enthalten die Differenz der alten Koordinaten zu den Neuen, geben also an, wie weit die Maus bewegt wurde. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
5 | EVENT_MOUSE_BUTTON_PRESS | Einer der Mausbuttons wurde gedrückt. Der Record '.button' gibt an, welcher das war; 1 symbolisiert dabei den linken, 2 den rechten und 3 den mittleren Mausbutton. Sie können auch die in der fbgfx.bi vordefinierten Konstanten 'BUTTON_LEFT', 'BUTTON_RIGHT' und 'BUTTON_MIDDLE' verwenden. Bitte beachten Sie, dass auch diese Konstanten Elemente des NAMESPACEs 'fb' sind. |
6 | EVENT_MOUSE_BUTTON_RELEASE | Einer der Mausbuttons wurde wieder losgelassen. Der Record '.button' wird in gleicher Weise ausgefüllt wie bei EVENT_MOUSE_BUTTON_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
7 | EVENT_MOUSE_DOUBLE_CLICK | Einer der Mausbuttons wurde doppelt angeklickt. Der Record '.button' wird in gleicher Weise ausgefüllt wie bei EVENT_MOUSE_BUTTON_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
8 | EVENT_MOUSE_WHEEL | Das Mausrad wurde benutzt. Die neue Position des Mausrads wird im Record '.z' eingetragen. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
9 | EVENT_MOUSE_ENTER | Die Maus wurde in das Programmfenster bewegt. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
10 | EVENT_MOUSE_EXIT | Die Maus wurde aus dem Programmfenster bewegt. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat. |
11 | EVENT_WINDOW_GOT_FOCUS | Das Programmfenster hat den Fokus bekommen (es wurde also zum aktiven Fenster). |
12 | EVENT_WINDOW_LOST_FOCUS | Das Programmfenster hat den Fokus verloren (es ist also in den Hintergrund getreten, da ein anderes Fenster jetzt den Fokus hat). |
13 | EVENT_WINDOW_CLOSE | Der User hat versucht das Fenster zu schließen (z.B. über den Schließen-Button in der Titelleiste oder über das Kontextmenü des Fensters in der Taskleiste). |
14 | EVENT_MOUSE_HWHEEL | Das horizontale Mausrad wurde benutzt. Die neue Position des Mausrads wird im Record '.w' eingetragen. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster (nur unter Windows) den Fokus hat. |
Beispiel:
#Include "fbgfx.bi"
Dim evt As FB.EVENT
Function x_Button(x As Integer) As Integer 'welcher Button
If x = FB.BUTTON_LEFT Then
Print "Die Linke";
ElseIf x = FB.BUTTON_RIGHT Then
Print "Die rechte";
ElseIf x = FB.BUTTON_MIDDLE Then
Print "Die mittlere";
ElseIf x = FB.BUTTON_X1 Then
Print "Die X1";
ElseIf x = FB.BUTTON_X2 Then
Print "Die X2";
End If
Return 0
End Function
ScreenRes 640, 480
Width 640\8, 480\16
Do
If ScreenEvent(@evt) Then
Select Case evt.type
Case FB.EVENT_KEY_PRESS
If evt.scancode = FB.SC_ESCAPE Then End
If evt.ascii > 0 Then
Print "'" & evt.ascii & "'";
Else
Print "eine unbekannte Taste";
End If
Print " wurde gedrueckt (Scancode " & evt.scancode & ")"
Case FB.EVENT_KEY_RELEASE
If evt.ascii > 0 Then
Print "'" & evt.ascii & "'";
Else
Print "eine unbekannte Taste";
End If
Print " wurde losgelassen (Scancode " & evt.scancode & ")"
Case FB.EVENT_KEY_REPEAT
If evt.ascii > 0 Then
Print "'" & evt.ascii & "'";
Else
Print "eine unbekannte Taste";
End If
Print " wird gehalten (Scancode " & evt.scancode & ")"
Case FB.EVENT_MOUSE_MOVE
Print "Maus wurde bewegt nach " & evt.x & ", " & evt.y & _
" (delta " & evt.dx & ", " & evt.dy & ")"
Case FB.EVENT_MOUSE_DOUBLE_CLICK
Locate CsrLin -2,1
x_Button(evt.button)
Print " Maustaste wurde doppelt gedrueckt"
Case FB.EVENT_MOUSE_BUTTON_PRESS
x_Button(evt.button)
Print " Maustaste wurde gedrueckt"
Case FB.EVENT_MOUSE_BUTTON_RELEASE
x_Button(evt.button)
Print " Maustaste wurde losgelassen"
Case FB.EVENT_MOUSE_WHEEL
Print "Das Mausrad wurde verstellt auf " & evt.z
Case FB.EVENT_MOUSE_ENTER
Print "Die Maus wurde in das Programmfenster bewegt"
Case FB.EVENT_MOUSE_EXIT
Print "Die Maus wurde aus dem Programmfenster bewegt"
Case FB.EVENT_WINDOW_GOT_FOCUS
Print "Das Programmfenster hat den Fokus erhalten"
Case FB.EVENT_WINDOW_LOST_FOCUS
Print "Das Programmfenster hat den Fokus verloren"
Case FB.EVENT_WINDOW_CLOSE
End
End Select
End If
Sleep 10
Loop
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17
Siehe auch:
SCREENRES, MULTIKEY, INKEY, GETMOUSE, NAMESPACE, USING (NAMESPACE), Grafik