Mehrer Panel mit der gedrückten Maus markieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Mehrer Panel mit der gedrückten Maus markieren

    Hallo zusammen :) ,

    ich versuche mehrere dynamisch erzeugte Panel zu markieren(ändern der Hintergrundfarbe) indem ich bei dem Ersten die Maus klicke, gedrückt halte und über die anderen ziehe.
    Leider ist es gar nicht so einfach wie ich mir das vorgestellt habe ?( .

    Ich habe es schon mit folgenden Events für die Form als auch für die jeweiligen Panel versucht:
    -MouseHover
    -MouseMove
    -MouseDown
    -click..enter...usw

    Das Problem ist, dass solange die Maustaste gedrückt ist die anderen Events nicht mehr auslösen.

    Ich hoffe ihr habt die Idee die mir aktuell nicht einfällt :thumbsup:
    Du könntest Dir einfach im Form_MouseDown-EventHandler die Startkoordinaten der Maus merken und im MouseUp die Endkoordinaten und dann alle Controls durchgehen und schauen, ob Deine Panels dabei sind.
    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.

    crash schrieb:

    die anderen Events
    MouseMove auch?
    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!
    @VaporiZed
    -Danke, dass wäre eine Möglichkeit ich würde die Panel aber gern direkt beim überfahren mit der Maus markieren und nicht erst am Ende.
    Im Prinzip wie die Zellen im DGV wenn ich diese mit der Maus markiere.

    @RodFromGermany
    -Ja MouseMove auch, dachte das hätte ich geschrieben :rolleyes: .
    Das Problem ist das die gedrückte Maustaste die anderen Events stört.

    Also um das nochmal genauer zu erklären,
    Ich erstelle in meiner Form zig kleine Panel(7;30) und jeweils 1(Point) Abstand zum nächsten, nun möchte ich irgendwo auf einem Panel die Maus klicken und alle Panel die ich mit der Maus in diesem Zustand überfahre direkt markieren.

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

    @crash Mach ein kleines Testprojekt, das diesen Effekt reproduziert.
    Vergewissere Dich, dass sich dieses Projekt fehlerfrei compilieren lässt und das es diesen Effekt reproduziert.
    Hänge es als ZIP ohne die bin- und obj-Ordner an.
    Beschreibe, was wir tun müssen, um den Effekt zu reproduzieren.
    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 ok.

    in dem Beispiel hier kann ich die Panel markieren wenn ich vorher in der Form klicke und dann über die Panel ziehe.
    Ich möchte aber die Panel markieren wenn ich auf eines klicke und dann die Maus über die anderen Ziehe.

    VB.NET-Quellcode

    1. ​Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Form1
    4. Dim Abstand_Horizontal As Integer = 1
    5. Dim Abstand_Vertikal As Integer = 1
    6. Dim Spaltenhöhe As Integer = 30
    7. Dim SpaltenBreite As Integer = 7
    8. Dim location_KalenderStart As New Point(28, 28)
    9. Dim Aktuelle_Position_X As Integer = location_KalenderStart.X
    10. Dim Aktuelle_Position_Y As Integer = location_KalenderStart.Y
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. PanelGenerieren(50)
    13. End Sub
    14. Private Sub PanelGenerieren(ByVal PNL_Anzahl As Integer)
    15. For i = 1 To PNL_Anzahl
    16. Aktuelle_Position_X += (SpaltenBreite + Abstand_Horizontal)
    17. Dim pnl As New Panel
    18. With pnl
    19. .Name = i.ToString
    20. .Width = SpaltenBreite
    21. .Height = Spaltenhöhe
    22. .BackColor = Color.Black
    23. .Location = location_KalenderStart
    24. .Left = Aktuelle_Position_X
    25. .Top = Aktuelle_Position_Y
    26. .Parent = Me
    27. 'Events
    28. End With
    29. Me.Controls.Add(pnl)
    30. Next
    31. End Sub
    32. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    33. Dim ctrl As Control = Me.GetChildAtPoint(e.Location)
    34. If Not IsNothing(ctrl) Then
    35. If ctrl.GetType = GetType(Panel) Then
    36. Dim pnl As Panel = ctrl
    37. pnl.BackColor = Color.Yellow
    38. End If
    39. End If
    40. End Sub
    41. End Class
    Ich weiß zwar nicht, was es werden soll, aber das Form_MouseMove-Event feuert doch. Nutze es. Ausbaufähig, aber vom Prinzip her funktionierend:

    VB.NET-Quellcode

    1. Dim Capturing As Boolean = False, StartPoint As Point = Nothing
    2. Private Sub form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    3. Capturing = True
    4. StartPoint = e.Location
    5. End Sub
    6. Private Sub form1_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
    7. Capturing = False
    8. StartPoint = Nothing
    9. End Sub
    10. Private Sub form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    11. If Not Capturing Then Exit Sub
    12. For Each Panel In Me.Controls.OfType(Of Panel)
    13. Dim PanelRect = New Rectangle(Panel.Location.X, Panel.Location.Y, Panel.Width, Panel.Height)
    14. Dim MouseRubberBand = New Rectangle(StartPoint.X, StartPoint.Y, e.X, e.Y)
    15. Dim IntersectionRect = Rectangle.Intersect(MouseRubberBand, PanelRect)
    16. Dim PanelIsCaptured = IntersectionRect.Width > 0 OrElse IntersectionRect.Height > 0
    17. Panel.BackColor = If(PanelIsCaptured, Color.Green, Color.Transparent)
    18. Next
    19. End Sub


    ##########

    Achso. Das ist nicht, was Du willst, ok.
    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.
    Hi,

    kannst Du mal kurz erklären, was das alles am Ende werden soll? Ich frage, da es evtl. elegantere Wege gibt, das zu lösen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Du kannst einen kleinen Trick anwenden: Missbrauche Drag&Drop für Deine Zwecke. Stelle bei allen Panels AllowDrop auf True und dann:

    VB.NET-Quellcode

    1. Dim Capturing As Boolean = False, StartPoint As Point = Nothing
    2. Private Sub Panel_MouseUp(sender As Object, e As MouseEventArgs) Handles Panel1.MouseUp, Panel2.MouseUp, Panel3.MouseUp, Panel4.MouseUp
    3. Capturing = False
    4. StartPoint = Nothing
    5. End Sub
    6. Private Sub CheckForIntersection(sender As Object)
    7. If Not Capturing Then Exit Sub
    8. Dim Panel = DirectCast(sender, Panel)
    9. Dim PanelRect = New Rectangle(Panel.Location.X, Panel.Location.Y, Panel.Width, Panel.Height)
    10. Dim MouseRubberBound = New Rectangle(StartPoint.X, StartPoint.Y, MousePosition.X, MousePosition.Y)
    11. Dim IntersectionRect = Rectangle.Intersect(MouseRubberBound, PanelRect)
    12. Dim PanelIsCaptured = IntersectionRect.Width > 0 OrElse IntersectionRect.Height > 0
    13. Panel.BackColor = If(PanelIsCaptured, Color.Green, Color.Transparent)
    14. End Sub
    15. Private Sub Panel_DragEnter(sender As Object, e As DragEventArgs) Handles Panel1.DragEnter, Panel2.DragEnter, Panel3.DragEnter, Panel4.DragEnter
    16. CheckForIntersection(sender)
    17. End Sub
    18. Private Sub Panel_MouseDown(sender As Object, e As MouseEventArgs) Handles Panel1.MouseDown, Panel2.MouseDown, Panel3.MouseDown, Panel4.MouseDown
    19. Capturing = True
    20. StartPoint = e.Location
    21. DoDragDrop(sender, DragDropEffects.All)
    22. End Sub
    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.