[UDF] GUICtrlPic - Update am 27.12.2010

  • Guten Morgen,

    zum Thema Pic-Controls habe ich mir auch ein paar Gedanken gemacht, weil die Frage nach "Transparenz" immer wieder neu gestellt wird. Dabei ist dann die kleine UDF GUICtrlPic.au3 für den leichteren Umgang mit transparenten und/oder nicht unterstützten Dateiformaten (z.B.PNG) entstanden:

    knappe Demo
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include "GUICtrlPic.au3"
    $Pic1 = @ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png"

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

    $Form1 = GUICreate("Form1", 400, 300)
    GUICtrlCreatePic(@ProgramFilesDir & "\AutoIt3\Examples\GUI\msoobe.jpg", 0, 0, 400, 300)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    $a8 = _GUICtrlPic_Create($Pic1 , 30, 30, 72, 72, $SS_CENTERIMAGE + $SS_SUNKEN, Default)
    GUISetState(@SW_SHOW)

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

    Sleep(3000)
    _GUICtrlPic_SetImage($a8, @ProgramFilesDir & "\AutoIt3\Examples\GUI\Merlin.gif", 1)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit

    [/autoit]
    Gradient Demo
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "GUICtrlPic.au3"

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

    OnAutoItExitRegister("ExitApp")
    Opt("MustDeclareVars", 1)

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

    Dim $hGUI, $PICID, $hBM, $TXTID, $aPOS, $Msg

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

    $hGUI = GUICreate("Gradient", 360, 360, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_BORDER))
    $PICID = GUICtrlCreatePic("", 0, 0, 360, 360, -1, $GUI_WS_EX_PARENTDRAG)
    GUICtrlSetCursor(-1, 3)
    $hBM = _GUICtrlPic_GradientFill($PICID, "000040", "0000FF", 0, 2)
    $TXTID = GUICtrlCreateLabel("A", 0, 0, 360, 360, $SS_CENTER + $SS_CENTERIMAGE)
    GUICtrlSetCursor(-1, 3)
    GUICtrlSetFont(-1, 224, 400, 0, "Arial")
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetColor(-1, 0xA0A0A0)
    GUISetState()

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

    While True
    $Msg = GUIGetMsg()
    Select
    Case $Msg = $GUI_EVENT_CLOSE
    ExitLoop
    EndSelect
    WEnd

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

    GUIDelete()
    Exit

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

    Func ExitApp()
    If $hBM Then
    DllCall("Gdi32.dll", "Int", "DeleteObject", "Ptr", $hBM)
    EndIf
    EndFunc ;==>ExitApp

    [/autoit]
    Invert Demo
    [autoit]

    #include <GUIConstantsEx.au3>
    #include "GuiCtrlPic.au3"

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

    $sPicPath = @ProgramFilesDir & "\AutoIt3\Examples\GUI\msoobe.jpg" ; 1024 * 768

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

    $hGui = GUICreate("Bild invertieren", 600, 430) ; für Netbooks
    $idPic = GUICtrlCreatePic($sPicPath, 0, 0, 600, 400)
    $idBtn = GUICtrlCreateButton("Invertieren", 0, 400, 600, 30)
    GUISetState()

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idBtn
    _GUICtrlPic_Invert($idPic)
    EndSwitch
    WEnd

    [/autoit]
    GUICtrlPic.au3
    [autoit]

    ; #INDEX# =======================================================================================================================
    ; Title .........: GUICtrlPic
    ; AutoIt Version : 3.3.6.1
    ; Description ...: Ergänzende Funktionen für Pic-Controls
    ; Author(s) .....: Großvater
    ; Dll ...........: GDI32.dll, GDIPlus.dll
    ; ===============================================================================================================================

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

    ; #CURRENT# =====================================================================================================================
    ; _GUICtrlPic_Create
    ; _GUICtrlPic_SetImage
    ; _GUICtrlPic_LoadImage
    ; _GUICtrlPic_ScaleBitmap
    ; _GUICtrlPic_GradientFill
    ; _GUICtrlPic_Invert
    ; ===============================================================================================================================

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlPic_Create
    ; Description ...: Pic-Control für alle von GDIPlus unterstützten Formate ggf. mit Transparenz erstellen.
    ; Syntax.........: _GUICtrlPic_Create($sPicPath, $iLeft, $iTop[, $iWidth = 0[, $iHeight = 0[, $uStyles = -1[, $uExStyles = -1[, $bKeepAspectRatio = False]]]]])
    ; Parameters ....: Die Parameter entsprechen bis auf den letzten der AU3-Funktion GUICtrlCreatePic()
    ; $bKeepAspectRatio - Seitenverhältnis bei der Größenanpassung beachten:
    ; |True - ja
    ; |False - nein
    ; |Default - nein
    ; Return values .: Im Erfolgsfall: ControlID aus GUICtrlCreatePic()
    ; Im Fehlerfall: False, @error und @extended enthalten ergänzende fehlerbeschreibende Werte.
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUICtrlPic_Create($sPicPath, $iLeft, $iTop, $iWidth = 0, $iHeight = 0, $uStyles = -1, $uExStyles = -1, $bKeepAspectRatio = False)
    Local Const $IMAGE_BITMAP = 0x0000
    Local Const $STM_SETIMAGE = 0x0172
    Local $aResult, $hBitmap, $hImage, $Height, $Width, $CtrlID
    Local $aBitmap = _GUICtrlPic_LoadImage($sPicPath)
    If @error Then Return SetError(@error, @extended, False)
    $hBitmap = $aBitmap[0]
    $Width = $aBitmap[1]
    $Height = $aBitmap[2]
    If $iWidth = 0 And $iHeight = 0 Then
    $iWidth = $Width
    $iHeight = $Height
    Else
    $hBitmap = _GUICtrlPic_ScaleBitmap($hBitmap, $iWidth, $iHeight, $Width, $Height, $bKeepAspectRatio)
    If @error Then Return SetError(@error, @extended, False)
    EndIf
    $CtrlID = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight, $uStyles, $uExStyles)
    GUICtrlSendMsg($CtrlID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    DllCall("Gdi32.dll", "BOOL", "DeleteObject", "Handle", $hBitmap)
    Return $CtrlID
    EndFunc ;==>_GUICtrlPic_Create

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlPic_SetImage
    ; Description ...: Neues Bild in Pic-Control erstellen.
    ; Syntax.........: _GUICtrlPic_SetImage($idPic, $sPicPath[, $bKeepAspectRatio = False])
    ; Parameters ....: $idPic - ID des PIC-Controls
    ; $sPicPath - vollständiger Pfad der Bilddatei
    ; $bKeepAspectRatio - Seitenverhältnis bei der Größenanpassung beachten:
    ; |True - ja
    ; |False - nein
    ; |Default - nein
    ; Return values .: Im Erfolgsfall: True
    ; Im Fehlerfall: False, @error und @extended enthalten ggf. ergänzende fehlerbeschreibende Werte
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUICtrlPic_SetImage($idPic, $sPicPath, $bKeepAspectRatio = False)
    Local Const $IMAGE_BITMAP = 0x0000
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $STM_GETIMAGE = 0x0173
    Local $aSize, $hBM, $hBitmap, $Height, $Width
    Local $aBitmap = _GUICtrlPic_LoadImage($sPicPath)
    If @error Or $aBitmap[0] = 0 Then Return SetError(@error, @extended, False)
    $hBitmap = $aBitmap[0]
    $Width = $aBitmap[1]
    $Height = $aBitmap[2]
    $aSize = WinGetClientSize(GUICtrlGetHandle($idPic))
    $hBitmap = _GUICtrlPic_ScaleBitmap($hBitmap, $aSize[0], $aSize[1], $Width, $Height, $bKeepAspectRatio)
    $hBM = GUICtrlSendMsg($idPic, $STM_GETIMAGE, $IMAGE_BITMAP, 0)
    If $hBM Then DllCall("Gdi32.dll", "BOOL", "DeleteObject", "Handle", $hBM)
    GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    DllCall("Gdi32.dll", "BOOL", "DeleteObject", "Handle", $hBitmap)
    GUICtrlSetState($idPic, $GUI_SHOW)
    Return True
    EndFunc ;==>_GUICtrlPic_SetImage

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlPic_LoadImage
    ; Description ...: Bilddatei laden und HBITMAP erzeugen
    ; Syntax.........: _GUICtrlPic_LoadImage($sPicPath)
    ; Parameters ....: $sPicPath - vollständiger Pfad der Bilddatei
    ; Return values .: Im Erfolgsfall: Array mit drei Einträgen, Array[0] enthält ein HBITMAP-Handle,
    ; Array[1] die Breite und Array[2] die Höhe der Bitmap
    ; Im Fehlerfall: False, @error und @extended enthalten ggf. ergänzende fehlerbeschreibende Werte
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......: Die Funktion kann auch einzeln genutzt werden, um eine Bitmap zu laden und dann per
    ; GUICtrlSendMsg($idPIC, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap) einem Pic-Control zuzuweisen.
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUICtrlPic_LoadImage($sPicPath)
    Local $aResult, $hBitmap, $hImage, $Height, $Width
    Local $aBitmap[3] = [0, 0, 0]
    Local $hGDIPDll = DllOpen("GDIPlus.dll")
    If $hGDIPDll = -1 Then Return SetError(1, 2, $aBitmap)
    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, $aBitmap)
    $aResult = DllCall($hGDIPDll, "INT", "GdipLoadImageFromFile", "WStr", $sPicPath, "Ptr*", 0)
    If @error Or $aResult[2] = 0 Then
    Local $Error = @error, $Extended = @extended
    DllCall($hGDIPDll, "None", "GdiplusShutdown", "Ptr", DllStructGetData($tToken, "Data"))
    DllClose($hGDIPDll)
    Return SetError($Error, $Extended, $aBitmap)
    EndIf
    $hImage = $aResult[2]
    $aResult = DllCall($hGDIPDll, "INT", "GdipGetImageWidth", "Handle", $hImage, "UINT*", 0)
    $Width = $aResult[2]
    $aResult = DllCall($hGDIPDll, "INT", "GdipGetImageHeight", "Handle", $hImage, "UINT*", 0)
    $Height = $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)
    $aBitmap[0] = $hBitmap
    $aBitmap[1] = $Width
    $aBitmap[2] = $Height
    Return $aBitmap
    EndFunc ;==>_GUICtrlPic_LoadImage

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlPic_ScaleBitmap
    ; Description ...: Geladene Bitmap skalieren.
    ; Syntax.........: _GUICtrlPic_ScaleBitmap($hBitmap, $iNewW, $iNewH[, $iBitmapW[, $iBitmapH[, $bKeepAspectRatio = False]]])
    ; Parameters ....: $hBitmap - HBITMAP-Handle
    ; $iNewW - gewünschte Breite in Pixeln
    ; $iNewH - gewünschte Höhe in Pixeln
    ; $iBitmapW - aktuelle Breite der Bitmap (wird nur für das Skalieren im Seitenverhältnis benötigt
    ; $iBitmapH - aktuelle Höhe der Bitmap (wird nur für das Skalieren im Seitenverhältnis benötigt
    ; $bKeepAspectRatio - Seitenverhältnis bei der Größenanpassung beachten:
    ; |True - ja
    ; |False - nein
    ; |Default - nein
    ; Return values .: Im Erfolgsfall: HBITMAP-Handle für die skalierte Bitmap
    ; Im Fehlerfall: False, @error und @extended enthalten ggf. ergänzende fehlerbeschreibende Werte
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......: Die Funktion kann auch einzeln genutzt werden, um eine Bitmap zu skalieren und dann per
    ; GUICtrlSendMsg($idPIC, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap) einem Pic-Control zuzuweisen.
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUICtrlPic_ScaleBitmap($hBitmap, $iNewW, $iNewH, $iBitmapW, $iBitmapH, $bKeepAspectRatio = False)
    Local Const $IMAGE_BITMAP = 0x0000
    If $bKeepAspectRatio Then
    If $iBitmapW >= $iBitmapH Then
    $iBitmapH *= $iNewW / $iBitmapW
    $iBitmapW = $iNewW
    If $iBitmapH > $iNewH Then
    $iBitmapW *= $iNewH / $iBitmapH
    $iBitmapH = $iNewH
    EndIf
    Else
    $iBitmapW *= $iNewH / $iBitmapH
    $iBitmapH = $iNewH
    If $iBitmapW > $iNewW Then
    $iBitmapH *= $iNewW / $iBitmapW
    $iBitmapW = $iNewW
    EndIf
    EndIf
    Else
    $iBitmapW = $iNewW
    $iBitmapH = $iNewH
    EndIf
    Local $aResult = DllCall("User32.dll", "Handle", "CopyImage", _
    "Handle", $hBitmap, "UINT", $IMAGE_BITMAP, "INT", $iBitmapW, "INT", $iBitmapH, "UINT", 0x4 + 0x8)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0]
    EndFunc ;==>_GUICtrlPic_ScaleBitmap

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlPic_GradientFill
    ; Description ...: Füllt ein Pic-Control mit einem zweifarbigen linearen Farbverlauf.
    ; Syntax.........: _GUICtrlPic_GradientFill($idCTRL, $C1, $C2[, $D = 1[, $3D = 3[, $GC = 0[, $BW = 0[, $BH = 0]]]]])
    ; Parameters ....: $idCTRL - ID des Pic-Controls aus GUIStrlCreatePic()
    ; $C1 - Startfarbe als 6-stelliger RGB-Hexstring ("RRGGBB")
    ; $C2 - Zielfarbe als 6-stelliger RGB-Hexstring ("RRGGBB")
    ; $D - Verlaufsrichtung:
    ; |0 - horizontal
    ; |1 - vertikal
    ; |2 - diagonal (links oben -> rechts unten)
    ; |3 - diagonal (rechts oben -> links unten)
    ; |Default - 0
    ; $3D - Verlaufsart:
    ; |1 - flacher Verlauf (Startfarbe -> Zielfarbe)
    ; |2 - "3D"-Verlauf (Startfarbe -> Zielfarbe -> Startfarbe)
    ; |3 - erhaben (wie 2, die Startfarbe bleibt aber im Randbereich)
    ; |Default - 1
    ; $GC - Gammakorrektur:
    ; |0 - ohne
    ; |1 - mit
    ; |Default - 0
    ; $BW - Breite des Verlaufs in Pixeln
    ; |Default - 0 (Breite des Controls)
    ; $BH - Höhe des Verlaufs in Pixeln
    ; |Default - 0 (Höhe des Controls)
    ; Return values .: Bei erfolgreicher Ausführung: Handle der erzeugten Bitmap (HBITMAP)
    ; Im Fehlerfall: False, @error wird auf 1 gesetzt
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......: Das Control muss mit GUICtrlCreatePic() erzeugt worden sein, sonst geschieht nichts.
    ; Die Parameter $BW und $BH laden zum Experimentieren ein.
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUICtrlPic_GradientFill($idCTRL, $C1, $C2, $D = 1, $3D = 3, $GC = 0, $BW = 0, $BH = 0)
    Local Static $STM_SETIMAGE = 0x172
    Local Static $IMAGE_BITMAP = 0x0
    Local Static $BITSPIXEL = 0xC
    Local $hWnd
    If IsHWnd($idCTRL) Then
    $hWnd = $idCTRL
    Else
    $hWnd = GUICtrlGetHandle($idCTRL)
    EndIf
    Local $aResult = DllCall("User32.dll", "Int", "GetClassName", "Hwnd", $hWnd, _
    "Str", "", "Int", 256)
    If $aResult[2] <> "Static" Then
    Return False
    EndIf
    Local $GDIPDll = DllOpen("GDIPlus.dll")
    If $GDIPDll = -1 Then
    Return SetError(1, 0, False)
    EndIf
    Local $SI = DllStructCreate("UInt Version;Ptr Callback;Bool NoThread;Bool NoCodecs")
    Local $Token = DllStructCreate("ulong_ptr Data")
    DllStructSetData($SI, "Version", 1)
    $aResult = DllCall($GDIPDll, "Int", "GdiplusStartup", _
    "Ptr", DllStructGetPtr($Token), "Ptr", DllStructGetPtr($SI), "Ptr", 0)
    If @error Then
    DllClose($GDIPDll)
    Return SetError(1, 0, False)
    EndIf
    Local $GDIPToken = DllStructGetData($Token, "Data")
    Local $RECT = DllStructCreate("Long; Long; Long Right;Long Bottom")
    DllCall("User32.dll", "Bool", "GetClientRect", "Hwnd", $hWnd, _
    "Ptr", DllStructGetPtr($RECT))
    Local $W = DllStructGetData($RECT, "Right")
    Local $H = DllStructGetData($RECT, "Bottom")
    Switch $D
    Case 0, 1, 2, 3
    Case Else
    $D = 0
    EndSwitch
    Switch $3D
    Case 1, 2, 3
    Case Else
    $3D = 1
    EndSwitch
    Switch $GC
    Case 0, 1
    Case Else
    $GC = 0
    EndSwitch
    If $BW = 0 Then $BW = $W
    If $BH = 0 Then $BH = $H
    Local $pBITMAP = DllStructCreate("Ptr")
    DllCall($GDIPDll, "Int", "GdipCreateBitmapFromScan0", _
    "Int", $W, "Int", $H, "Int", 0, "Int", 0x26200A, "Ptr", 0, _
    "Ptr", DllStructGetPtr($pBITMAP))
    $pBITMAP = DllStructGetData($pBITMAP, 1)
    Local $pGRAPHICS = DllStructCreate("Ptr")
    DllCall($GDIPDll, "Int", "GdipGetImageGraphicsContext", _
    "Ptr", $pBITMAP, "Ptr", DllStructGetPtr($pGRAPHICS))
    $pGRAPHICS = DllStructGetData($pGRAPHICS, 1)
    DllCall($GDIPDll, "Int", "GdipSetSmoothingMode", "Ptr", $pGRAPHICS, "Int", 0)
    Local $RECTF = DllStructCreate("Float L;Float T;Float R;Float B")
    DllStructSetData($RECTF, "R", $BW)
    DllStructSetData($RECTF, "B", $BH)
    Local $Color1 = "0xFF" & $C1
    Local $Color2 = "0xFF" & $C2
    Local $pBRUSH = DllStructCreate("Ptr")
    DllCall($GDIPDll, "Int", "GdipCreateLineBrushFromRect", _
    "Ptr", DllStructGetPtr($RECTF), "Int", $Color1, "Int", $Color2, _
    "Int", $D, "Int", 0, "Ptr", DllStructGetPtr($pBRUSH))
    $pBRUSH = DllStructGetData($pBRUSH, 1)
    DllCall($GDIPDll, "Int", "GdipSetLineGammaCorrection", "Ptr", $pBRUSH, _
    "Int", $GC)
    Local $RELINT = DllStructCreate("Float[5]")
    Switch $3D
    Case 1
    DllStructSetData($RELINT, 1, 0.00, 1)
    DllStructSetData($RELINT, 1, 0.25, 2)
    DllStructSetData($RELINT, 1, 0.50, 3)
    DllStructSetData($RELINT, 1, 0.75, 4)
    DllStructSetData($RELINT, 1, 1.00, 5)
    Case 2
    DllStructSetData($RELINT, 1, 0.0, 1)
    DllStructSetData($RELINT, 1, 0.5, 2)
    DllStructSetData($RELINT, 1, 1.0, 3)
    DllStructSetData($RELINT, 1, 0.5, 4)
    DllStructSetData($RELINT, 1, 0.0, 5)
    Case Else
    DllStructSetData($RELINT, 1, 0.0, 1)
    DllStructSetData($RELINT, 1, 1.0, 2)
    DllStructSetData($RELINT, 1, 1.0, 3)
    DllStructSetData($RELINT, 1, 1.0, 4)
    DllStructSetData($RELINT, 1, 0.0, 5)
    EndSwitch
    Local $RELPOS = DllStructCreate("Float[5]")
    DllStructSetData($RELPOS, 1, 0.0, 1)
    If $3D <> 3 Then
    DllStructSetData($RELPOS, 1, 0.25, 2)
    Else
    DllStructSetData($RELPOS, 1, 0.15, 2)
    EndIf
    DllStructSetData($RELPOS, 1, 0.5, 3)
    If $3D <> 3 Then
    DllStructSetData($RELPOS, 1, 0.75, 4)
    Else
    DllStructSetData($RELPOS, 1, 0.85, 4)
    EndIf
    DllStructSetData($RELPOS, 1, 1.0, 5)
    DllCall($GDIPDll, "Int", "GdipSetLineBlend", _
    "Ptr", $pBRUSH, "Ptr", DllStructGetPtr($RELINT), _
    "Ptr", DllStructGetPtr($RELPOS), "Int", 5)
    DllCall($GDIPDll, "Int", "GdipFillRectangle", "Ptr", $pGRAPHICS, _
    "Ptr", $pBRUSH, "Float", 0, "Float", 0, "Float", $W, "Float", $H)
    Local $hBitmap = DllStructCreate("Ptr")
    DllCall($GDIPDll, "Int", "GdipCreateHBITMAPFromBitmap", _
    "Ptr", $pBITMAP, "Ptr", DllStructGetPtr($hBitmap), "Int", 0XFFFFFFFF)
    $hBitmap = DllStructGetData($hBitmap, 1)
    DllCall($GDIPDll, "Int", "GdipDeleteBrush", "Ptr", $pBRUSH)
    DllCall($GDIPDll, "Int", "GdipDisposeImage", "Ptr", $pBITMAP)
    DllCall($GDIPDll, "Int", "GdipDeleteGraphics", "Ptr", $pGRAPHICS)
    DllCall($GDIPDll, "None", "GdiplusShutdown", "Ptr", $GDIPToken)
    DllClose($GDIPDll)
    GUICtrlSendMsg($idCTRL, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    Return $hBitmap
    EndFunc ;==>_GUICtrlPic_GradientFill

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlPic_Invert
    ; Description ...: Farben eines Pic-Controls invertieren.
    ; Syntax.........: _GUICtrlPic_LoadImage($sPicPath)
    ; Parameters ....: $idPic - ControlID aus GUICtrlCreatePic()
    ; Return values .: Keine
    ; Author ........: Großvater (http://www.autoit.de)
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GUICtrlPic_Invert($idPic)
    Local Const $IMAGE_BITMAP = 0x0000, $STM_SETIMAGE = 0x0172, $STM_GETIMAGE = 0x0173, $DSTINVERT = 0x00550009
    Local $aResult
    Local $hBitmap = GUICtrlSendMsg($idPic, $STM_GETIMAGE, $IMAGE_BITMAP, 0)
    Local $aSize = WinGetClientSize(GUICtrlGetHandle($idPic))
    Local $iWidth = $aSize[0], $iHeight = $aSize[1]
    Local $hGDI32 = DllOpen("Gdi32.dll")
    $aResult = DllCall($hGDI32, "Handle", "CreateCompatibleDC", "Handle", 0)
    Local $hDC = $aResult[0]
    $aResult = DllCall($hGDI32, "Handle", "SelectObject", "Handle", $hDC, "Handle", $hBitmap)
    $aResult = DllCall($hGDI32, "BOOL", "BitBlt", "Handle", $hDC, "INT", 0, "INT", 0, "INT", $iWidth, "INT", $iHeight, _
    "Handle", $hDC, "INT", 0, "INT", 0, "DWORD", $DSTINVERT)
    $aResult = DllCall($hGDI32, "BOOL", "DeleteDC", "Handle", $hDC)
    DllClose($hGDI32)
    GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    EndFunc ;==>_GUICtrlPic_Invert
    ; ===============================================================================================================================

    [/autoit]


    Die UDF ist ausschließlich unter Win Vista 32 getestet. Ich hoffe, sie funktioniert auch unter anderen Systemen.

    Update am 10.12.2010:
    Ich hatte noch eine "Gradient"-Funktion, die ich jetzt in die UDF integriert habe. Sie ist völlig unabhängig von den anderen Funktionen, kann bei Bedarf also auch einfach herauskopiert werden. Wer Lust und Zeit hat, kann ja mal mit den Parametern herumspielen.

    Update am 27.12.2010:
    Wegen dieser Idee von Andy habe ich noch eine Funktion zum Invertieren von Pic-Controls gebastelt. Die mag vielleicht recht nutzlos sein, es hat aber Spaß gemacht. Auch sie ist völlig unabhängig von den anderen Funktionen, kann bei Bedarf also auch einfach herauskopiert werden.

    • Offizieller Beitrag

    Super deine UDF.

    Aber mal eine Frage, soll der Rahmen um die Pictures so sein?
    autoit.de/wcf/attachment/11955/
    autoit.de/wcf/attachment/11956/

    Wie sieht die GUI bei dir aus? Haben die Bilder auch einem Rahmen oder liegt das etwa an Windows7?

  • Also WinXP hat auch den rahmen
    Der Rahmen liegt an den $SS_SUNKEN
    wenn du die rausnimmst gibs keinen rahmen

    EDIT:
    ist es möglich die Position nach dem erstellen zu ändern? ohne es zu löschen und neu zu erstellen?
    EDIT2:
    Ah es geht ganz einfach mit
    GUICtrlSetPos
    ^^

    2 Mal editiert, zuletzt von Kijan (6. Dezember 2010 um 09:40)

    • Offizieller Beitrag

    OMG, wo ist das Smiley mit dem Hammer? :whistling:
    Man sollte keine UDF im Halbschlaf testen. Danke Kijan :thumbup:

  • Hallo Grossvater,

    hier dein Demo-Skript etwas abgeändert, damit auch jeder den Wert erkennt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include "GUICtrlPic.au3"
    $bFirst = True
    $Pic1 = @ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png"
    $Form1 = GUICreate("Form1", 400, 300)
    GUICtrlCreatePic(@ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png", 0, 0, 400, 300)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    $a8 = _GUICtrlPic_Create($Pic1 , 30, 30, 72, 72, BitOR($SS_CENTERIMAGE,$SS_SUNKEN, $SS_NOTIFY), Default)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    if $nMsg <> 0 Then ConsoleWrite($nMsg & @crlf)
    switch $nMsg
    case $GUI_EVENT_CLOSE
    Exit
    Case $a8
    if $bFirst Then
    _GUICtrlPic_SetImage($a8, @ProgramFilesDir & "\AutoIt3\Examples\GUI\Merlin.gif", 1)
    Else
    _GUICtrlPic_SetImage($a8, @ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png", 1)
    EndIf
    $bFirst = not $bFirst
    EndSwitch
    WEnd

    [/autoit]

    mfg autoBert

  • Hallo,

    danke für die Blumen, wenn's gefällt, freut es mich. ;)

    UEZ: Weil es ja irgendwie damit zu tun hat: Deine Funktion SetTransparentBitmap ist wirklich Klasse. Ich habe jetzt endlich mal verstanden, was man mit "Layered Windows" alles anstellen kann.

  • Hallo.

    Nehmen wir mal an, ich habe eine 400x300 GUI, darauf möchte ich ein png Bild anordnen (auch 400x300). GUI bekommt den Style WS_Popup, und man soll nichts anderes sehen, als das Bild, und die Stellen die transparent sind, durch die soll man hindurchgucken können. Lässt sich das bewerkstelligen?

  • Hallo NoName,

    schau Dir mal 3 Postings weiter oben mein Zitat zu einer Funktion von UEZ an. Da wird Dir geholfen. ;)

  • Hallo Großvater,

    ein Lob dass ich an dich weiterreiche, denn es ist deine UDF:

    mfg autoBert

  • Muss schon wieder ein altes Sahnestückchen ausgraben. Da ich diese UDF meist zusammen mit einer Hover-Funktion und der _AnimButton von @BugFix verwende habe ich die beiden Funktionen in die GuiCtrlPic integriert, hier die beiden Funktionsheader:

    • _GuiCtrlPic_CheckHoverDisabled:
      Code
      ;==================================================================================================
      ; Function Name:	_GuiCtrlPic_CheckHoverDisabled($hGui, ByRef $aHoverBtn)
      ; Description:		prüft den Status ein PicControls Enabled/Disabled Hovered/Normal
      ;					und setzt bei Statusänderung das dazugehörige Pic
      ; Parameter(s):		$hGui      	Handle der GUI
      ;					$aHoverBtn	2D-Array der HoverButtons ua mit Pfaden zu den Pics
      ; Author:           autoBert
      ;					getestet mit 3.3.14.1
      ;==================================================================================================
    • _GuiCtrlPic_AnimButton

      im Anhang noch die neue GuiCtrlPic und eine Demo sowie die benötigten Pictures dazu.

    Edit: Das vergessene $iDelay (von TJF im nachfolgenden Post gemeldet) eingefügt und Datei erneut hochgeladen. Die PNG's für den Exit-Button sind mir leider abhanden gekommen.

    MfG autoBert

  • Ich glaube, Du hast in der GUICtrlPic.au3 in Zeile 440 das $iDelay vergessen ...

    und - zwar unwesentlich - in pictures.zip die 4 Exit*.pngs. Dafür ist die ipHovered.png zuviel :)

    Einmal editiert, zuletzt von TJF (17. August 2015 um 16:40)