Feedback

VB - Objekte z.B. Formen ohne Border mit der Maus verschieben

Veröffentlicht von am 22.02.2017
(0 Bewertungen)
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.
Snippet in C# übersetzen

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

8 Kommentare zum Snippet

Koopakiller schrieb am 25.02.2017:
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.
horstfh schrieb am 26.02.2017:
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.

Koopakiller schrieb am 27.02.2017:
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.
Koopakiller schrieb am 27.02.2017:
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.
horstfh schrieb am 28.02.2017:
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.
horstfh schrieb am 28.02.2017:
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.
Koopakiller schrieb am 01.03.2017:
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# ^^
horstfh schrieb am 01.03.2017:
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
 

Logge dich ein, um hier zu kommentieren!