png in GUICtrlCreatePic

  • hey
    ich brauche dringend eure hilfe, ich möchte mir ein png in der gui anzeigen lassen, allerdings unterstützt GUICtrlCreatePic nur jpg/bmp/gif

    hat jemand nen tipp wie ich dieses problem so einfach wie möglich lösen kann?

  • So kann das unteranderem funktionieren:


    [autoit]


    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    _Example()

    [/autoit][autoit][/autoit][autoit]

    Func _Example()
    Local $sFile = FileOpenDialog("Select an image", "", "Images (*.bmp;*.png;*.jpg;*.gif;*.tif)")
    If @error Or Not FileExists($sFile) Then Return

    [/autoit][autoit][/autoit][autoit]

    If Not _GDIPlus_Startup() Then
    MsgBox($MB_SYSTEMMODAL, "ERROR", "GDIPlus.dll v1.1 not available")
    Return
    EndIf
    Local $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    Local $iWidth = 600
    Local $iHeight = _GDIPlus_ImageGetHeight($hImage) * 600 / _GDIPlus_ImageGetWidth($hImage)
    Local $hGui = GUICreate("GDI+ v1.1", $iWidth, $iHeight)
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $iWidth, $iHeight)

    [/autoit][autoit][/autoit][autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    EndFunc ;==>_Example

    [/autoit]
  • Die Variante von KloMeister ist an dieser Stelle eindeutig nicht zu empfehlen. Dieser Algorithmus zeichnet das Bild einmalig und verfällt dann in die normale Message-Schleife. Sobald du die GUI aus dem Bild schiebst, wird mindestens ein Teil der Zeichnung fehlen.
    Eine gute Möglichkeit wäre z.B., das Bild in der Message-Schleife dauerhaft neu zu zeichnen. Die eindeutig besser respektive optimale Variante wäre, die WM_PAINT-Nachricht an dein Fenster abzufangen und dementsprechend zu reagieren, indem der Zeichenvorgang wiederholt wird. So ist es auch von Microsoft gedacht.

  • Die eindeutig besser respektive optimale Variante wäre, die WM_PAINT-Nachricht an dein Fenster abzufangen und dementsprechend zu reagieren, indem der Zeichenvorgang wiederholt wird.

    Kann ich nur voll unterschreiben, möchte aber das _GuiCtrlSetImageEx empfehlen.
    Wenn es dir #lemon nur um die schnelle Umsetzung für deine GUI geht und nicht um das (natürlich dauerhaft sinnvollere) Lernen, dann nimm _GuiCtrlSetImageEx. Das funktioniert wirklich klasse. Danke an dieser Stelle an Oskar :thumbup:

    Grüße autoiter

  • Schau dir einfach das dritte Beispiel zu GUICtrlCreatePic in der Hilfe an.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • hey
    ich brauche dringend eure hilfe, ich möchte mir ein png in der gui anzeigen lassen, allerdings unterstützt GUICtrlCreatePic nur jpg/bmp/gif

    hat jemand nen tipp wie ich dieses problem so einfach wie möglich lösen kann?


    Wenn du nur transparente Bilder haben willst, dann musst du deine PNG nur in 32bpp BMP konvertieren, die kannst du dann mit GuiCtrlCreatePic verwenden. Hier ist ein kostenloses Tool dafür. Andernfalls muss es GDI+ sein :)