PictureBox resize-event scheint unkontrollierbar

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von icewather.

    PictureBox resize-event scheint unkontrollierbar

    Situation: In einer Form wird innerhalb eines Panels eine PictureBox mit Anchor=Top,Left und Dock=Bottom an die Grösse des Panels angebunden. Bei der Grössenveränderung der Form soll die Bildgrösse automatisch im richtigen Bild-und PictureBox-Verhältnis angepasst werden. Dazu folgenden Code:

    VB.NET-Quellcode

    1. Private Sub picResBox_Resize(sender As Object, e As EventArgs) Handles picResBox.Resize
    2. AutosizeImage(picResBox.ImageLocation, picResBox)
    3. End Sub
    4. Public Sub AutosizeImage(ByVal ImagePath As String, ByVal picBox As PictureBox, Optional ByVal pSizeMode As PictureBoxSizeMode = PictureBoxSizeMode.Zoom)
    5. Try
    6. picBox.Image = Nothing
    7. picBox.SizeMode = pSizeMode
    8. If System.IO.File.Exists(ImagePath) Then
    9. Dim imgOrg As Bitmap
    10. Dim imgShow As Bitmap
    11. Dim g As Graphics
    12. Dim divideBy, divideByH, divideByW As Double
    13. imgOrg = DirectCast(Bitmap.FromFile(ImagePath), Bitmap)
    14. divideByW = imgOrg.Width / picBox.Width
    15. divideByH = imgOrg.Height / picBox.Height
    16. If divideByW > 1 Or divideByH > 1 Then
    17. If divideByW > divideByH Then
    18. divideBy = divideByW
    19. Else
    20. divideBy = divideByH
    21. End If
    22. imgShow = New Bitmap(CInt(CDbl(imgOrg.Width) / divideBy), CInt(CDbl(imgOrg.Height) / divideBy))
    23. imgShow.SetResolution(imgOrg.HorizontalResolution, imgOrg.VerticalResolution)
    24. g = Graphics.FromImage(imgShow)
    25. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    26. g.DrawImage(imgOrg, New System.Drawing.Rectangle(0, 0, CInt(CDbl(imgOrg.Width) / divideBy), CInt(CDbl(imgOrg.Height) / divideBy)), 0, 0, imgOrg.Width, imgOrg.Height, GraphicsUnit.Pixel)
    27. g.Dispose()
    28. Else
    29. imgShow = New Bitmap(imgOrg.Width, imgOrg.Height)
    30. imgShow.SetResolution(imgOrg.HorizontalResolution, imgOrg.VerticalResolution)
    31. g = Graphics.FromImage(imgShow)
    32. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    33. g.DrawImage(imgOrg, New System.Drawing.Rectangle(0, 0, imgOrg.Width, imgOrg.Height), 0, 0, imgOrg.Width, imgOrg.Height, GraphicsUnit.Pixel)
    34. g.Dispose()
    35. End If
    36. imgOrg.Dispose()
    37. picBox.Image = imgShow
    38. Else
    39. picBox.Image = Nothing
    40. End If
    41. Catch ex As Exception
    42. MsgBox(ex.ToString)
    43. End Try
    44. End Sub


    In der Funktion ist noch nicht alles ok, das Bild erscheint noch zu klein. Doch das ist nicht das Problem.
    Das Problem ist: Beim Start der Applikation wird der Resize-Event der PictureBox etwa 30x aufgerufen (habe nicht genau gezählt) - und zwar bevor der Form-Load-Event der startenden Form überhaupt aufgerufen wird. Wenn ich den PictureResize-Event nutzen will, dann verzögert sich der Programmstart stark. Was geschieht da? Gibt es eine andere Möglichkeit, die Bildgrösse an eine veränderte PictureBox im richtigen Verhältnis anzupassen? - Wichtig: Bei SizeMode=StretchImage zu wählen ist keine Option, da Bilder total verzerrt werden.

    Ohje - Stelle grad fest, dass ich vermutlich in einem falschen Forumabteil gelandet bin - das gehört wohl unter Multimedia. Wie kann ich diesen Beitrag ans richtige Ort transferieren? - Sorry, ich finde keinen Weg...

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @icewather Gib der PictureBox die Property SizeMode = Zoom. Da füllt das Bild die PB maximal aus und ist in sich proportional.
    Das machst Du im Designer und lässt Deinen ganzen Code weg.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Gib der PictureBox die Property SizeMode = Zoom


    Wäre auch mein Tipp gewesen.

    @icewather Das ist der Klassiker. Nicht in den Designer geschaut, bzw. das Control nicht ausreichend analysiert ;)

    Wenn du ein Controls verwendest, solltest du dich zunächst mit dessen Eigenschaften, Methoden und Events beschäftigen. Das meiste steht im Designer. Noch mehr findest du über itellisence indem du im Code z.B. "Controlname." eingibst. Deine IDE zeigt dir dann, was du mit dem Control so treiben kannst.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Danke für den Tipp - leider ist das fast, aber nicht ganz der Klassiker ;) Der PicBox habe ich von Anfang an SizeMode=Zoom verpasst, weil mir das bewusst ist. Was ihr schreibt, ist richtig. Wenn das Bild geladen wird, dann erscheint es optimal. Verändert man jedoch die Grösse der PicBox, geschieht folgendes:
    - bei der Verkleinerung wird das Bild tatsächlich verkleinert und der PicBox optimal angepasst
    - bei der Vergrösserung bleibt das Bild in der Grösse, in der die Form die PicBox gestartet hat und das Bild geladen wurde. Das Bild wird bei der Vergrösserung der PicBox nicht in der Grösse verändert.

    Aber nun komme ich Dank eures Hinweises auf etwas anderes: Die Einstellung Dock=Bottom war falsch. Sie muss zwingend auf Dock=Fill gestellt werden. Dann passt sich das Bild auch der Vergrösserung der PicBox / bzw. des Panels an.

    Somit ist der obige Code hinfällig geworden 8o