Maus Events auf PictureBox

  • VB.NET

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

    Maus Events auf PictureBox

    Halli Hallo :)
    ich sehe wahrscheinlich den Wald vor lauter Bäumen nicht.

    Ich habe 5 Picture Boxen, die ein Rating System darstellen. Kennt man vom Internet her.

    Dazu habe ich:
    Für jede PB ein MouseHover, MouseLeave und Click Event.

    Wenn ich auf die 5. PB Hover und nicht klicke sollen alle anderen 5 Boxen aktiv (Bild ändern) werden. Selbiges für die 4 restlichen. Hover ich auf 4 sind PB 1,2,3,4 aktiv usw..
    - Das klappt.
    Verlasse ich mit der Maus den PB-Bereich wird das Leave Event ausgelöst und die PBoxen erhalten ihr Ursprungsbild.
    - Das klappt auch.

    Jetzt kommt die Verwirrung.
    Klicke ich auf eine PB bspw. 4 sollen PB 4,3,2,1 ihr Bild ändern. Bis dahin geht alles gut aber verlasse ich mit der Maus den Bereich wird wieder das Leave Event aktiv und setzt alles zurück.

    Meine Frage wäre, gibt es eine Möglichkeit das Leave Event nach einem Klick zu überspringen?

    Ich bedanke mich bei euch vorab!
    Grüße DKArts.


    Nach sonstige Problemstellungen verschoben
    -Artentus

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

    @dkartsberlin Liegen die PB unmittelbar nebeneinander oder ist da noch Form-Background drum herum?
    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!
    Du darfst die Events nicht starr per Handles abbonieren sondern musst diese per AddHandler und RemoveHandler gezielt steuern.
    Sobald auf eines der 5 PB geklickt wurde, muss du den Leave-Event abbestellen (per RemoveHandler).

    Hier wird es von @ErfinderDesRades sehr gut erkläre: Alles über Events

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    fichz schrieb:

    gezielt steuern
    Ist zwar prinzipiell richtig, ich persönlich halte das jedoch für überzogen. Mit nem Flag lässt sich das eben so gut lösen.
    Allerdings stelle ich mir da eher ein Compound-Bild vor, wo es nur noch eine einzige PB gibt.
    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!
    Ich würde dir raten, dass ganze als eigenes Control mit GDI+ zu erstellen. Wenn du das noch nicht kannst, wäre es ein Guter Start mit dem Thema GDI+.

    Weil das ganze mit PB's zu machen wäre mir zu Umständlich und etwas zu "Unsauber"
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    RodFromGermany schrieb:

    @dkartsberlin Liegen die PB unmittelbar nebeneinander oder ist da noch Form-Background drum herum?

    Das ist noch n bisschen Form-Background drum herum. (||||■||■||■||■||■||||)


    fichz schrieb:

    Du darfst die Events nicht starr per Handles abbonieren sondern musst diese per AddHandler und RemoveHandler gezielt steuern.
    Sobald auf eines der 5 PB geklickt wurde, muss du den Leave-Event abbestellen (per RemoveHandler).

    Hier wird es von @ErfinderDesRades sehr gut erkläre: Alles über Events

    lg

    Vielen Dank für den Hinweis. Genau so etwas habe ich gesucht.

    GDI+ fällt erst einmal heraus.

    Was genau meinst du mit Compund Bild? Ich verstehe das so: Im Bereich des CSS wird mein Problem idR mit nur einem Image gehandlet und über Klassen die dargestellten Bereiche definiert. Meinst du das?

    dkartsberlin schrieb:

    Compund Bild
    Nicht ganz.
    Du hast eine PictureBox und im Paint-Event / den Mouse-Events wird dann unterschieden, welcher Bildteil gerade dran ist zu malen bzw. zu reagieren.
    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!
    Das verstehe ich nicht... :/
    Hast du evtl. ein konkretes Beispiel für mich?

    Denn betrachte ich meinen Code, ist das auf Garantie nicht die eleganteste/performanteste Lösung.
    Ach und weil es mir gerade einfällt. Wie kann ich die Performance meines Codes bzw. Programms am idealsten messen/untersuchen?

    Vielen Dank an alle die mir bei meinem Problem helfen bzw. geholfen haben. Tolles Forum :)

    dkartsberlin schrieb:

    Beispiel
    Form mit PictureBox und Label:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private quartal As Integer = 0
    3. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    4. e.Graphics.Clear(Color.Aqua)
    5. e.Graphics.DrawString("1", Me.Font, Brushes.Black, New Point(PictureBox1.Width \ 4, PictureBox1.Height \ 4))
    6. e.Graphics.DrawString("2", Me.Font, Brushes.Black, New Point(3 * PictureBox1.Width \ 4, PictureBox1.Height \ 4))
    7. e.Graphics.DrawString("3", Me.Font, Brushes.Black, New Point(PictureBox1.Width \ 4, 3 * PictureBox1.Height \ 4))
    8. e.Graphics.DrawString("4", Me.Font, Brushes.Black, New Point(3 * PictureBox1.Width \ 4, 3 * PictureBox1.Height \ 4))
    9. End Sub
    10. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    11. quartal = 1
    12. If e.X > PictureBox1.Width \ 2 Then
    13. quartal += 1
    14. End If
    15. If e.Y > PictureBox1.Height \ 2 Then
    16. quartal += 2
    17. End If
    18. Label1.Text = quartal.ToString
    19. End Sub
    20. Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
    21. Me.PictureBox1.Invalidate()
    22. End Sub
    23. End Class
    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!
    Vielen Dank für deine Mühe. Allerdings trifft das nicht das was ich meine bzw. erreichen wollte.

    So habe ich es erst einmal gelöst. (Vorsicht, viel Code.) (Wenn jemand da eine Optimierungsidee hat, freue ich mich riesig.)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each PB As PictureBox In Me.Controls.OfType(Of PictureBox)()
    2. PB.Image = My.Resources._starlined
    3. Next
    4. Private Sub PictureBox1_MouseHover(sender As Object, e As EventArgs) Handles PictureBox1.MouseHover
    5. PictureBox1.Image = My.Resources._starfilled
    6. End Sub
    7. Private Sub PictureBox2_MouseHover(sender As Object, e As EventArgs) Handles PictureBox2.MouseHover
    8. PictureBox2.Image = My.Resources._starfilled
    9. PictureBox1.Image = My.Resources._starfilled
    10. End Sub
    11. Private Sub PictureBox3_MouseHover(sender As Object, e As EventArgs) Handles PictureBox3.MouseHover
    12. PictureBox3.Image = My.Resources._starfilled
    13. PictureBox2.Image = My.Resources._starfilled
    14. PictureBox1.Image = My.Resources._starfilled
    15. End Sub
    16. Private Sub PictureBox4_MouseHover(sender As Object, e As EventArgs) Handles PictureBox4.MouseHover
    17. PictureBox4.Image = My.Resources._starfilled
    18. PictureBox3.Image = My.Resources._starfilled
    19. PictureBox2.Image = My.Resources._starfilled
    20. PictureBox1.Image = My.Resources._starfilled
    21. End Sub
    22. Private Sub PictureBox5_MouseHover(sender As Object, e As EventArgs) Handles PictureBox5.MouseHover
    23. PictureBox5.Image = My.Resources._starfilled
    24. PictureBox4.Image = My.Resources._starfilled
    25. PictureBox3.Image = My.Resources._starfilled
    26. PictureBox2.Image = My.Resources._starfilled
    27. PictureBox1.Image = My.Resources._starfilled
    28. End Sub
    29. Private Sub PictureBox1_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox1.MouseLeave
    30. PictureBox1.Image = My.Resources._starlined
    31. End Sub
    32. Private Sub PictureBox2_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox2.MouseLeave
    33. PictureBox2.Image = My.Resources._starlined
    34. PictureBox1.Image = My.Resources._starlined
    35. End Sub
    36. Private Sub PictureBox3_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox3.MouseLeave
    37. PictureBox3.Image = My.Resources._starlined
    38. PictureBox2.Image = My.Resources._starlined
    39. PictureBox1.Image = My.Resources._starlined
    40. End Sub
    41. Private Sub PictureBox4_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox4.MouseLeave
    42. PictureBox4.Image = My.Resources._starlined
    43. PictureBox3.Image = My.Resources._starlined
    44. PictureBox2.Image = My.Resources._starlined
    45. PictureBox1.Image = My.Resources._starlined
    46. End Sub
    47. Private Sub PictureBox5_MouseLeave(sender As Object, e As EventArgs) Handles PictureBox5.MouseLeave
    48. PictureBox5.Image = My.Resources._starlined
    49. PictureBox4.Image = My.Resources._starlined
    50. PictureBox3.Image = My.Resources._starlined
    51. PictureBox2.Image = My.Resources._starlined
    52. PictureBox1.Image = My.Resources._starlined
    53. End Sub
    54. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    55. PictureBox5.Image = My.Resources._starlined
    56. PictureBox4.Image = My.Resources._starlined
    57. PictureBox3.Image = My.Resources._starlined
    58. PictureBox2.Image = My.Resources._starlined
    59. PictureBox1.Image = My.Resources._starfilled
    60. RemoveHandler PictureBox1.MouseLeave, AddressOf PictureBox1_MouseLeave
    61. lbl_rate1.Text = "1/5"
    62. End Sub
    63. Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click
    64. PictureBox5.Image = My.Resources._starlined
    65. PictureBox4.Image = My.Resources._starlined
    66. PictureBox3.Image = My.Resources._starlined
    67. PictureBox2.Image = My.Resources._starfilled
    68. PictureBox1.Image = My.Resources._starfilled
    69. RemoveHandler PictureBox1.MouseLeave, AddressOf PictureBox1_MouseLeave
    70. RemoveHandler PictureBox2.MouseLeave, AddressOf PictureBox2_MouseLeave
    71. lbl_rate1.Text = "2/5"
    72. End Sub
    73. Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles PictureBox3.Click
    74. PictureBox5.Image = My.Resources._starlined
    75. PictureBox4.Image = My.Resources._starlined
    76. PictureBox3.Image = My.Resources._starfilled
    77. PictureBox2.Image = My.Resources._starfilled
    78. PictureBox1.Image = My.Resources._starfilled
    79. RemoveHandler PictureBox1.MouseLeave, AddressOf PictureBox1_MouseLeave
    80. RemoveHandler PictureBox2.MouseLeave, AddressOf PictureBox2_MouseLeave
    81. RemoveHandler PictureBox3.MouseLeave, AddressOf PictureBox3_MouseLeave
    82. lbl_rate1.Text = "3/5"
    83. End Sub
    84. Private Sub PictureBox4_Click(sender As Object, e As EventArgs) Handles PictureBox4.Click
    85. PictureBox5.Image = My.Resources._starlined
    86. PictureBox4.Image = My.Resources._starfilled
    87. PictureBox3.Image = My.Resources._starfilled
    88. PictureBox2.Image = My.Resources._starfilled
    89. PictureBox1.Image = My.Resources._starfilled
    90. RemoveHandler PictureBox1.MouseLeave, AddressOf PictureBox1_MouseLeave
    91. RemoveHandler PictureBox2.MouseLeave, AddressOf PictureBox2_MouseLeave
    92. RemoveHandler PictureBox3.MouseLeave, AddressOf PictureBox3_MouseLeave
    93. RemoveHandler PictureBox4.MouseLeave, AddressOf PictureBox4_MouseLeave
    94. lbl_rate1.Text = "4/5"
    95. End Sub
    96. Private Sub PictureBox5_Click(sender As Object, e As EventArgs) Handles PictureBox5.Click
    97. PictureBox5.Image = My.Resources._starfilled
    98. PictureBox4.Image = My.Resources._starfilled
    99. PictureBox3.Image = My.Resources._starfilled
    100. PictureBox2.Image = My.Resources._starfilled
    101. PictureBox1.Image = My.Resources._starfilled
    102. RemoveHandler PictureBox1.MouseLeave, AddressOf PictureBox1_MouseLeave
    103. RemoveHandler PictureBox2.MouseLeave, AddressOf PictureBox2_MouseLeave
    104. RemoveHandler PictureBox3.MouseLeave, AddressOf PictureBox3_MouseLeave
    105. RemoveHandler PictureBox4.MouseLeave, AddressOf PictureBox4_MouseLeave
    106. RemoveHandler PictureBox5.MouseLeave, AddressOf PictureBox5_MouseLeave
    107. lbl_rate1.Text = "5/5"
    108. End Sub
    funzt das eiglich zuverlässig mit dem Mouse_Leave?

    Bei mir ist oft so, dass wenn man die Maus sehr schnell bewegt, dass dann das MouseLeave übersehen wird.

    Ansonsten - wenn du dich noch in Arbeit stürzen willst - könntest du das in ein UserControl auslagern - weil so wird das ja dein Form-Code gewaltig vollmüllen.

    dkartsberlin schrieb:

    was ich meine bzw. erreichen wollte
    Kannst Du das mal so ohne Programmiersprache und Programmbeispiel erläutern?
    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!

    ErfinderDesRades schrieb:

    funzt das eiglich zuverlässig mit dem Mouse_Leave?

    Bei mir ist oft so, dass wenn man die Maus sehr schnell bewegt, dass dann das MouseLeave übersehen wird.

    Ansonsten - wenn du dich noch in Arbeit stürzen willst - könntest du das in ein UserControl…


    Ich würde es als zuverlässig bezeichnen. Hatte bis jetzt bei jedem Test Glück, das der Handler aktiv wurde und die Boxen zurückgesetzt wurden.

    RodFromGermany schrieb:

    Zitat von dkartsberlin: „was ich meine bzw. erreichen wollte“Kannst Du das mal so ohne Programmiersprache und Programmbeispiel erläutern?

    Meinst du meinen Code? Oder warum dein Beispiel nicht gepasst hat?

    dkartsberlin schrieb:

    Meinst du meinen Code?
    Dein Problem / Deine Aufgabenstellung.
    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!
    Mein Problem war / (ist):
    Ich habe 5 Picture Boxen nebeneinander die im Form.Load Event mittels For Each-Schleife ein Bild bekommen, in meinem Fall einen silbernen Stern.
    Jetzt soll sobald ich über bspw. den ersten Stern Hover das Bild der PictureBox verändert werden zu einem goldenen Stern. Wenn ich den Bereich der PictureBox verlasse soll wieder das ursprüngliche Bild gesetzt werden. (Das funktioniert auch problemlos)

    Hover ich nun bspw über den dritten Stern sollen sich die Sterne 1 und 2 auch verändern. Selbiges gilt sobald ich die PictureBox verlasse. (Das funktioniert auch)

    Sobald ich auf einen Stern klicke z.B. dem vierten, sollen die Sterne 1,2,3,4 Gold werden (also Bild geändert werden). Zeitgleich wird beim Klicken das Mouse.Leave Event entfernt, damit die Sterne Gold bleiben und ein Label editiert. (Das funktioniert mittlerweile auch - das war der Grund zur Threaderstellung)

    Einziges kleines Manko: Klicke ich auf den 5 Stern und klicke dann über einen vorherigen Stern funktioniert, das Hovern aber nicht das Leave.

    Ich hoffe das es nun einigermaßen verständlich ist.

    Grüße. DK

    Ps: Danke für eure Hilfe :)

    dkartsberlin schrieb:

    aber nicht das Leave.

    dkartsberlin schrieb:

    Zeitgleich wird beim Klicken das Mouse.Leave Event entfernt
    Das wird es wohl sein.
    Wenn der Leave-Eventhandler weggenommen wurde, funktioniert kein Leave mehr. ;(
    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!

    dkartsberlin schrieb:

    oder
    Du schreibst mal für Dich auf, was genau in welcher Situation passieren soll und was außerdem passieren muss.
    Wenn Du das ordentlich strukturiert machst, wirdt Du ziemlich schnell die Stelle finden, wo Du die Handler wieder adden musst.
    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!