Problem mit Tastensteuerung bei grafischer Darstellung

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von weißesnicht.

    Problem mit Tastensteuerung bei grafischer Darstellung

    Hallo Zusammen,

    Ich habe zu Testzwecken ein kleines Programm geschrieben, bei dem ein gezeichnetes Rechteck durch die Pfeiltasten bewegt werden soll. Die Tastensteuerung soll dabei aber so funktionieren, dass beim gedrückt halten der Taste keine Verzögerung abgewartet werden muss, sondern dass sich das Rechteck sofort in die entsprechende Richtung bewegt. Das klappt soweit ganz gut.

    Weiterhin soll beim Drücken der Leertaste das Rechteck die Farbe verändern, was auch funktioniert.

    Beim gleichzeitigen Drücken von mehreren Tasten gibt es aber ein Problem: Je nachdem, welche Tasten gleichzeitig gedrückt werden, reagiert das Programm unterschiedlich, was für mich völlig unverständlich ist.

    Man kann das Rechteck in (fast) alle Richtungen bewegen und gleichzeitig die Farbe ändern, bis auf die Richtung: links-oben. Hier scheint es so, als ob nur 2 Tasten verarbeitet werden (also z. B.: links + oben, Leer wird dann nicht mehr verarbeitet; oder links + leer, oben wird dann nicht mehr verarbeitet).

    Ich wäre sehr dankbar, wenn mir jemand erklären könnte bzw. den Weg aufzeigen könnte, warum sich das Programm so verhält.

    Hier der Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim G As Graphics
    3. Dim R As Rectangle
    4. Dim Rx As Integer = 50
    5. Dim Ry As Integer = 50
    6. Dim Links As Boolean = False
    7. Dim Rechts As Boolean = False
    8. Dim Rauf As Boolean = False
    9. Dim Runter As Boolean = False
    10. Dim Geschwindigkeit As Integer = 1
    11. Dim Farbe As Color = Color.Black
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. G = Me.CreateGraphics
    14. Timer1.Enabled = True
    15. Timer1.Interval = 20
    16. Timer1.Start()
    17. End Sub
    18. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    19. G.FillRectangle(New SolidBrush(Farbe), New Rectangle(Rx, Ry, 20, 20))
    20. End Sub
    21. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    22. If e.KeyCode = Keys.Escape Then
    23. Application.Exit()
    24. End If
    25. If e.KeyCode = Keys.Right Then
    26. Rechts = True
    27. End If
    28. If e.KeyCode = Keys.Left Then
    29. Links = True
    30. End If
    31. If e.KeyCode = Keys.Up Then
    32. Rauf = True
    33. End If
    34. If e.KeyCode = Keys.Down Then
    35. Runter = True
    36. End If
    37. If e.KeyCode = Keys.Space Then
    38. Farbe = Color.Red
    39. End If
    40. End Sub
    41. Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    42. If e.KeyCode = Keys.Left Then
    43. Links = False
    44. End If
    45. If e.KeyCode = Keys.Right Then
    46. Rechts = False
    47. End If
    48. If e.KeyCode = Keys.Up Then
    49. Rauf = False
    50. End If
    51. If e.KeyCode = Keys.Down Then
    52. Runter = False
    53. End If
    54. If e.KeyCode = Keys.Space Then
    55. Farbe = Color.Black
    56. End If
    57. End Sub
    58. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    59. If Links = True Then
    60. Rx = Rx - Geschwindigkeit
    61. End If
    62. If Rechts = True Then
    63. Rx = Rx + Geschwindigkeit
    64. End If
    65. If Rauf = True Then
    66. Ry = Ry - Geschwindigkeit
    67. End If
    68. If Runter = True Then
    69. Ry = Ry + Geschwindigkeit
    70. End If
    71. Invalidate()
    72. End Sub
    73. End Class
    Gleichzeitiges Drücken mehrerer Tasten ist in der WinForms-KeyPress-Verarbeitung nicht vorgesehen.

    Sondern da musst du die API bemühen - da gibt es iwas, mit dem man abfragen kann, ob eine bestimmte Taste gedrückt ist oder nicht.
    Diese Abfrage musste dann für jede einzelne in frage kommende Taste ausführen - und so ist dann auch möglich, festzustellen, welche Tasten gleichzeitig gedrückt sind.

    Ah - GetAsyncKeyState heisst die API-Funktion, verwendet hatte ich das mal in KeyDownTester und GetAsyncKeyState()
    Vielen Dank für die Antwort. Aber leider bin ich damit ziemlich überfordert.

    Sondern da musst du die API bemühen

    das überfordert mich schon, ebenso das verlinkte Programm.


    mit dem man abfragen kann, ob eine bestimmte Taste gedrückt ist oder nicht.
    Diese Abfrage musste dann für jede einzelne in frage kommende Taste ausführen - und so ist dann auch möglich, festzustellen, welche Tasten gleichzeitig gedrückt sind.

    mache ich das denn nicht schon über meine boolean-Variablen?


    Gleichzeitiges Drücken mehrerer Tasten ist in der WinForms-KeyPress-Verarbeitung nicht vorgesehen.

    Ich denke, ich halte mich an diesen Teil der Antwort. Verwirrend ist für mich nur, dass es nur bei einer bestimmten Tastenkombination nicht funktioniert, bei den anderen schon.

    ErfinderDesRades schrieb:

    Gleichzeitiges Drücken mehrerer Tasten ist in der WinForms-KeyPress-Verarbeitung nicht vorgesehen.
    Kann sein, aber er benutzt ja KeyDown und da mach ich das auch so und kann mindestens 6 Tasten benutzten.

    @weißesnicht Blöde Frage von mir, aber liegt das vielleicht an deiner Tastatur? Dein Beispiel funktioniert bei mir perfekt.
    GetAsyncKeyState böse, auch MS sagt, dass man RawInput verwenden soll für Games(Ja auch DirectInput ist veraltet)
    Wenn wir jetzt aber nicht soweit gehen wollen und direkt RawInput auslesen, dann kannst du immernoch bei KeyUp/KeyDown bleiben hältst dir wie du es machst boolean Variablen, nur dass man das Normalerweise über einem Array gleichzeitig für alle Tasten erledigt.

    Ich seh ehrlich gesagt auch keinen direkten Fehler in deinem Code, aber du könntest mal Debuggen, ob der BreakPoint ankommt oder nicht. Und falls nicht dann eben auf RawInput zurückgreifen
    msdn.microsoft.com/en-us/libra…op/ms645543(v=vs.85).aspx

    mit C Example(aber alles in .Net machbar)
    msdn.microsoft.com/en-us/libra…vs.85).aspx#standard_read
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Blöde Frage von mir, aber liegt das vielleicht an deiner Tastatur? Dein Beispiel funktioniert bei mir perfekt.

    Den Gedanken hatte ich auch schon und deshalb das Programm auf einem anderen Gerät getestet, allerdings mit dem gleichen Ergebnis. Beide Geräte sind vom gleichen Hersteller (Lenovo), allerdings unterschiedliche Modelle.

    Ich habe in der Zwischenzeit noch weitere Tasten ausprobiert (WASD + leer, mittels "or" an den entsprechenden Stellen eingebaut) und da funktioniert alles wie es soll. Dies und die Tatsache, dass auch bei Bluespide alles funktioniert, deutet meines Erachtens darauf hin, dass das Problem nicht im Code liegt.

    Ich habe jetzt noch die Möglichkeit an weiteren Geräten zu testen (Fujitsu und Lenovo), allerdings erst in ein paar Tagen. Vielleicht hilft das ja bei der Auflösung dieser Frage. Bis dahin schon mal vielen Dank an alle für die Hilfe.
    @weißesnicht 20 Millisekunden ist etwas zu flotttt. Im übrigen brauchst Du den Timer gar nicht, der verarbeitet ja den Output der KeyDown-Prozedur.
    Statt den Booleans links, rechts, rauf, runter machst Du ein Enum mit diesen Membern und NichtsTun und einer Variable vom Enum-Typ.
    Also:
    In KeyPress fragst Du die Tasten ab und invalidisierst das Zeichenfeld.
    Im Paint-Event zeichnest Du und löschst die Variable (NichtsTun reinschreiben).
    Feddich.
    KeyPress reagiert auf AutoRepeat. ;)
    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!
    @RodFromGermany: Ich habe jetzt mal versucht deinen Vorschlag umzusetzen, aber so ganz haut das bei mir leider nicht hin. Bei dieser Lösung habe ich folgende Probleme:

    1. Steuerung mit Pfeiltasten hab ich gar nicht hinbekommen, stattdessen nur WASD.
    2. Ich muss die Umschalttaste drücken, um das Rechteck zu bewegen. Ich finde aber nirgendwo "Werte" für Kleinbuchstaben.
    2. Die Verzögerung, die ich ursprünglich nicht wollte, ist wieder da. Zur Erklärung, was ich meine: Wenn ich die Taste drücke und gedrückt halte bewegt sich das Rechteck zunächst um einen Schritt, anschließend tritt die Verzögerung ein und erst danach bewegt sich das Rechteck weiter.
    3. Mehrere Tasten gleichzeitig funktioniert gar nicht.
    4. Mit KeyPress bekomme ich es nicht hin, dass die Farbe wieder automatisch zurück wechselt, deshalb nach wie vor KeyUp und KeyDown.

    Also entweder es scheitert an meiner Umsetzung, was sehr gut möglich ist (Anfänger), oder wir haben möglicherweise ein Stück weit aneinander vorbei geredet.


    Hier noch der Code zu deinem Vorschlag:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim G As Graphics
    3. Dim Rx As Integer = 50
    4. Dim Ry As Integer = 50
    5. Dim Geschwindigkeit As Integer = 1
    6. Dim Farbe As Color = Color.Black
    7. Dim Leer As Boolean = False
    8. Dim P As SolidBrush = New SolidBrush(Farbe)
    9. Enum Richtung
    10. NichtsTun = 0
    11. Links = 1
    12. Rechts = 2
    13. Rauf = 3
    14. Runter = 4
    15. End Enum
    16. Dim gewählteRichtung As Richtung
    17. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    18. G = Me.CreateGraphics
    19. End Sub
    20. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    21. If gewählteRichtung = Richtung.Runter Then
    22. Ry = Ry + Geschwindigkeit
    23. End If
    24. If gewählteRichtung = Richtung.Rauf Then
    25. Ry = Ry - Geschwindigkeit
    26. End If
    27. If gewählteRichtung = Richtung.Links Then
    28. Rx = Rx - Geschwindigkeit
    29. End If
    30. If gewählteRichtung = Richtung.Rechts Then
    31. Rx = Rx + Geschwindigkeit
    32. End If
    33. If Leer = True Then
    34. Farbe = Color.Red
    35. Else
    36. Farbe = Color.Black
    37. End If
    38. G.FillRectangle(New SolidBrush(Farbe), New Rectangle(Rx, Ry, 20, 20))
    39. gewählteRichtung = Richtung.NichtsTun
    40. End Sub
    41. Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
    42. If e.KeyChar = Convert.ToChar(27) Then 'Esc
    43. Application.Exit()
    44. End If
    45. If e.KeyChar = Convert.ToChar(87) Then 'W = 87 w = ? up = ?
    46. gewählteRichtung = Richtung.Rauf
    47. End If
    48. If e.KeyChar = Convert.ToChar(65) Then 'A = 65 a = ? left = ?
    49. gewählteRichtung = Richtung.Links
    50. End If
    51. If e.KeyChar = Convert.ToChar(83) Then 'S = 83 s = ? down = ?
    52. gewählteRichtung = Richtung.Runter
    53. End If
    54. If e.KeyChar = Convert.ToChar(68) Then 'D = 68 d = ? right = ?
    55. gewählteRichtung = Richtung.Rechts
    56. End If
    57. Invalidate()
    58. End Sub
    59. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    60. If e.KeyCode = Keys.Space Then
    61. Leer = True
    62. End If
    63. End Sub
    64. Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    65. If e.KeyCode = Keys.Space Then
    66. Leer = False
    67. End If
    68. Invalidate()
    69. End Sub
    70. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „weißesnicht“ ()

    weißesnicht schrieb:

    anschließend tritt die Verzögerung ein und erst danach bewegt sich das Rechteck weiter.
    Das sieht nach der AutoRepeat-Funktion des Systems aus.
    Klar, das Key_Press-Event löst nur Tasten und Steuertasten auf, nicht aber mehrere Tasten gleichzeitig, dazu brauchst Du API.GetAsyncKeyState().
    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!

    RodFromGermany schrieb:

    API.GetAsyncKeyState()

    Bitte nicht

    jvbsl schrieb:

    GetAsyncKeyState böse, auch MS sagt, dass man RawInput verwenden soll für Games(Ja auch DirectInput ist veraltet)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok, dann verfolge ich also "GetAsyncKeyState" vorläufig nicht weiter. Mein Versuch dazu, war ohnehin nicht erfolgreich und verstanden hab ich von dem was ich da eingefügt habe auch nichts. Hier noch der nicht-funktionierende der Code dazu:

    VB.NET-Quellcode

    1. 'https://www.vb-paradise.de/index.php/Thread/26042-GetAsyncKeyState-auf-64Bit-System/
    2. 'http://www.vbarchiv.net/api/api_getasynckeystate.html
    3. Public Class Form1
    4. Dim G As Graphics
    5. Dim Farbe As Color = Color.Black
    6. Dim Rx As Integer = 20
    7. Dim Ry As Integer = 20
    8. Enum Richtung
    9. NichtsTun
    10. Rauf
    11. Rechts
    12. Runter
    13. Links
    14. End Enum
    15. Dim gewählteRichtung As Richtung = Richtung.NichtsTun
    16. Dim Leer As Boolean = False
    17. Dim Geschwindikgkeit = 1
    18. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Integer) As Integer
    19. Public Const KeyPressed As Integer = -32767
    20. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    21. G = Me.CreateGraphics
    22. Timer1.Interval = 50
    23. Timer1.Enabled = True
    24. Timer1.Start()
    25. End Sub
    26. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    27. If gewählteRichtung = Richtung.Rauf Then
    28. Ry = Ry - Geschwindikgkeit
    29. End If
    30. If gewählteRichtung = Richtung.Rechts Then
    31. Rx = Rx + Geschwindikgkeit
    32. End If
    33. If gewählteRichtung = Richtung.Runter Then
    34. Ry = Ry + Geschwindikgkeit
    35. End If
    36. If gewählteRichtung = Richtung.Links Then
    37. Rx = Rx - Geschwindikgkeit
    38. End If
    39. If Leer = True Then
    40. Farbe = Color.Red
    41. Else
    42. Farbe = Color.Black
    43. End If
    44. G.FillRectangle(New SolidBrush(Farbe), New Rectangle(Rx, Ry, 20, 20))
    45. End Sub
    46. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    47. If GetAsyncKeyState(Keys.Escape) = KeyPressed Then
    48. Application.Exit()
    49. End If
    50. If GetAsyncKeyState(Keys.Space) = KeyPressed Then
    51. Leer = True
    52. Else
    53. Leer = False
    54. End If
    55. If GetAsyncKeyState(Keys.Up) = KeyPressed Then
    56. gewählteRichtung = Richtung.Rauf
    57. ElseIf GetAsyncKeyState(Keys.Right) = KeyPressed Then
    58. gewählteRichtung = Richtung.Rechts
    59. ElseIf GetAsyncKeyState(Keys.Down) = KeyPressed Then
    60. gewählteRichtung = Richtung.Runter
    61. ElseIf GetAsyncKeyState(Keys.Left) = KeyPressed Then
    62. gewählteRichtung = Richtung.Links
    63. Else
    64. gewählteRichtung = Richtung.NichtsTun
    65. End If
    66. Invalidate()
    67. End Sub
    68. End Class





    ​Ich denke, dass ich mit meinem ersten Versuch noch am ehesten an dem dran war, was ich eigentlich will.
    @jbvsl: Entschuldige bitte die blöde Frage, aber wie kann ich folgendes machen?

    ​ aber du könntest mal Debuggen, ob der BreakPoint ankommt oder nicht.
    Einen Breakpoint kannst du in einer Zeile mittels F9 setzen, wenn der Code an dieser Stelle ankommt wird diese Zeile gelb markiert und du kannst sonstige Debugging Schritte vornehmen
    msdn.microsoft.com/en-us/library/k0k771bt.aspx

    Wenn du das nun testen Möchtest setzt du den Breakpoint beim Space und drückst die anderen Beiden Tasten, dann Space, wenn der Debugger dann in der Zeile ankommt, dann wird es ausgeführt und das Problem liegt woanders.

    In Zukunft bitte pinvoke für Signaturen verwenden(und dann natürlich VB.Net nicht VB)
    pinvoke.net/default.aspx/user32/GetAsyncKeyState.html
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich habe im Code von Beitrag 1 in Zeile 40 einen Haltepunkt gesetzt und folgende Schritte durchgeführt:

    Programm starten > Rechteck steht an Startposition

    Pfeil nach oben gedrückt > Programm wechselt zur Codeansicht (Zeile 40)
    Auf "Weiter" geklickt > Programm läuft weiter: Rechteck bewegt sich nach oben

    Pfeil nach links gedrückt > Programm wechselt zur Codeansicht (Zeile 40)
    Auf "Weiter" geklickt > Programm läuft weiter: Rechteck bewegt sich nach links-oben

    Leertaste gedrückt > Programm wechselt zur Codeansicht (Zeile 40)
    Auf "Weiter" geklickt > Programm läuft weiter: Rechteck bewegt sich nach links-oben und ist rot. Das gewünschte Verhalten wird also hier erreicht.

    Habe ich nun richtig verstanden, dass der Code aus Beitrag 1 eigentlich ok ist?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „weißesnicht“ ()

    Ich habe den Haltepunkt jetzt also bei Zeile 41 gesetzt.

    Wenn ich das Programm starte und zwei Pfeiltasten gleichzeitig gedrückt halte, bewegt sich das Rechteck. Drücke ich zusätzlich die Leertaste, wechselt das Programm in die Codeansicht zum Haltepunkt. Nach einem Klick auf "Weiter" läuft das Programm weiter und das Rechteck ist rot.

    Ausnahme:Wenn ich die Tasten links + oben gedrückt halte, bewegt sich das Rechteck. Drücke ich zusätzlich die Leertaste, passiert nichts.


    Danke für deine Geduld :)
    Ich hatte heute morgen diesen Thread gelesen und hab den Code aus Post #1 in ein neues Projekt reinkopiert. Den beschriebenen Fehler konnte ich auch feststellen. Ich wünschte ich könnte konstruktiver sein, aber ich wollte mich gerade an eine weitere Fehlersuche machen, habe mir erneut den Code aus Post #1 in ein neues Projekt reinkopiert und es läuft. Ich kann alle Richtungstasten drücken und Space dazu. Habe zur Sicherheit mir noch Kontrollabels eingebaut, die mir anzeigen, wenn die Richtungstasten gedrückt werden. Es sind alle dabei. Schon ein wenig strange ...
    Hab mal den Code nochmal beigefügt. Außer die hinzugefügten Label ist alles gleich. Meines Erachtens. Ggf. schaut mal einer, ob es auch auf anderen Computern läuft. Hab auch nochmal die Exe getestet.

    Allerdings hatte ich wenig Schlaf. Mir fehlt die Konzentration, um den Verbessungsfehler zu finden.

    Sehr merkwürdig.
    Dateien
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das heißt es kommt auch tatsächlich nichts an-> Hardwarelimitierung, wenn du diese Tastenkombination erkennen möchtest, dann brauchst du eine andere Tastatur, schließlich haht die Tastatur nicht für jede Taste eine Seperate Leitung, natürlich würde es Sinn ergeben, bei USB Tastaturen einfach den ScanCode binär zu encodieren, scheint aber nicht der Fall zu sein(evtl. Aufgrund von Latenzen?)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @VaporiZed: Bei mir funktionierts mit dem Code aus deinem Zip nicht. Bei Links + Oben + Leer ändert sich die Farbe nicht und es wird auch im Label nichts angezeigt. Alle anderen Kombinationen funktionieren wieder.

    @jvbsl: Auch wenn ich eine externe Tastatur an meinem Notebook anschließe ändert sich nichts.

    Wenn ich WASD anstelle der Pfeiltasten verwende, funktionieren alle Richtungen auch mit der Leertaste. Schon seltsam. Nächste Woche habe ich Gelegenheit an ein paar weiteren Rechnern zu probieren. Ich gebe dann auf jeden Fall nochmal Rückmeldung.

    Vielen Dank an alle für die tolle Hilfe!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „weißesnicht“ ()

    @weißesnicht Sieht aus, als ob Du es tatsächlich nicht weißt. ;)
    Gemalt wird im Paint-Event mit der übergebenen Graphics-Instanz e.Graphics. Die von Dir erstellte Instanz ist wirkungslos.
    Dies in der Paint-Prozedur und da läuft schon mal was:

    VB.NET-Quellcode

    1. e.Graphics.FillRectangle(New SolidBrush(Farbe), New Rectangle(Rx, Ry, 20, 20))
    Und:
    Machst Du Option Strict On, damit Du die richtigen Datentypen und Konvertierungen verwendest.
    =========
    Du kannst dann die Leertaste in das Enumber aufnehmen und die separate Variable Leer löschen.
    Mit Ohne Timer und den Events KeyDown und KeyUp sieht das dann so aus Du darfst dann den Timer nicht starten):
    Timer.Enabled = True und Timer.Start() ist identisch, da genügt eins von.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    2. Dim Farbe = Color.Black
    3. If gewählteRichtung = Richtung.Rauf Then
    4. Ry -= Geschwindikgkeit
    5. ElseIf gewählteRichtung = Richtung.Rechts Then
    6. Rx += Geschwindikgkeit
    7. ElseIf gewählteRichtung = Richtung.Runter Then
    8. Ry += Geschwindikgkeit
    9. ElseIf gewählteRichtung = Richtung.Links Then
    10. Rx -= Geschwindikgkeit
    11. ElseIf gewählteRichtung = Richtung.Leer Then
    12. Farbe = Color.Red
    13. End If
    14. e.Graphics.FillRectangle(New SolidBrush(Farbe), New Rectangle(Rx, Ry, 20, 20))
    15. End Sub
    16. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    17. If e.KeyCode = Keys.Escape Then
    18. Application.Exit()
    19. ElseIf e.KeyCode = Keys.Right Then
    20. gewählteRichtung = Richtung.Rechts
    21. ElseIf e.KeyCode = Keys.Left Then
    22. gewählteRichtung = Richtung.Links
    23. ElseIf e.KeyCode = Keys.Up Then
    24. gewählteRichtung = Richtung.Rauf
    25. ElseIf e.KeyCode = Keys.Down Then
    26. gewählteRichtung = Richtung.Runter
    27. ElseIf e.KeyCode = Keys.Space Then
    28. gewählteRichtung = Richtung.Leer
    29. End If
    30. Invalidate()
    31. End Sub
    32. Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    33. gewählteRichtung = Richtung.NichtsTun
    34. Invalidate()
    35. End Sub

    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!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()

    Sieht aus, als ob Du es tatsächlich nicht weißt.

    Vielleicht sollte ich dem Namen auch noch ein "und-kapiert-auch-nichts" hinzufügen. ;)

    Aber der Reihe nach:
    Option Strict On - mach ich.

    Das Zeichnen mit CreateGraphics ist wohl nur die zweit beste Lösung? Ich glaube jedoch, dass es bei meinem Code egal wäre ob e.graphics oder CreateGraphics. Meines (sehr begrenzten) Wissens ist der Nachteil von CreateGraphics dass evtl. Teile der Zeichnung verschwinden können, wenn z. B. ein Fenster drüber liegt, oder ähnliches. Sowas sagen zumindest meine Quellen (openbooks, dieses Forum, msdn). Nun ist es ja so, dass ich mit Hilfe des Timers ständig neu zeichne, somit würde dieser Effekt nicht auftreten. Aber um ehrlich zu sein, habe ich mir darüber vorher gar keine Gedanken gemacht, sondern einfach drauf los gecodet und ich ändere das sehr gerne, denn es ist schließlich ja auch weniger Code.

    Warum ist die von mir erstelle Instanz wirkungslos. Ich zeichne doch darin erfolgreich, oder nicht?

    Die Sache mit dem Timer: Ich glaube, da reden wir etwas aneinander vorbei, bzw. vielleicht habe ich nicht klar gemacht, was ich will. Deshalb nochmal: Ich möchte, dass sich das Rechteck fließend bewegt, d. h. nicht erster Schritt, dann Verzögerung, dann weiterbewegen. Nein, es soll sobald die Taste gedrückt wird eine fließende Bewegung stattfinden. Sobald die Taste losgelassen wird, soll die Bewegung aufhören. Weiterhin sollen verschiedene Tasten gleichzeitig möglich sein, d. h. es sollen z. B. diagonale Bewegungen möglich sein und auch z. B. die Farbänderung durch die Leertaste. Das ganze habe ich mit Timer und den boolean-Variablen gelöst. Mit dem Enum und ohne Timer bekomme ich ein solches Verhalten leider nicht hin. Mein Programm aus Beitrag 1 hat insofern eigentlich schon genau meine Anforderungen erfüllt. Das Problem war, dass es nur in einer bestimmten Richtung eben nicht funktioniert hat. Dieses unlogische Verhalten hat dann dazu geführt, dass ich den Thread hier erstellt habe, weil ich selber nicht mehr weiter wusste.