Hallo,
Ist es möglich, mit dem KeyDown event die Y Position von einem Button zu ändern?
Speziell beim Button ist dies problematisch, da hier die Pfeiltasten eine andere Aufgabe haben, wenn mehrere Buttons auf einem Formular sind. Dann wechselt nämlich der Fokus zwischen diesen Schaltflächen. Aufgrund dieser speziellen Aufgabe, bekommst Du bei
einem Button dann auch kein KeyDown Ereignis, sobald die Pfeiltasten verwendet werden. Statt dessen kannst Du hier das PreviewKeyDown Ereignis verwenden. Dieses wird ausgelöst, bevor das KeyDown Ereignis vom Button selber ausgewertet wird und hier kannst Du
das Verhalten auch ändern:
Private Sub Button1_PreviewKeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs _
) Handles Button1.PreviewKeyDown
Dim lButton As Button = DirectCast(sender, Button)
Select Case e.KeyCode
Case Keys.Left
e.IsInputKey = True
lButton.Left -= 2
Case Keys.Right
e.IsInputKey = True
lButton.Left += 2
Case Keys.Up
e.IsInputKey = True
lButton.Top -= 2
Case Keys.Down
e.IsInputKey = True
lButton.Top += 2
End Select
End Sub
Durch e.IsInputKey = True
, wird das Standardverhalten unterdrückt. Ich möchte das jedoch nicht empfehlen. Der Anwender verlässt sich ggf. auf das Standardverhalten. Eine Option wäre, den Button erst dann zu verschieben, wenn bspw. die Steuerungs-Taste
(Strg) gedrückt wird. In dem Fall bekommst Du die Pfeiltasten auch wieder im KeyDown Ereignis:
Private Sub Button1_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs _
) Handles Button1.KeyDown
If e.Control Then
Dim lButton As Button = DirectCast(sender, Button)
Select Case e.KeyCode
Case Keys.Left
lButton.Left -= 2
Case Keys.Right
lButton.Left += 2
Case Keys.Up
lButton.Top -= 2
Case Keys.Down
lButton.Top += 2
End Select
End If
End Sub
Eine eigene Schleife innerhalb des Ereignisses ist nicht notwendig. Die (Preview)KeyDown Ereignisse werden solange wiederholt, bis der Anwender die Taste wieder losgelassen hat.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de