Ich habe mich mit diesem Thema auseinander gesetzt und folgende Lösung gefunden. Der Punkt war eigentlich folgendes. Ein User klickt ein Bild an und verschiebt die Form wo anders hin. Das Bild sollte aber angedockt folgen, aber auch abgedockt nicht folgen. Es sollte überall hin verschoben werden können aber nur an bestimmten Positionen als quasi docked erscheinen. Dabei wollte ich nicht, das das aufrufende Fenster die Arbeit verrichtet, sondern das das Bilderfenster von selbst erkennt, das etwas bestimmtes geschieht.
Dazu habe ich einfach eine Form erstellt.
Dieses Fenster zeigt einfach nur in seinem Titel die Position auf dem Desktop an. Zudem wird die Form2 alias f2 geöffnet.
Quellcode Form2
Spoiler anzeigen
Die TopMost Eigenschaft von Form2 wurde auf True gesetzte. Wenn man dies nicht tut, dann wird die Form zwar angezeigt, aber gerne hinter andere Formulare verschwinden. Eine Lösung dafür habe ich bisher nur darin gefunden einige Ereignisse direkt zu prüfen und dann die Form2 einfach zu schliessen. Ihr werdet aber schnell feststellen was ich meine.
Im Prinzip funktioniert das Ganze so. Form2 erkennt das Ereignis Form.Move wenn Form2 selber als docked gekennzeichnet ist, dann wird sie der _Owner oder Form1 folgen. Ist Form2 selber nicht als docked gekennzeichnet dann folgt sie nicht. Form2 erkennt das selber, indem sie selber prüft ob sie sich in einem bestimmten Fenster bewegt. Das Fenster besteht darin, das um Form1 an der rechten oberen Ecke ein imaginäres kleines Quadrat von 40x40 Pixel erzeugt wird, auf dessen die eigene Position geprüft wird.
Ich hoffe es hat euch geholfen. Für eine Lösung des TopMost, wäre ich trotzdem dankbar.
Dazu habe ich einfach eine Form erstellt.
VB.NET-Quellcode
- Public Class Form1
- Private f2 As New Form2(Me)
- Private Sub Form1_Move(sender As Object, e As System.EventArgs) Handles Me.Move
- Me.Text = "X: " & Me.DesktopLocation.X & " Y: " & Me.DesktopLocation.Y
- End Sub
- Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
- f2.Show()
- End Sub
- End Class
Dieses Fenster zeigt einfach nur in seinem Titel die Position auf dem Desktop an. Zudem wird die Form2 alias f2 geöffnet.
Quellcode Form2
VB.NET-Quellcode
- Public Class Form2
- Private WithEvents _Owner As Form
- Private Docked As Boolean = True
- Public Sub New(owner As Form)
- InitializeComponent()
- _Owner = owner
- End Sub
- Private Sub Form2_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
- Me.Location = DefaultLocation()
- End Sub
- Private Sub _Owner_Move(sender As Object, e As System.EventArgs) Handles _Owner.Move
- If Docked = True Then
- Me.Location = DefaultLocation()
- End If
- End Sub
- Private Sub Form2_Move(sender As Object, e As System.EventArgs) Handles Me.Move
- Me.Text = "X: " & Me.DesktopLocation.X & " Y: " & Me.DesktopLocation.Y
- 'Checking X and Y Location
- If ((Me.DesktopLocation.X) > (_Owner.DesktopLocation.X + _Owner.Width + 20)) Or ((Me.DesktopLocation.X) < (_Owner.DesktopLocation.X + _Owner.Width - 20)) _
- Or ((Me.DesktopLocation.Y) > (_Owner.DesktopLocation.Y + 20)) Or ((Me.DesktopLocation.Y) < (_Owner.DesktopLocation.Y - 20)) Then
- Docked = False
- Else
- Me.Location = DefaultLocation()
- Docked = True
- End If
- End Sub
- Private Function DefaultLocation() As System.Drawing.Point
- Return New System.Drawing.Point(_Owner.DesktopLocation.X + _Owner.Width, _Owner.DesktopLocation.Y)
- End Function
- End Class
Die TopMost Eigenschaft von Form2 wurde auf True gesetzte. Wenn man dies nicht tut, dann wird die Form zwar angezeigt, aber gerne hinter andere Formulare verschwinden. Eine Lösung dafür habe ich bisher nur darin gefunden einige Ereignisse direkt zu prüfen und dann die Form2 einfach zu schliessen. Ihr werdet aber schnell feststellen was ich meine.
Im Prinzip funktioniert das Ganze so. Form2 erkennt das Ereignis Form.Move wenn Form2 selber als docked gekennzeichnet ist, dann wird sie der _Owner oder Form1 folgen. Ist Form2 selber nicht als docked gekennzeichnet dann folgt sie nicht. Form2 erkennt das selber, indem sie selber prüft ob sie sich in einem bestimmten Fenster bewegt. Das Fenster besteht darin, das um Form1 an der rechten oberen Ecke ein imaginäres kleines Quadrat von 40x40 Pixel erzeugt wird, auf dessen die eigene Position geprüft wird.
VB.NET-Quellcode
- If ((Me.DesktopLocation.X) > (_Owner.DesktopLocation.X + _Owner.Width
- + 20)) Or ((Me.DesktopLocation.X) < (_Owner.DesktopLocation.X +
- _Owner.Width - 20))
- Or ((Me.DesktopLocation.Y) >
- (_Owner.DesktopLocation.Y + 20)) Or ((Me.DesktopLocation.Y) <
- (_Owner.DesktopLocation.Y - 20)) Then
- Docked = False
- Else
- Me.Location = DefaultLocation()
- Docked = True
- End If
Ich hoffe es hat euch geholfen. Für eine Lösung des TopMost, wäre ich trotzdem dankbar.
![:rolleyes:](https://www.vb-paradise.de/wcf/images/smilies/rolleyes.png)