Steuerelement Größe während der Laufzeit ändern mit hilfslinie

  • VB.NET

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

    Steuerelement Größe während der Laufzeit ändern mit hilfslinie

    Hallo Leute!
    Wie Programmiere ich eine Hilfslinie, wenn ein Steuerelement in der Laufzeit die Größe bzw. die Position geändert wird?
    Denn unter IDE sieht man mittels Linie, ob ein Steuerelement die gleiche Höhe hat wie das andere Steuerelement, die daneben befindet ?( ?

    Danke im Vorraus!!
    Hallo,

    verstehe deine Frage nicht ganz. Wenn du zur Laufzeit die Steuerelemente verschiebst oder die Größe änderst, dann machst du des doch über Code - wie sollen da Hilfslinien angezeigt werden.
    Oder willst du während der Laufzeit die Controls "mit der Maus" verschieben?

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    @tommy Bei welcher Gelegenheit und in was für einem Projekt soll denn diese Linie zum Einsatz kommen?
    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!
    Hallo florian03!
    Na klar, mach ich das während der Laufzeit sonst wäre die fragen doch sinnlos Oder :D

    Hallo RodFromGermany!
    Also ich habe ein Projekt Geschieben, die Dynamisch aufgebaut ist.
    Das heißt, der Benutzer kann mit diesem Programm Steuerelementen positionieren und vergrößern/verkleiner wie er es gerne hätte.
    Das Verschieben und Größen Änderung habe ich schon, nun habe ich es noch etwas verbessert, nun würde ich gerne als Sahne Häubchen das diese
    Linie angezeigt werden, um es schöner bzw. genauer Positionieren kann.

    Ich habe es so aufgebaut, das die Steuerelemente auf dem Panel platziert werden, und der Benutzer kann es mit der Maus bewegen und Größe ändern.
    Und mit den Tasten rauf/runter/Links/rechts bewegen.
    Für Größen Änderungen sind 8 Label rundherum um das Steuerelement platziert.

    Nur weiß ich nicht wie ich das überprüfen soll, ob das eine Steuerelement die gleiche Höhe oder Links/rechts etc. befindet, wie das andere, damit die Linie angezeigt wird.
    Ich habe mir gedacht das ihr mir ein Hinweis bzw. ein Gedanken Anstoß gibt wie ich es realisieren soll.

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

    @tommy Wie stellst Du denn die zu editierende GUI dar?
    Da müssen doch auch die Controls dargestellt werden.
    Für so ne Linie kommen dann alle (gleichen) Controls in Frage, deren { linke, rechte, obere, untere } Kante sich innerhalb eines Bereichs von n Pixeln befinden.
    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 Hallo!
    Also Gui wird als code in der laufzeit erstellt, die Groupbox ist das eigenliche Steuerelement was der benutzer bewegen kann.
    In den Groupbox befindet sich eine ListView und Labels, die sich die größe von Groupbox automatisch anpassen.

    Ich hoffe das ich deine frage richtig verstanden habe
    @tommy Probierma, mit MainForm.CreateGraphics() einen Strich zu zeichnen.
    Was passiert?
    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!
    Hallo RodFromGermany!
    Wie ich ein strich weiß ich ja, aber ich wusste nicht wie ich es realisieren bzw. prüfen kann damit der strich angezeigt wird.
    Aber ich glaube was gefunden zu haben :rolleyes:
    den
    ich habe im Internet Panel verschieben und auf Kollision prüfen gelesen
    und da habe ich ein link gefunden
    vbarchiv.net/forum/id10_i46677t46673_trackbar.html
    und mit diesem Code habe ich jetzt eine Ahnung wie ich es realisieren kann.
    Mittlerweile sieht der Code so aus.
    Das ist nur mal ein Test mit 2 Panel.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _moving As Boolean
    3. Private _sp As Point
    4. Dim lab As New Label
    5. Private Sub Panel_MouseDown(ByVal sender As Object, ByVal e As _
    6. System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown,
    7. Panel2.MouseDown
    8. _moving = True
    9. _sp = New Point(e.X, e.Y)
    10. End Sub
    11. Private Sub Panel_MouseUp(ByVal sender As Object, ByVal e As _
    12. System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseUp,
    13. Panel2.MouseUp
    14. _moving = False
    15. End Sub
    16. Dim Lin As Boolean = False
    17. Private Sub Panel_MouseMove(ByVal sender As Object, ByVal e As _
    18. System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove,
    19. Panel2.MouseMove
    20. Dim pan As Panel = CType(sender, Panel)
    21. If _moving Then
    22. Dim np As Point = pan.Location
    23. np.Offset(e.X - _sp.X, e.Y - _sp.Y)
    24. Dim newrec As New Rectangle(np, pan.Size)
    25. ' Check within form
    26. 'If Not Me.ClientRectangle.Contains(newrec) Then
    27. ' Return
    28. 'End If
    29. ' check not overlapping another panel
    30. 'For Each c As Control In Me.Controls
    31. ' If TypeOf c Is Panel AndAlso Not c Is pan Then
    32. ' If c.Bounds.IntersectsWith(newrec) Then
    33. ' Return
    34. ' End If
    35. ' End If
    36. 'Next
    37. lab.Height = 1
    38. lab.BackColor = Color.Blue
    39. For Each c As Control In Me.Controls
    40. If TypeOf c Is Panel AndAlso Not c Is pan Then
    41. If (c.Bounds.Top - 2) < newrec.Top And (c.Bounds.Top + 2) > newrec.Top Then
    42. pan.Top = c.Bounds.Top
    43. lab.Top = pan.Top
    44. If c.Bounds.Left < newrec.Left Then
    45. lab.Left = c.Bounds.Left
    46. lab.Width = ((newrec.Left + newrec.Width) - lab.Left)
    47. Else
    48. lab.Left = newrec.Left
    49. lab.Width = ((c.Bounds.Left + c.Bounds.Width) - lab.Left)
    50. End If
    51. pan.Parent.Controls.Add(lab) : Lin = True
    52. lab.BringToFront()
    53. pan.Left = np.X
    54. Return
    55. Else
    56. If Lin = True Then
    57. pan.Parent.Controls.Remove(lab) : Lin = False
    58. End If
    59. End If
    60. End If
    61. Next
    62. pan.Location = np
    63. End If
    64. End Sub
    65. End Class


    was haltest du von davon?

    tommy schrieb:

    was haltest du von davon?
    Was soll passieren?
    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!
    Wenn 2 Panels verschiedene Top werte haben, ist kein strich zu sehen.
    Haben die 2 Panels den gleichen top wert, wird oberhalb von den Panels ein blauer strich angezeigt.
    Erstelle ein Test Projekt mit 2 Panels und kopiere den Code.
    Und sehe es dir an, wenn du die Panels mit der Maus bewegst.
    @tommy OK.
    Mit 3 kleinen Änderungen kann ich auch Button bewegen ;)
    • Arbeite nicht mit Panels, sondern mit Controls:

      VB.NET-Quellcode

      1. Dim pan As Control = CType(sender, Control)
      2. ' ...
      3. If c IsNot pan Then

    • Füge die Mouse-Event-Handler nicht mit Handles sondern mit AddHandler hinzu, das geht dynamisch für alle berteffenden Controls.
    • Pack den Lage-Test-Code in je eine Boolean-Function für Links, Rechts, Oben und Unten,
      bei 4xFalse wird die Linie weggenommen.
    Jou, das sollte erst mal reichen.
    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!