Feedback

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

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

8 Kommentare

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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# ^^

  6. 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