2 Form aneinander verbinden

  • VB.NET

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

    2 Form aneinander verbinden

    Hallo Leute !
    Ich möchte gerne 2 forms aneinander bleiben auch wenn man die Forms mit der maus bewegt.
    Ich habe zwar ein code geschrieben aber es gefällt mir nicht.
    weil wenn man mit der maus die Forms bewegt sicht man das es leicht ausernader gehen und wieder zam :(
    hat einer eine bessere lösung als meiner?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim nStartPos, nDragPos As Point
    3. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    4. If e.Button = Windows.Forms.MouseButtons.Left Then
    5. Dim nCurPos As Point, nNewPos As Point
    6. nCurPos = Me.PointToScreen(New Point(e.X, e.Y))
    7. nNewPos = New Point(nStartPos.X + nCurPos.X - nDragPos.X, nStartPos.Y + nCurPos.Y - nDragPos.Y)
    8. Me.Location = nNewPos
    9. nNewPos.X += (Me.Width)
    10. Form2.Location = nNewPos
    11. End If
    12. End Sub
    13. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. Form2.Show()
    15. End Sub
    16. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    17. If e.Button = Windows.Forms.MouseButtons.Left Then
    18. nDragPos = Me.PointToScreen(New Point(e.X, e.Y))
    19. nStartPos = Me.Location
    20. End If
    21. End Sub
    22. End Class

    Danke für jede vorschläge
    @tommy Verstehe zunächst dies: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Mit diesem Code wird Form2 sofort neben Form1 positioniert:

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    2. Dim nNewPos = New Point(Me.Location.X + Me.Width, Me.Location.Y)
    3. frm2.Location = nNewPos
    4. End Sub
    Ansonsten würde ich das so lassen.
    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 !
    Danke für deine antwort.
    Aber Starte ein neues Projekt und füge den Code ein, und sehes dir bitte an.
    Es ist nicht schön das der form 2 nicht immer exat neben form1 "kleben" bleibt.
    gibts da wirklich keine lösung? ?(

    ich habe sogar erfahren das mit LocationChanged auch machen kann.
    Habe es jetzt so gemacht aber bringt keine verbesserung

    VB.NET-Quellcode

    1. Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
    2. Me.Location = nNewPos
    3. nNewPos.X += Me.Width
    4. Form2.Location = nNewPos
    5. End Sub

    Ich habe sogar Form1 und Form2 den DoubleBuffer auf True gesetzt.

    tommy schrieb:

    Aber Starte ein neues Projekt und füge den Code ein, und sehes dir bitte an.
    Wie komme ich auf die Idee, Dir für Deinen Code eine Sub Form1_Shown() zu posten?
    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!
    probierma so:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _frm2 As Form2
    3. Private Sub Form1_Move(sender As Object, e As EventArgs)
    4. _frm2.Location = New Drawing.Point(Me.Left + Me.Width, Me.Top)
    5. End Sub
    6. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    7. _frm2 = New Form2
    8. _frm2.Show(Me)
    9. AddHandler Me.Move, AddressOf Form1_Move
    10. Form1_Move(Nothing, Nothing)
    11. End Sub
    12. End Class
    getestet
    @tommy Wahrscheinlich ist das eine Sache des Rechners.
    Was hast Du für eine Maschine?
    ====
    @ErfinderDesRades Deine Lösung dockt erst beim Loslassen.
    Bei seiner Lösung wird Form2 mit bewegt.
    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 1 mal editiert, zuletzt von „RodFromGermany“ ()

    tommy schrieb:

    Sobald ich die Form1 mit der maus bewegen, sicht man das sich Form2 manchmal von Form1 löst und anschließend sich wieder andockt

    RodFromGermany schrieb:

    @ErfinderDesRades Deine Lösung dockt erst beim Loslassen.
    Komisch - bei mir tut das einfach, was es soll.
    Der Code ist IMO auch logisch richtig, also wenn das nicht gut genug ist, glaub ich nicht, dass sich mit Framework-Mitteln noch was findet.
    Eventuell mit Windows-Api - CaptureMouse oder sowas. Hab ich aber vergessen, wie das ging.
    Guten abend DerSmurf!
    Ich habe vor eine Schieblehre nach zu programmieren den ich unter VB6 geschrieben habe aber das funktioniert unter Win 10 nicht mehr korregt daher forms die ich zusammen bzw auseinander schieben kann.
    und ich habe es genau so geschieben in VB.net aber irgendwie funktioniert es nicht richtig.
    ich habe ein gameing Laptop mit einem Framwork 4.7.2
    Wie gesagt - mein Code ist logisch richtig:
    Wenn das Form sich bewegt wird Form_Move gefeuert, und das ist der richtige Moment, die Location des anneren Forms zu verändern.

    Ich kann mir nur vorstellen, du verwendest mein Snippet falsch.
    Daher als Versuch meine Solution nochma im Datei-Anhang.
    (Öffne die \StickyForms00\FormsVb\StickyForms\StickyForms.sln)
    Dateien
    • StickyForms00.zip

      (210,1 kB, 96 mal heruntergeladen, zuletzt: )
    Hallo ErfinderDesRades!
    Sorry habe vergessen zu sagen, dass die Forms Rahmenlos sind.
    Die sind auch transparent gesetzt. Man sieht nur Schieblehre schablohne.
    Ich finde es echt lustig das es mit rahmen funktioniert :cursing:

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

    tja, bei mir gehts auch Rahmenlos:

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Form1
    4. Private _frm2 As Form2
    5. Dim nStartPos, nDragPos As Point
    6. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    7. If e.Button = Windows.Forms.MouseButtons.Left Then
    8. Dim nCurPos = Me.PointToScreen(New Point(e.X, e.Y))
    9. Me.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, nStartPos.Y + nCurPos.Y - nDragPos.Y)
    10. End If
    11. End Sub
    12. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    13. If e.Button = Windows.Forms.MouseButtons.Left Then
    14. nDragPos = Me.PointToScreen(New Point(e.X, e.Y))
    15. nStartPos = Me.Location
    16. End If
    17. End Sub
    18. Private Sub Form1_Move(sender As Object, e As EventArgs)
    19. _frm2.Location = New Drawing.Point(Me.Left + Me.Width, Me.Top)
    20. End Sub
    21. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    22. _frm2 = New Form2
    23. _frm2.Show(Me)
    24. AddHandler Me.Move, AddressOf Form1_Move
    25. Form1_Move(Nothing, Nothing)
    26. End Sub
    27. End Class
    Nun kannste Form1.BorderStyle.None setzen.

    Das mit Tranzparenz kriege ich nicht hin - dafür müsste ich mein Windows-Design ändern.
    @tommy Das Ding heißt Messschieber, denn es ist keine Lehre. Eine Lehre ist eine Maßverkörperung.
    Warum nimmst Du dazu zwei Formen?
    Male das ganze doch in eine einzige Form.
    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!
    Guten Morgen RodFromGermany und ErfinderDesRades !
    RodFromGermany Ich brauche eigentlich 3 Forms für den Messschieber um eine Überlappung zu ermöglichen ich habe es schon versucht, eine Form mit 2 PictureBox mit Schablonen Bilder die Transparent sind aber, sobald ich die Form kleiner mache und die 2 PictureBox überlappen sich sieht, wird das eine Bild verdeckt ;(
    Sehe Bild:
    Offen


    Da Sieht man schon das es etwas verdeckt wird

    Zu


    Und nun zu dir ErfinderDesRades
    Ich habe mir dein Code nochmal angeschaut, und muss leider feststellen, dass es auch nicht das ware ist.
    Wenn es dich interessiert, Ich habe dein Code etwas geändert.
    Die 2 Form sind schwarz und Rahmen los.
    Um es richtig zu sehen, bitte ich dich, dass der Hintergrund weiß ist z. B. öffne notepad.exe in voller Größe und führe den Code aus.
    Nehme mit der Maus die links Seite, damit du die Form1 Klickst.
    Und mache kreisende Bewegungen, dann solltest du es sehen.
    Ich kann leider kein Screenshots machen da es zu schnell geht.

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Windows.Forms
    3. Public Class Form1
    4. Private _frm2 As Form2
    5. Dim nStartPos, nDragPos As Point
    6. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    7. If e.Button = Windows.Forms.MouseButtons.Left Then
    8. Dim nCurPos = Me.PointToScreen(New Point(e.X, e.Y))
    9. Me.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, nStartPos.Y + nCurPos.Y - nDragPos.Y)
    10. End If
    11. End Sub
    12. Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    13. If e.Button = Windows.Forms.MouseButtons.Left Then
    14. nDragPos = Me.PointToScreen(New Point(e.X, e.Y))
    15. nStartPos = Me.Location
    16. End If
    17. End Sub
    18. Private Sub Form1_Move(sender As Object, e As EventArgs)
    19. _frm2.Location = New Drawing.Point(Me.Left + Me.Width, Me.Top)
    20. End Sub
    21. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    22. _frm2 = New Form2
    23. Me.FormBorderStyle = FormBorderStyle.None
    24. Me.Size = New Point(400, 160)
    25. Me.BackColor = Color.Black
    26. _frm2.FormBorderStyle = FormBorderStyle.None
    27. _frm2.Size = New Point(400, 160)
    28. _frm2.BackColor = Color.Black
    29. _frm2.Show(Me)
    30. AddHandler Me.Move, AddressOf Form1_Move
    31. Form1_Move(Nothing, Nothing)
    32. End Sub
    33. End Class

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

    @tommy Das Ruckeln wäre mir da egal.
    @ErfinderDesRades Jou, Transparenz ist das Zauberwort.
    Wenn alles in einer durchsichtigen Form ist, sollte Dein Problem deutlich freundlicher lösbar sein:
    stackoverflow.com/questions/21…background-to-transparent
    ==>
    youtube.com/watch?v=CEuxm-FV-cU
    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!

    tommy schrieb:

    Hast du vieleicht eine andere idee?

    Was RodFromGermany sagt: Es selber zeichnen, OwnerDrawing also.
    Dummerweise muss man sich dafür schon ziemlich gut auskennen in VB.Net.
    Für einen Umsteiger von Vb6 ist das nichts - der muss erst lernen, Datentypen zu unterscheiden, dass ihm nicht sowas unterläuft:

    tommy schrieb:

    VB.NET-Quellcode

    1. Me.Size = New Point(400, 160)
    (Das zeigt, dass du eine Size nicht von einem Point unterscheiden kannst. Und die Einstellungen deines VisualStudios sind daran schuld)
    Also für dich wäre erstmal dein VisualStudio so einzustellen, dass du überhaupt eine einigermassen brauchbare Lernkurve hinkriegen kannst:
    Visual Studio - Empfohlene Einstellungen

    Erst danach(!!!) hat es Sinn sich zu überlegen, ob du wirklich mit OwnerDrawing einsteigen willst - da hast du gleich Bibliotheken, Klassen, Vererbung, Polymorphie, Methoden-Overrides (nicht OverLoads!), selbstgeschriebene Events, und was weiss ich nicht alles am Hals.
    Kleiner Einblick: OwnerDrawing

    Eine Alternative dazu wäre, mit Wpf anzufangen, ist aber imo noch viel komplizierter, mit Xaml, Databinding, ControlTemplates und Kram.
    @tommy Dies macht die Form transparent.
    Allerdings gehen Klicks auf Controls einer transparenten Form durch diese durch, sie landen nicht in den Handlern dieser Form. :/

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me.BackColor = Color.Aqua
    3. Me.TransparencyKey = Color.Aqua
    4. End Sub
    Am Besten, Du steuerst die transparente Form von einer nicht transparenten Form aus.
    Messschieber.zip
    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 1 mal editiert, zuletzt von „RodFromGermany“ ()