Wie bewege ich in VB.NET 2003 ein großes Bild in einem kleineren Panel mit AutoScroll per MouseDown, MouseMove und MouseUp?

Antwort vom

**Ja: Du verschiebst dabei nicht das Bild selbst „frei“, sondern änderst im `Panel` mit `AutoScroll = True` die Scroll-Position per Mausziehen. Entscheidend ist, dass du dir beim `MouseDown` die Startposition merkst und beim `MouseMove` daraus die neue `AutoScrollPosition` berechnest.** ## So funktioniert es Ein großes Bild liegt typischerweise in einer `PictureBox`, die größer ist als das `Panel`. Das `Panel` zeigt wegen `AutoScroll = True` automatisch Scrollbalken an. Wenn du nun per Maus „ziehen“ willst, simulierst du im Grunde nur das Scrollen. Wichtig in VB.NET 2003: Mit `AutoScrollPosition` gibt es oft Verwirrung, weil die Werte beim Lesen und Schreiben nicht intuitiv sind. Am stabilsten ist es, mit gemerkten Offsets zu arbeiten. ## Beispiel Angenommen: - `Panel1.AutoScroll = True` - `PictureBox1` liegt innerhalb von `Panel1` - `PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize` Dann kann es so aussehen: ```vb Private dragging As Boolean = False Private startMouse As Point Private startScroll As Point Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseDown If e.Button = MouseButtons.Left Then dragging = True startMouse = New Point(e.X, e.Y) startScroll = New Point(-Panel1.AutoScrollPosition.X, -Panel1.AutoScrollPosition.Y) PictureBox1.Cursor = Cursors.Hand End If End Sub Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseMove If dragging Then Dim dx As Integer = e.X - startMouse.X Dim dy As Integer = e.Y - startMouse.Y Panel1.AutoScrollPosition = New Point(startScroll.X - dx, startScroll.Y - dy) End If End Sub Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseUp dragging = False PictureBox1.Cursor = Cursors.Default End Sub ``` ## Warum genau so `PictureBox` bekommt die Mausereignisse direkt ab. Das ist wichtig, weil das Bild selbst unter dem Mauszeiger liegt, nicht das `Panel`. Die Zeile mit `startScroll` ist der entscheidende Punkt: ```vb startScroll = New Point(-Panel1.AutoScrollPosition.X, -Panel1.AutoScrollPosition.Y) ``` Denn `AutoScrollPosition` liefert beim Auslesen negative Werte zurück. Wenn du das nicht berücksichtigst, springt das Bild oder bewegt sich in die falsche Richtung. ## Typischer Fehler Viele versuchen, einfach `PictureBox1.Left` und `PictureBox1.Top` zu ändern. Das ist hier meist die schlechtere Lösung. Warum Weil `AutoScroll` bereits das Verschieben des sichtbaren Ausschnitts übernimmt. Wenn du zusätzlich die `PictureBox` manuell verschiebst, arbeitest du gegen die Scroll-Logik des Panels. ## Praktisch besser Wenn das Ziehen auch dann weiterlaufen soll, wenn der Mauszeiger sehr schnell an den Rand kommt, ist es oft sinnvoll, die Mausereignisse nicht nur auf der `PictureBox`, sondern sauber mit Capture zu behandeln: ```vb Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseDown If e.Button = MouseButtons.Left Then dragging = True PictureBox1.Capture = True startMouse = New Point(e.X, e.Y) startScroll = New Point(-Panel1.AutoScrollPosition.X, -Panel1.AutoScrollPosition.Y) End If End Sub Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles PictureBox1.MouseUp dragging = False PictureBox1.Capture = False End Sub ``` ## Wichtiger Unterschied Wenn du wirklich das **Steuerelement selbst verschieben** willst, ist das etwas anderes als **den sichtbaren Bildausschnitt verschieben**. Für ein großes Bild in einem kleineren Panel ist Scrollen per `AutoScrollPosition` fast immer die richtige Lösung, weil: - die Begrenzung automatisch stimmt - keine eigene Randlogik nötig ist - Scrollbars und Mausziehen zusammen sauber funktionieren **Kurz: Lege das Bild in eine `PictureBox` mit `AutoSize`, packe sie in ein `Panel` mit `AutoScroll = True` und ändere beim Draggen die `AutoScrollPosition` statt `Left/Top`.**

Kategorie: Technik Tags: VB.NET Panel MouseMove

Verwandte Fragen

Wie zeichne ich in VB.NET 2003 einen Ausschnitt aus einer vorhandenen Grafik?

In VB.NET 2003 zeichnest du einen Bildausschnitt mit Graphics.DrawImage, indem du ein Quell-Rechteck aus der vorhandenen Grafik auf ein Ziel-Rechteck zeichnest. vbnet Dim bmp As Bitmap = CType(Image....