ich konnte es nicht lassen....
is bestimmt nicht die eleganteste lösung, und überarbeitenswert...
außerdem sinds längst nicht alle tasten, grad mit den sonderzeichen oder SHIFT muss man halt mal sehen wie man das dann löst...
mir war halt danach, das mal auszutesten.
ScreenKeyboard und echte Tastatur parallel.
"R" wird auch als RETURN angenommen, aber der RETURN-Key funzt.
witziger Weise wird der ENTER-Key (NumPad) als "-" registriert... k.a. wieso...
das kleine ScreenKeyboard:
Code: Alles auswählen
Dim KeyB.f(9,3)
Restore KeyCodes
For t=0 To 3
For n=0 To 9
Read a$
KeyB(n,t) = Asc(a$)
Next
Next
InitKeyboard()
InitSprite()
InitMouse()
OpenScreen(800,600,32,"keytest")
Repeat
ExamineKeyboard()
ExamineMouse()
ClearScreen($100408)
MX = MouseX() : MY = MouseY()
I$="":IN$=""
If KeyPres
KeyPres -1
Else
I$ = KeyboardInkey()
EndIf
If KeyboardReleased(#PB_Key_Return)
KeyPres = 5
IN$ = "R"
KX = 9
KY = 2
EndIf
If I$
KeyRow = 0
KeyLine = 0
Repeat
If Asc(I$) = KeyB(KeyRow,KeyLine)
KeyPres = 5
IN$ = I$
KX = KeyRow
KY = KeyLine
Else
KeyRow +1
If KeyRow = 10
KeyRow = 0
KeyLine +1
EndIf
EndIf
Until KeyPres > 0 Or KeyLine = 4
EndIf
If MouseButton(1)
ButPres = 1
ElseIf ButPres = 1
ButPres = 0
If MX < 200 And XY < 80
KeyPres = 5
KX = MX/20 : KY = MY/20
IN$ = Chr(KeyB(KX,KY))
EndIf
EndIf
If KeyPres = 5
If IN$ ="R"
Show$=""
Else
Show$ + IN$
If Len(Show$) > 40
Show$ = Right(Show$,40)
EndIf
EndIf
EndIf
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
FrontColor($FF8000)
Box(0,0,200,80,$804000)
If KeyPres
Box(20*KX,20*KY,20,20,$A05000)
EndIf
For n=0 To 9
Line(n*20+1,0,0,80,$402000)
Next
For n=0 To 3
Line(0,n*20+1,200,0,$402000)
Next
For n=0 To 10
Line(n*20,0,0,80,$C06000)
Next
For n=0 To 4
Line(0,n*20,200,0,$C06000)
Next
For t=0 To 3
For n=0 To 9
DrawText(5+20*n,3+20*t,Chr(KeyB(n,t)))
Next
Next
Line(20,300,400,0,$0040FF)
Line(20,320,400,0,$0040FF)
DrawText(20,303,Show$)
Line(MX,MY, 8,16,$0080C0)
Line(MX,MY,16, 8,$0080C0)
Line(MX,MY,24,24,$0080C0)
StopDrawing()
If KeyboardPushed(#PB_Key_Escape) : EXIT = 1 : EndIf
FlipBuffers()
Until EXIT = 1
End
DataSection
KeyCodes:
Data.s "1","2","3","4","5","6","7","8","9","0"
Data.s "q","w","e","r","t","z","u","i","o","p"
Data.s "a","s","d","f","g","h","j","k","l","R"
Data.s "y","x","c","v","b","n","m",",",".","-"
have fun.
PS
ein paar erklärungen...
ButPres fungiert als Flag für den MouseButton, damit der beim Release registriert wird, das verhintert mehrfachzeichen.
KeyPres wird auf 5 gesetzt, nur bei 5 wird die Taste registriert,
aber KeyPres fungiert gleichzeitig als Counter, damit die Taste 5 Frames lang Highlighted wird.
der RETURN-Key wird extra interpretiert, weil anscheinend Sonderzeichen nicht (alle) von KeyboardInkey() angenommen werden.
Die Schleife Repeat/Until KeyPres > 0 Or KeyLine = 4 erschien mir eleganter, als BREAK in geschachtelten For/Next
@unix
ja, das ist eine screen-, keine window-lösung.
wenn du ne WIN-lösung suchst, bist du mit ExamineKeyboard() aufm falschen Dampfer...
PPS:
kleine korrektur: rücksetzung der Row/Line-Variablen ergänzt und vorangestellt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.