_GDIPlus_GraphicsDrawImageRectRect​ - Handle

  • Hallo,

    ich nehme ein großes jpg und will es als kleines Vorschaubild darstellen. Das funktioniert mit der folgenden Funktion bestens. Nun soll aber das Vorschaubild "verlinkt" werden, d.h. es sollte seine ControlID abgefragt werden um case-sensitiv bei einem Klick darauf (wie z.B. mit GUICtrlCreateButton) eingesetzt zu werden. Das geht aber nicht, weil _GDIPlus_GraphicsDrawImageRectRect kein Handle zurück gibt.

    Hat jemand eine Idee, wie man das lösen kann?

    Dank und Gruß
    Thomas

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <ScreenCapture.au3>

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

    Local $hHBmp = @ScriptDir & "\bildgross.jpg"
    Local Const $iWidth = 100, $iHeight = 100 ; Soll-Vorschaugroesse
    Local Const $iX = 10, $iY = 10 ; x und y Abstand
    Local $hGUI = GUICreate("GDI+ example", 600, 600)

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

    GUISetState(@SW_SHOW)

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

    _Bildvorschau($hHBmp)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete($hGUI)

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

    Func _Bildvorschau($hHBmp)
    _GDIPlus_Startup() ;initialize GDI+
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $hBitmap = _GDIPlus_BitmapCreateFromFile($hHBmp)
    Local $height = _GDIPlus_ImageGetHeight($hBitmap)
    Local $width = _GDIPlus_ImageGetWidth($hBitmap)
    _WinAPI_DeleteObject($hHBmp)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $width , $height, $iX, $iY, $iWidth, $iHeight, $hIA)
    ; hier sollte das Handle übergeben werden - was es nicht gibt...?
    _GDIPlus_ImageAttributesDispose($hIA)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von TJF (26. April 2015 um 19:01)

  • Es gibt scheinbar ein paar Missverständnisse deinerseits, was die GDIPlus Funktionen genau machen. _GDIPlus_GraphicsDrawImageRectRect gibt kein Handle zurück, weil es gar nicht für das Verwalten der Bitmap zuständig ist. Mit dieser Funktion zeichnest du eine Bitmap lediglich einmalig auf einen Grafikkontext (wie eine GUI). Deine Variable $hHBmp enthält des weiteren nur einen Dateipfad zu einem JPG Bild und kein Handle. Die Bitmap wird erst mit _BitmapCreateFromFile erstellt, der Rückgabewert dieser Funktion ist ein Handle ;).
    Das wird dir aber für deine Zwecke nicht wirklich helfen, da diese Art von Handle nicht direkt von den Standard Controls akzeptiert wird. In folgender Form sollte das Ganze mehr deinen Erwartungen entsprechen:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ScreenCapture.au3>

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

    Local $sImage = @ScriptDir & "\bildgross.jpg"
    Local Const $iWidth = 100, $iHeight = 100 ; Soll-Vorschaugroesse
    Local Const $iX = 10, $iY = 10 ; x und y Abstand
    Local $hGUI = GUICreate("GDI+ example", 600, 600)

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

    GUISetState(@SW_SHOW)

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

    $cPictureControl = _Bildvorschau($sImage)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete($hGUI)

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

    Func _Bildvorschau($sImage)
    _GDIPlus_Startup() ;initialize GDI+
    Local $hImage = _GDIPlus_BitmapCreateFromFile($sImage)
    Local $hBitmap = _GDIPlus_ImageResize($hImage, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

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

    Local $cPic = GUICtrlCreatePic("", $iX, $iY, $iWidth, $iHeight)
    GUICtrlSendMsg($cPic, 0x0172, 0, $hHBitmap)

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

    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

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

    Return $cPic
    EndFunc

    [/autoit]
  • Tausend Dank! Das ist der entscheidende Schritt. Ich habe jetzt nur dummerweise oben nicht gepostet, dass ich die Funktion mit

    • _Bildvorschau($hGUI, $hHBmp)

    aus

    • Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)

    benutze, weil das Vorschaubild nicht wie hier der Einfachheit wegen dargestellt, nicht in der Haupt-GUI erscheint.

    Spoiler anzeigen
    [autoit][/autoit] [autoit]
    • #include <GUIConstantsEx.au3>
    • #include <ScreenCapture.au3>
    • Local $hHBmp = @ScriptDir & "\bildgross.jpg"
    • Local Const $iWidth = 100, $iHeight = 100 ; Soll-Vorschaugroesse
    • Local Const $iX = 10, $iY = 10 ; x und y Abstand
    • Local $hGUI = GUICreate("GDI+ example", 600, 600)
    • GUISetState(@SW_SHOW)
    • _Bildvorschau($hGUI, $hHBmp)
    • Do
    • Until GUIGetMsg() = $GUI_EVENT_CLOSE
    • GUIDelete($hGUI)
    • Func _Bildvorschau($hGUI, $hHBmp)
    • _GDIPlus_Startup() ;initialize GDI+
    • Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    • Local $hBitmap = _GDIPlus_BitmapCreateFromFile($hHBmp)
    • Local $height = _GDIPlus_ImageGetHeight($hBitmap)
    • Local $width = _GDIPlus_ImageGetWidth($hBitmap)
    • _WinAPI_DeleteObject($hHBmp)
    • _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBitmap, 0, 0, $width , $height, $iX, $iY, $iWidth, $iHeight, $hIA)
    • ; hier sollte das Handle übergeben werden - was es nicht gibt...?
    • _GDIPlus_ImageAttributesDispose($hIA)
    • _GDIPlus_GraphicsDispose($hGraphics)
    • _GDIPlus_BitmapDispose($hBitmap)
    • _GDIPlus_Shutdown()
    • EndFunc

    [autoit]

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