Keypad mit 12 Tasten (10 Ziffern + OK + Korrektur):
Code: Alles auswählen
; Keypad mit 12 Tasten
; Eine Anzahl Ziffern müssen in der richtigen Reihenfolge angeklickt und dann mit OK bestätigt werden.
; Esc = Ende
EnableExplicit
#Stretch = 60 ; Fenstergröße = #Stretch * 3
#Code = "5193" ; beliebige Codelänge (mögliche Zeichen: 0...9)
#DrkGrn = $0DAB06 ; dunkelgrün
Global keyboard, canvas, xst, yst, nbr, code$
LoadFont(1, "Arial", #Stretch / 3, #PB_Font_Bold)
Procedure ShowKeypad(x = 0, y = 0, width = 3 * #Stretch, height = 4 * #Stretch)
Protected aa, ss = #Stretch/20, cnt, mc
keyboard = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
canvas = CanvasGadget(#PB_Any, 0,0, width, height)
AddKeyboardShortcut(keyboard, #PB_Shortcut_Escape, 111) ; Fenster kann mit Escape geschlossen werden
StartDrawing(CanvasOutput(canvas))
Box(0, 0, 3 * #Stretch, 4 * #Stretch, #White) ; Grundfarbe
For aa = 0 To ss
Line(#Stretch - (ss / 2) + aa, 0, 1, 4 * #Stretch, #Black) ; vertikal
Line((#Stretch * 2) - (ss / 2) + aa, 0, 1, 4 * #Stretch, #Black) ; vertikal
Line(0, #Stretch - (ss / 2) + aa, 3 * #Stretch, 1, #Black) ; horizontal 1
Line(0, (#Stretch * 2) - (ss / 2) + aa, 3 * #Stretch, 1, #Black) ; horizontal 2
Line(0, (#Stretch * 3) - (ss / 2) + aa, 3 * #Stretch, 1, #Black) ; horizontal 3
Next
DrawingFont(FontID(1))
For cnt = 0 To 8
mc = cnt % 3 ; Modulo will nicht mit Fließkommazahlen zusammenarbeiten
DrawText((0.4 + mc) * #Stretch, (0.3 + Int(cnt / 3)) * #Stretch, Str(cnt + 1), #Black, #White)
Next
DrawText(0.4 * #Stretch, (0.3 + 3) * #Stretch, "C", #Red, #White)
DrawText(1.4 * #Stretch, (0.3 + 3) * #Stretch, "0", #Black, #White)
DrawText(2.2 * #Stretch, (0.3 + 3) * #Stretch, "OK", #DrkGrn, #White)
StopDrawing()
EndProcedure
Procedure resetNumber()
; löscht die grünen Punkte 200ms nach dem Klick
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch / 3, #White)
DrawingFont(FontID(1))
Select nbr
Case 0 To 9
DrawText(xst - #Stretch / 10, yst - #Stretch / 5, Str(nbr), #Black, #White)
Case 10
DrawText(0.4 * #Stretch, (0.3 + 3) * #Stretch, "C", #Red, #White)
Case 12
DrawText(2.2 * #Stretch, (0.3 + 3) * #Stretch, "OK", #DrkGrn, #White)
EndSelect
StopDrawing()
RemoveWindowTimer(keyboard, 333)
EndProcedure
Procedure onLeftklick()
; Die Nummer von dem Feld, auf das geklickt wurde, in nbr speichern.
; Die Position von dem Feld, auf das geklickt wurde, in xst und yst speichern.
; Grüne Punkte bei jedem Klick auf ein Feld setzen.
; Timer setzen um jeden Punkt nach 0,2s wieder zu entfernen.
; Die Nummern sammeln und bei Klick auf "CR" auswerten.
Protected xx, yy
xx = WindowMouseX(keyboard) / #Stretch
yy = WindowMouseY(keyboard) / #Stretch
Select yy
Case 0 : nbr = xx + 1
Case 1 : nbr = xx + 4
Case 2 : nbr = xx + 7
Case 3 : nbr = xx + 10
EndSelect
xst = (0.5 + xx) * #Stretch
yst = (0.5 + yy) * #Stretch
; grüne Punkte in den Feldern anzeigen, auf die geklickt wurde
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch / 3, #DrkGrn)
StopDrawing()
AddWindowTimer(keyboard, 333, 200) ; grüne Punkte nach 200ms wieder löschen
Select nbr
Case 1 To 9
code$ = code$ + Str(nbr)
Case 10
code$ = Left(code$, Len(code$) - 1) ; Backspace
; code$ = "" ; alternativ
Case 11
nbr = 0
code$ = code$ + "0" ; Null
Case 12
If code$ = #Code
Debug "Ok"
Else
Debug "Fehler"
EndIf
code$ = ""
EndSelect
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define event
ShowKeypad()
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
If EventType() = #PB_EventType_LeftClick
onLeftklick()
EndIf
Case #PB_Event_Timer
If EventTimer() = 333
resetNumber() ; die grünen Punkte wieder löschen
EndIf
Case #PB_Event_Menu
If EventMenu() = 111
Break ; Escape-Taste zum beenden
EndIf
EndSelect
ForEver
CompilerEndIf
Keypad mit 9 Tasten (Ziffern 1...9):
Code: Alles auswählen
; Keypad mit 9 Tasten
; In einer vorgegebenen Zeit muss eine Anzahl Ziffern in der richtigen Reihenfolge angeklickt werden.
; Esc = Ende
EnableExplicit
#Stretch = 60 ; Fenstergröße = #Stretch * 3
#Code = "5193" ; beliebige Codelänge (mögliche Zeichen: 1...9)
#ReplyNow = 1 ; 1 = Antwortet sofort, 0 = wartet bis #TimeOut abgelaufen ist und wertet dann erst die geklickten Felder aus
#Color = $0DAB06 ; grün
#TimeOut = 2000 ; ms zwischen den Klicks
Global keyboard, canvas, xst, yst, nbr, code$
LoadFont(1, "Arial", #Stretch/3, #PB_Font_Bold)
Procedure ShowKeypad(x = 0, y = 0, width = 3*#Stretch, height = 3*#Stretch)
Protected aa, ss = #Stretch/20, cnt, mc
keyboard = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
canvas = CanvasGadget(#PB_Any, 0,0, width, height)
AddKeyboardShortcut(keyboard, #PB_Shortcut_Escape, 111) ; Fenster kann mit Escape geschlossen werden
StartDrawing(CanvasOutput(canvas))
Box(0, 0, 3 * #Stretch, 3 * #Stretch, #White) ; Grundfarbe
For aa = 0 To ss
Line(#Stretch - (ss / 2) + aa, 0, 1, 3 * #Stretch, #Color)
Line((#Stretch * 2) - (ss / 2) + aa, 0, 1, 3 * #Stretch, #Color)
Line(0, #Stretch - (ss / 2) + aa, 3 * #Stretch, 1, #Color)
Line(0, (#Stretch * 2) - (ss / 2) + aa, 3 * #Stretch, 1, #Color)
Next
DrawingFont(FontID(1))
For cnt = 0 To 8
mc = cnt % 3 ; Modulo will nicht mit Fließkommazahlen zusammenarbeiten
DrawText((0.4 + mc) * #Stretch, (0.3 + Int(cnt / 3)) * #Stretch, Str(cnt + 1), #Color, #White)
Next
StopDrawing()
EndProcedure
Procedure resetNumber()
; löscht die grünen Punkte
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch/4, #White)
DrawingFont(FontID(1))
DrawText(xst - #Stretch/10, yst - #Stretch / 5, Str(nbr), #Color, #White)
StopDrawing()
RemoveWindowTimer(keyboard, 333)
EndProcedure
Procedure onLeftklick()
; die Nummer von dem Feld ermitteln, auf das geklickt wurde
Protected xx, yy
RemoveWindowTimer(keyboard, 222)
xx = WindowMouseX(keyboard) / #Stretch
yy = WindowMouseY(keyboard) / #Stretch
Select yy
Case 0 : nbr = xx + 1
Case 1 : nbr = xx + 4
Case 2 : nbr = xx + 7
EndSelect
xst = (#Stretch / 2) + (#Stretch * xx)
yst = (#Stretch / 2) + (#Stretch * yy)
; grüne Punkte in den Feldern anzeigen, auf die geklickt wurde
StartDrawing(CanvasOutput(canvas))
Circle(xst, yst, #Stretch / 4, #Color)
StopDrawing()
AddWindowTimer(keyboard, 333, 200) ; grüne Punkte nach 200ms wieder löschen
code$ = code$ + Str(nbr)
AddWindowTimer(keyboard, 222, #TimeOut)
If #ReplyNow = 1
If Len(code$) = Len(#Code) ; wenn alle nötigen Klicks erfolgt sind
If code$ = #Code
Debug "Ok"
Else
Debug "Codefehler"
EndIf
RemoveWindowTimer(keyboard, 222)
code$ = ""
EndIf
EndIf
EndProcedure
Procedure onTimeout()
RemoveWindowTimer(keyboard, 222)
If #ReplyNow = 1
Debug "Zeitfehler"
Else
If code$ = #Code
Debug "Ok"
Else
Debug "Fehler"
EndIf
EndIf
code$ = ""
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define event
ShowKeypad()
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
If EventType() = #PB_EventType_LeftClick
onLeftklick()
EndIf
Case #PB_Event_Timer
Select EventTimer()
Case 222
onTimeout()
Case 333 ; die grünen Punkte wieder löschen
resetNumber()
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case 111 ; Escape-Taste
Break
EndSelect
EndSelect
ForEver
CompilerEndIf