Hallo
habe da jetzt Mal eine mehrstufige Bremse zusammengebaut:
- die ersten 10 Events werden durchgelassen,
- bis 25 werden die Events nur alle 0.075 Sek durchgelassen,
- ab 25 nur noch alle 0.15 Sekunden.
- Eine Wheel-Pause von 0.5 Sekunden setzt alles wieder zurück.
- (korrigiert:) Events auf GUI-Ebene werden gleich weitergegeben.
Code: Alles auswählen
Function EinMWheelKey( aIn , lGUI )
Static nLastSecU := 0
Static nLastSecD := 0
Static nCountU := 0
Static nCountD := 0
Local lWheelOK := .F.
Local lNotInGUI := .T.
Local nSecChk := Seconds()
Local nFastCnt1 := 10 // Zähler
Local nFastCnt2 := 25 // Zähler
Local nFastRes := 0.5 // Sekunden
Local nSecSkip1 := 0.075 // Sekunden
Local nSecSkip2 := 0.15 // Sekunden
Local nSecSkipX
Local nDif
If aIn[6,2] >= 1 // UP
aIn[1] := xbeK_UP
Else
aIn[1] := xbeK_DOWN
EndIf
If lGUI .And. lNotInGUI
lWheelOK := .T.
Else
If aIn[6,2] >= 1 // UP
nCountD := 0
nCountU++
If nCountU <= nFastCnt1
lWheelOK := .T.
Else
If nCountU > nFastCnt2
nSecSkipX := nSecSkip2
Else
nSecSkipX := nSecSkip1
EndIf
nDif := nSecChk - nLastSecU
If nDif > nFastRes
nCountU := 1
lWheelOK := .T.
ElseIf nDif > nSecSkipX
lWheelOK := .T.
EndIf
EndIf
If lWheelOK
nLastSecU := nSecChk
EndIf
Else // DOWN
nCountU := 0
nCountD++
If nCountD <= nFastCnt1
lWheelOK := .T.
Else
If nCountD > nFastCnt2
nSecSkipX := nSecSkip2
Else
nSecSkipX := nSecSkip1
EndIf
nDif := nSecChk - nLastSecD
If nDif > nFastRes
nCountD := 1
lWheelOK := .T.
ElseIf nDif > nSecSkipX
lWheelOK := .T.
EndIf
EndIf
If lWheelOK
nLastSecD := nSecChk
EndIf
EndIf
EndIf
If lWheelOK
If lGUI
PostAppEvent( xbeP_Keyboard , aIn[1] , , aIn[7] )
Else
aIn[7]:Wheel := { | aPos , aWheel | MainWheelDistance( aWheel[2] ) }
EndIF
Else
aIn[1] := xbe_None
aIn[7] := NIL
EndIF
Return( aIn )
// aIn:
// 1 = nEvent
// 5 = mp1
// 6 = mp2
// 7 = oXbp