PNG in GUICtrlCreatePic

  • Hallo,

    soweit ich weiß kann man PNGs NICHT in GUICtrlCreatePic verwenden. Diese Funktion:

    Spoiler anzeigen
    [autoit]

    Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0
    Local Const $SS_BITMAP = 0xE
    Local Const $GWL_STYLE = -16

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

    Local $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, 0)

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

    Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
    If @error Then Return SetError(2, 0, 0)
    DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
    If @error Then Return SetError(3, 0, 0)

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

    Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    If @error Then Return SetError(4, 0, 0)
    If $oldBmp[0] <> 0 Then DllCall("GDI32.dll", "int", "DeleteObject", "int", $oldBmp[0])
    Return 1
    EndFunc

    [/autoit]

    brachte mich auf die Idee, eine weitere Funktion zu schreiben (GUICtrlPicSetPng($File)). Mein Problem ist jetzt, dass ich von GDIPlus überhaupt keine Ahnung habe. Ok nur ein bischchen ^^. Also meine Frage wäre: Wie kann ich mit GDIPlus ein Bild (*.png) laden und es in Bitmap convertieren, so das es mit der oberen Funktion funkioniert? Ich will jetzt nicht unbedingt ein fertiges Script, aber so Stichworte bzw. welche Funktionen nötig sind, wären sehr hilfreich.

  • Zitat von DeepRed92

    Ich will jetzt nicht unbedingt ein fertiges Script, aber so Stichworte bzw. welche Funktionen nötig sind, wären sehr hilfreich.


    Sorry, aber das kommt aus meiner Spielkiste (mit/ohne GDIPlus/GDIPlus.au3):

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    If Not IsDeclared("SS_REALSIZECONTROL") Then
    Global Const $SS_REALSIZECONTROL = 0x40
    EndIf

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

    OnAutoItExitRegister("ExitApp")

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

    $PicDir = @ProgramFilesDir & "\AutoIt3\Examples\GUI"
    Dim $aPics[11], $I = 0
    $hFiles = FileFindFirstFile($PicDir & "\*.*")
    If @error Or $hFiles = -1 Then
    ConsoleWrite("Keine Bilder im Verzeichnis " & $PicDir)
    ExitApp()
    EndIf
    Do
    $PicPath = FileFindNextFile($hFiles)
    If Not @error Then
    If @extended Then ContinueLoop
    If StringInStr("jpg,png,gif", StringRight($PicPath, 3)) Then
    $I += 1
    If $I >= UBound($aPics) Then ExitLoop
    $aPics[0] = $I
    $aPics[$I] = $PicPath
    EndIf
    EndIf
    Until @error
    FileClose($hFiles)

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

    Opt("GUIOnEventMode", 1)
    GUICreate("TestGUI", 800, 420)
    GUISetBkColor(0x808080)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ExitApp")
    $idName1 = GUICtrlCreateLabel("", 0, 0, 400, 20, $SS_CENTER + $SS_CENTERIMAGE)
    $idPic1 = GUICtrlCreatePic("", 0, 20, 400, 400, $SS_BITMAP + $SS_NOTIFY + $SS_REALSIZECONTROL + $SS_CENTERIMAGE + $SS_SUNKEN)
    $I = Random(1, $aPics[0], 1)
    $hPic1 = _GUICtrlPic_SetImage($idPic1, $PicDir & "\" & $aPics[$I])
    GUICtrlSetOnEvent(-1, "Pic1_Clicked")
    GUICtrlSetData($idName1, $PicDir & "\" & $aPics[$I])
    $idName2 = GUICtrlCreateLabel("", 400, 0, 400, 20, $SS_CENTER + $SS_CENTERIMAGE)
    $idPic2 = GUICtrlCreatePic("", 400, 20, 400, 400, $SS_BITMAP + $SS_NOTIFY + $SS_REALSIZECONTROL+ $SS_CENTERIMAGE + $SS_SUNKEN)
    $I = Random(1, $aPics[0], 1)
    $hPic2 = _GUICtrlPic_SetImage($idPic2, $PicDir & "\" & $aPics[$I])
    GUICtrlSetOnEvent(-1, "Pic2_Clicked")
    GUICtrlSetData($idName2, $PicDir & "\" & $aPics[$I])
    GUISetState()

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

    While True
    Sleep(10)
    WEnd

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

    Func ExitApp()
    DllCall("Gdi32.dll", "Bool", "DeleteObject", "Handle", $hPic1)
    DllCall("Gdi32.dll", "Bool", "DeleteObject", "Handle", $hPic2)
    Exit
    EndFunc

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

    Func Pic1_Clicked()
    $I = Random(1, $aPics[0], 1)
    $hPic1 = _GUICtrlPic_SetImage($idPic1, $PicDir & "\" & $aPics[$I])
    GUICtrlSetData($idName1, $PicDir & "\" & $aPics[$I])
    EndFunc

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

    Func Pic2_Clicked()
    $I = Random(1, $aPics[0], 1)
    $hPic2 = _GUICtrlPic_SetImage($idPic2, $PicDir & "\" & $aPics[$I])
    GUICtrlSetData($idName2, $PicDir & "\" & $aPics[$I])
    EndFunc

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

    Func _GUICtrlPic_SetImage($idPic, $PicPath)
    Local $IMAGE_BITMAP = 0x0000
    Local $STM_SETIMAGE = 0x0172
    Local $STM_GETIMAGE = 0x0173
    Local $aResult, $hBM, $hBitmap, $hImage

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

    Local $hGDIPDll = DllOpen("GDIPlus.dll")
    If $hGDIPDll = -1 Then Return SetError(1, 2, False)
    Local $tInput = DllStructCreate("uint Version;ptr Callback;bool NoThread;bool NoCodecs")
    Local $pInput = DllStructGetPtr($tInput)
    Local $tToken = DllStructCreate("ulong_ptr Data")
    Local $pToken = DllStructGetPtr($tToken)
    DllStructSetData($tInput, "Version", 1)
    $aResult = DllCall($hGDIPDll, "Int", "GdiplusStartup", "Ptr", $pToken, "Ptr", $pInput, "Ptr", 0)
    If @error Then Return SetError(@error, @extended, False)
    GUISetState(@SW_LOCK)
    $aResult = DllCall($hGDIPDll, "Int", "GdipLoadImageFromFile", "WStr", $PicPath, "Ptr*", 0)
    If @error Then
    Local $Error = @error, $Extended = @extended
    DllCall($hGDIPDll, "None", "GdiplusShutdown", "Ptr", DllStructGetData($tToken, "Data"))
    DllClose($hGDIPDll)
    Return SetError($Error, $Extended, False)
    EndIf
    $hImage = $aResult[2]
    $aResult = DllCall($hGDIPDll, "Int", "GdipCreateHBITMAPFromBitmap", "Handle", $hImage, "Ptr*", 0, "DWORD", 0xFF000000)
    $hBitmap = $aResult[2]
    DllCall($hGDIPDll, "Int", "GdipDisposeImage", "Handle", $hImage)
    DllCall($hGDIPDll, "None", "GdiplusShutdown", "Ptr", DllStructGetData($tToken, "Data"))
    DllClose($hGDIPDll)
    $hBM = GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, -1)
    GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    If $hBM Then DllCall("Gdi32.dll", "Bool", "DeleteObject", "Handle", $hBM)
    DllCall("Gdi32.dll", "Bool", "DeleteObject", "Handle", $hBitmap)
    $hBitmap = GUICtrlSendMsg($idPic, $STM_GETIMAGE, $IMAGE_BITMAP, 0)
    GUISetState(@SW_UNLOCK)
    Return $hBitmap
    EndFunc

    [/autoit]
  • Mit dieser Methode kann ich auch transparente PNGs mittels GUICtrlCreatePic() darstellen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    Opt("GuiOnEventMode", 1)

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

    Local Const $STM_SETIMAGE = 0x0172
    Local $hGUI, $Pic, $hImage, $hBmp, $iW, $iH

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("Folder Full Tranparent.png")
    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iW, $iH, $GDIP_PXF32ARGB)
    $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

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

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

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

    $hGUI = GUICreate("Display transparent PNG", $iW * 2, $iH * 2)
    GUISetBkColor(0xFFFFFF)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Quit")

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

    $Pic = GUICtrlCreatePic("", $iW / 2, $iH / 2, $iW, $iH)
    ;~ GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSendMsg($Pic, $STM_SETIMAGE, 0, $hBmp)
    GUICtrlSetOnEvent($Pic, "_Pic_Clicked")

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

    _WinAPI_DeleteObject($hBmp)

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

    GUISetState()

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

    Do
    Until Not Sleep(1000)

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

    Func _Pic_Clicked()
    MsgBox(0, "Test", "You clicked on the pic!")
    EndFunc

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

    Func _Quit()
    GUIDelete($hGUI)
    Exit
    EndFunc

    [/autoit]

    Das Bild dazu: autoit.de/wcf/attachment/11521/

    Gruß,
    UEZ