Sprache: VB
Eine Form mit FormBorderStyle = FormBorderStyle.None kann nicht über die Titelleiste verschoben werden. Sie lässt sich aber mit folgendem Code bewegen.
Das geht auch mit Controls auf der Form.
Module Module_Move
Dim X1, Y1 As Integer
Sub ObjectMouseDown(ByVal X As Integer, ByVal Y As Integer)
X1 = X
Y1 = Y
End Sub
Sub ObjectMove(ByVal Obj As Object, ByVal X2 As Integer, ByVal Y2 As Integer)
Obj.Left = Obj.Left + (X2 - X1)
Obj.Top = Obj.Top + (Y2 - Y1)
End Sub
End Module
Der Aufruf erfolgt bespielsweise so:
Private Sub Form1_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
ObjectMouseDown(e.X, e.Y)
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Select Case e.Button
Case Windows.Forms.MouseButtons.Left
ObjectMove(Me, e.X, e.Y)
End Select
End Sub
Module Module_Move
Dim X1, Y1 As Integer
Sub ObjectMouseDown(ByVal X As Integer, ByVal Y As Integer)
X1 = X
Y1 = Y
End Sub
Sub ObjectMove(ByVal Obj As Object, ByVal X2 As Integer, ByVal Y2 As Integer)
Obj.Left = Obj.Left + (X2 - X1)
Obj.Top = Obj.Top + (Y2 - Y1)
End Sub
End Module
Der Aufruf erfolgt bespielsweise so:
Private Sub Form1_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
ObjectMouseDown(e.X, e.Y)
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Select Case e.Button
Case Windows.Forms.MouseButtons.Left
ObjectMove(Me, e.X, e.Y)
End Select
End Sub
Alte URL:
/snippet/objekte-z-b-formen-ohne-border-mit-der-maus-verschieben/15160
Wobei es mit deinem Code zu Problemen kommen kann; und zwar immer dann, wenn die Maus zu schnell bewegt wird und dadurch von dem erfassenden Element „runter rutscht“.
Wenn man Fenster verschieben will, gibt es bessere Möglichkeiten:
https://dotnet-snippets.de/snippet/schiebeleiste-fuer-fenster-erstellen/1657
Was bei normalen WinForms-Controls am besten ist weiß ich nicht, in WPF sollte man Thumbs verwenden um dieses Problem zu umgehen.
Schade dass Du eine Sache behauptest, ohne sie probiert zu haben.
Du kannst so schnell ziehen wie Du willst – aus welchem Grund auch immer – das jeweilige Objekt geht Dir nicht verloren.
Eines gilt für den beschriebenen Code: Für Einsteiger bis zum Profi verständlich.
Falsch!
Beim bewegen der Maus wird diese nicht Pixelweise verrückt sondern springt bei extremen Einstellungen (wie bei mir) auch einige Pixel auf einmal. Dabei lässt es sich mit derartig einfacher verschiebe-Logik leicht reproduzieren.
Sobald die Maus-Events auf einem Parent abgefangen werden, wird es besser, bietet aber keine Garantie. Die Maus-Events müssten Desktopweit verarbeitet werden. So wie es das verlinkte Snippet bzw. die Thumb-Klasse von WPF tun.
Du behauptest hier etwas was ich in den letzten 5 Jahren mehrfach widerlegen konnte. Auch moderne „weit verbreitete“ Programme wie Office Lens UWP App zeigen dieses Problem auf. Es tut mir echt leid für die Welt, dass sich keiner mehr mit den Grundlagen beschäftigen will.
Und hier noch ein Video dazu:
https://www.youtube.com/watch?v=_7Dput2xBA0
Und hier der Code meines Test-Projekts:
https://github.com/Koopakiller/Forum-Samples/tree/master/SnippetTest15160
Den Aufruf musste ich natürlich etwas für WPF anpassen, das Problem bleibt aber das Gleiche.
BTW, benutze doch bitte Option Strict On. In meinem Testprojekt habe ich es wegen deinem Code nicht an.
Danke, dass Du Dich so ausführlich mit meinem Snippet beschäftigts!
1. Zum Thema Maus springt
Es liegt also offensichtlich eine Deinen Maus-Einstellungen oder?
2.
Option Strict On
Einfach zu beseitigen:
Sub ObjectMove(ByVal Obj As Form, ByVal X2 As Integer, ByVal Y2 As Integer)
Obj.Left = Obj.Left + (X2 – X1)
Obj.Top = Obj.Top + (Y2 – Y1)
End Sub
und für Controls analog.
Zum Nachtrag noch eine Bitte (s. letzter Satz bei Dir)
Der Dativ sollte nicht DEM Genetiv sein Tod sein!
Verzeih! Aber das konnte ich mir doch nicht verkneifen.
Zu den Mauseinstellungen: Jain. Es ist leichter zu reproduzieren, wenn man die Mausgeschwindigkeit sehr hoch stellt, aber auch auf den Standardeinstellungen schaffe ich es manchmal. Auch hängt es immer von der Größe der Objekte ab und wo man sie greift. Es ist ein zusammenspiel vieler Faktoren, weshalb es vermutlich nur selten auffällt. Da ich relativ schnell mit der Maus unterwegs bin, erhöht das sicher auch noch das Risiko eines Problems.
Da Form von Control erbt, würde ich für WinForms wohl nur eine Version mit der Control-Klasse machen.
Bastian Sicks mehrteilige Reihe fand ich eigentlich ganz gut…nur gemerkt habe ich mir davon fast nichts. Und Fälle sind mir schon immer etwas suspekt, fließend spreche ich eigentlich nur noch C# ^^
Hallo
Auch nachts unterwegs?
Ich danke Dir für zwei Hinweise während unserer Posts: (Fällt mir gerade ein: Genetiv nicht vergessen! Hi!)
1. Option Strict On
2. Die Vererbungshierarchie von Form. Die hatte ich mir noch nie angeschaut.
Alles Gute!
Horst