Pfeiltasten

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

    Hi, ich möchte gern ein Label mit den Pfeiltasten bewegen.
    Hab zwar viele Beiträge dazu gefunden, aber nichts so wirklich verstanden.
    Ich hab's jetzt schonmal mit wasd hinbekommen, aber auch eher per copy&past aus 'nem forum gezogen.

    VB.NET-Quellcode

    1. Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    2. Select Case e.KeyChar
    3. Case "w"
    4. lbl_snake.Top = lbl_snake.Top - 10
    5. Case "a"
    6. lbl_snake.Left = lbl_snake.Left - 10
    7. Case "s"
    8. lbl_snake.Top = lbl_snake.Top + 10
    9. Case "d"
    10. lbl_snake.Left = lbl_snake.Left + 10
    11. End Select
    12. End Sub


    könnt ihr mir da weiterhelfen?
    Gib mal Deiner Form

    VB.NET-Quellcode

    1. KeyPreview = True

    und Deinem Projekt

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On

    dann musst Du nur noch ändern:

    Quellcode

    1. Case "w" -> Case "w"c
    2. Case "a" -> Case "a"c

    usw., dann läuft es.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    2. Select Case e.KeyChar
    3. Case Keys.Top
    4. lbl_snake.Top = lbl_snake.Top - 10
    5. Case Keys.Left
    6. lbl_snake.Left = lbl_snake.Left - 10
    7. Case Keys.Down
    8. lbl_snake.Top = lbl_snake.Top + 10
    9. Case Keys.Right
    10. lbl_snake.Left = lbl_snake.Left + 10
    11. End Select
    12. End Sub

    Nicht getestet!
    Ich glaube, im GallileoOpenbook war ganz vorne in den Grundlagen ne Übung mit Panel bewegen...vllt mal dort schauen ;)


    Mfg, jmb.96 :)
    "People assume that time is a strict progression of cause to effect, but actually, from a non-linear, non-subjective viewpoint, it's more like a big ball of wibbly wobbly, ...timey wimey ...stuff."
    Da kannst Du lange versuchen, Pfeiltasten gehen auch nicht: e.KeyChar ist (man wundere sich) ein Character , also ein ASCII-Zeichen .- und dazu gehören Pfeiltasten nun mal nicht.

    Versuchs mal lieber mit dem KeyDown Event: das liefert einen "Virtual Key" aus der Keys Enumeration , und die kennt auch Pfeiltasten.

    Mehr von dem Zeugs hier
    Die Pfeiltasten lösen das Keydown der Form immer dann nicht aus, wenn andere Steuerelemente den Focus haben. Sie dienen nämlich dem wWeiterschalten de Focus zum nächsten Steuerelement. Es gibt aber eine Möglichkeit, das zu umgehen (Is auch bei MSDN so beschrieben):
    Du legst eine Picturebox als Dummy auf die Form. Du musst nun dafür sorgen, dass die den Focus bekommt und nimmst das KeyDown-event der Picturebox. Dort kannst du dann die Pfeiltasten nutzen mit e.keycode.left usw.
    Fiel fergnügen
    Vatter

    Edit: hab den Link wiedergefunden Einfach suchen mit "Pfeiltasten Keydown"
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hi Kangaroo,
    dann schau ma in meinen Link (is gleich der 1. Satz) :D
    Ich habe an dem Prob nähmlich auch schon ma n par stunden rumgewundert. Das Keydown wird nur aufgerufen, wenn die Form leer is. Stzt du auch nur einen Button oder Textbox drauf, isses vorbei. Probier das ma mitn Stop aus.
    Grutz
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Form.KeyPreview = True <-- sorgt dafür dass die Form auch jeden Tastendruck bekommt

    Mangafreak1995 schrieb:

    Form.KeyPreview = True <-- sorgt dafür dass die Form auch jeden Tastendruck bekommt

    Das trifft NICHT für die Pfeiltasten zu, (Siehe Link in Post Nr. 9) da hier der Focus mit Hilfe der Pfeiltasten weitergereicht wird.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    ich hab das grad eben reproduziert und komme nicht auf das Problem (siehe Screenshot im Anhang ... die schlechte Quali ist fürs Resourcen sparen ;)). Der Fokus wechselt zwar aber ich kann es abfangen. Der komplette verwendete Code seht ihr auf dem Screenshot.
    Bilder
    • true.jpg

      33,64 kB, 675×410, 473 mal angesehen
    Dein Code funktioniert wegen der Listview. Die erhält durch das beschreiben mit dem Item den Focus.
    Mach dir ma den Spass und mach die Anzeige mit Debug.Writeline und schmeiß die Listview raus. Es kommt nur das KeyUp-Event durch.
    Mit der Listview und Anzeige mit Debugfenster kommt Keydown erst, wenn alle Buttons durchlaufen wurden und die Listview den Focus hat (hängt auch von der Tab-Reihenfolge ab). Der Focus der Listview wird nämlich nicht über die Pfeiltasten an die Buttons zurückgegeben.
    Daher der Tip von MSDN eine PB unsichtbar auf die Form zu bringen und der immer den Focus zu geben. Dann stehen einem die Key-Events in der PB zur Verfügung.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    das ist nur ne Listbox ;) aber ok ich machs für Trace ... ja mir ist aufgefallen das nur einige KeyDowns durchkommen aber eig alle KeyUps

    Edit: du hast recht

    Trace schrieb:

    KeyUp (Down) -- Button1 is focused
    KeyUp (Left) -- Button3 is focused
    KeyUp (Up) -- Button1 is focused
    KeyUp (Right) -- Button1 is focused
    KeyUp (Down) -- Button2 is focused
    KeyUp (Down) -- Button4 is focused
    KeyUp (Left) -- Button2 is focused

    Falls jemand den Code will

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    2. Trace.Write("KeyDown (" & [Enum].GetName(GetType(Keys), e.KeyData) & ")")
    3. For Each item As Control In Controls
    4. Trace.WriteLineIf(item.Focused, item.Name & " is focused")
    5. Next
    6. End Sub
    7. Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
    8. Trace.Write("KeyPress (" & e.KeyChar & ")")
    9. For Each item As Control In Controls
    10. Trace.WriteLineIf(item.Focused, item.Name & " is focused")
    11. Next
    12. End Sub
    13. Private Sub Form1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
    14. Trace.Write("KeyUp (" & [Enum].GetName(GetType(Keys), e.KeyData) & ") -- ")
    15. For Each item As Control In Controls
    16. Trace.WriteLineIf(item.Focused, item.Name & " is focused")
    17. Next
    18. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mangafreak1995“ ()