PictureBox flackert stark beim Verschieben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    PictureBox flackert stark beim Verschieben

    Hallo allerseits,

    erstmals einen schönen 1. Advent!

    Ich habe momentan das Problem, dass ich eine PictureBox bei gedrückter Maus innerhalb eines Panel verschieben will. Das klappt soweit alles super.

    Allerdings flackert die PictureBox (inkl. Inhalt) beim Verschieben extrem und "zieht quasi nach".
    Kennt ihr eine Möglichkeit das verschieben der Picturebox gleitener zu machen?

    Ich hoffe dass ich das Problem einigermaßen verständlich erklären konnte.

    Anbei den Code den ich verwende:

    VB.NET-Quellcode

    1. Private PicPos As Point
    2. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    3. If e.Button = MouseButtons.Left Then
    4. PicPos = New Point(e.Location)
    5. End If
    6. End Sub
    7. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    8. If e.Button = MouseButtons.Left Then
    9. PictureBox1.Location = New Point(PictureBox1.Location + (e.Location - PicPos))
    10. End If
    11. End Sub


    Vielen Dank!
    Das Flackern habe ich gar nicht, mit Schmalspurlaptop + 100 KB große Bilddatei. Wie dateigroß ist das Bild bei Dir?
    Ggf. PicBox mit Rahmen versehen, Bild beim Ziehenanfang ausblenden und beim Loslassen der Maus wieder einblenden?
    Was soll's werden, wenn's fertig ist?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Danke für deine Antwort!
    Die Bilddateie ist ca. 300KB groß. Wenn ich die PictureBox mit Rahmen verstehe, flackert dieser leider auch noch.
    Man müsste das Bild während des Bewegens der PictureBox leider sehen, also kann ich es am Ziehanfang nicht ausblenden....

    Meinst du es könnte funktionieren wenn ich das Bild in einer geringeren Auflösung lade?

    Oder meint ihr dass es etwas mit dem Layout / Sizemode "stretch" zu tun haben könnte?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „whatever“ ()

    @whatever Ich hab Deinen Code nach Überführung in Option Strict On mit verschieden großen Bildern getestet, er funktioniert tadellos, ohne DoubleBuffered auf true setzen zu müssen.
    Strict On

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private PicPos As Point
    3. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    4. If e.Button = MouseButtons.Left Then
    5. PicPos = e.Location
    6. End If
    7. End Sub
    8. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    9. If e.Button = MouseButtons.Left Then
    10. PictureBox1.Location = PictureBox1.Location + New Size(e.Location - New Size(PicPos))
    11. End If
    12. End Sub
    13. End Class

    Was kreuchgt denn da sonst noch auf der Form rum?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke @ all, habe mittlerweile den Störenfried wohl gefunden.

    Es liegt wohl am Background-Image des Panels, indem sich die PictureBox befindet.
    Wenn ich das Background-Image lösche, läuft es deutlich flüssiger.
    Nehme also an dass das Panel das Background-Image immer beim verschieben der Picturebox "neu zeichnet" und es dadurch zu diesem Flackern kommt.

    Meint ihr man kann das Problem lösen und gleichzeitig das Panel inkl. Background-Image behalten?
    Zum Beispiel in das MouseDown Event der PictureBox einzubauen, dass das Panel nicht refreshed oder neu gezeichnet wird?

    Ansonsten muss ich das Panel wohl mit etwas anderem ersetzen :)

    Vielen Dank

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „whatever“ ()

    @whatever Welche Bewandtnis hat denn das MouseMove des Bildes?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    @RodFromGermany

    Die PictureBox (mit Image) wird auf dem Panel mit Background-Image in die gewünschte Position bewegt.
    Bei Ausführung einer Funktion wird dann quasi die PictureBox auf das Background-Image "gedruckt" und ein entsprechendes .PNG Bild kreiert.

    Das klappt soweit alles super, das einzige Problem ist eben das starke Flackern, wenn beim Panel ein Background-Image hinterlegt wurde.

    Neu

    @whatever OK, das ist mir bekannt.
    Ich hab auch ein Projekt, bei dem ich ein Bild per MouseMove in ein anderes hineinfüge.
    Mach .DoubleBuffered = True und beweg die Maus nicht so schnell. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!