Icon über Pic Problem

  • Hi...

    Gelöst letzter Post...

    Ich habe das Problem, dass wenn ich ein Icon mit tranparentem Bereich über ein Pic lege, der Hintergund des Icons an den tranpartenten Stellen nicht die farbe des Pics annimmt sondern die Farbe des Hintergrundes....

    [Blockierte Grafik: http://img197.imageshack.us/img197/9870/aufzeichnenn.jpg]

    wie kann man das ändern?
    Habe Pic und Icon als 7z im Anhang.

    Spoiler anzeigen
    [autoit]

    $hgui = GUICreate ( "test", 500 , 500 )
    GUISetBkColor (0x00ff00)
    GUICtrlCreatePic ( 'hg.jpg',0,0 )
    GUICtrlCreateIcon('test.ico','',40,40,48,48)

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

    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

    [/autoit]


    MFG chris :D

  • Oder du schikst mir das Bild und


    Edit*
    Ich bearbeite es mit Photoshop und mach es so , dass man nur das Icon sieht ohne Hintergrund ;)

    Ergebnis. Naja geht auch nicht , hätte ja klappen können , war ich wohl zu voreilig *Sorry ^^

    Einmal editiert, zuletzt von tuttifrutti (7. Juni 2009 um 15:09)

  • Oder du schikst mir das Bild und ich bearbeite es mit Photoshop und mach es so , dass man nur das Icon sieht ohne Hintergrund ;)


    Das funktioniert nicht. Das Icon ist doch schon transparent. AutoIt ersetzt aber transparente Icon-Bereiche mit der Hintergrundfarbe der GUI :( Daher braucht man extra UDFs.

  • Hallo chrisatack,

    mit diesem Konzept könnte es klappen, TransGui.Du musst die Bilder evtl. greller zeichnen, damit sie durch den Transparenzeffekt nicht zu arg verblassen, ausserdem stelle ich es mir sehr aufwendig vor für jedes Icon eine HilfsGui zu erstellen,

    mfg (Auto)Bert

  • Servus...

    wollte es nur mal gerade als Nachtrag einreichen, dass ein Ico mit transparenz doch über einem Bild geht ohne die Hintergrundfarbe des Guis anzunehmen ^^
    Damit ist diese Thema gelöst ^^

    [Blockierte Grafik: http://img27.imageshack.us/img27/8288/aufzeichnenc.png]

    Dateien aus dem 1 Beitrag laden....

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

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

    $hgui = GUICreate ( "test", 500 , 500 )
    GUISetBkColor (0x00ff00)
    GUICtrlCreatePic ( 'hg.jpg',0,0 )
    $hPic = GUICtrlCreatePic ('',40,40,48,48 )
    __SetIconAlpha($hPic, 'test.ico',0, 48, 48)

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

    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func __SetIconAlpha($hWnd, $sIcon, $iIndex, $iWidth, $iHeight)
    If Not IsHWnd($hWnd) Then
    $hWnd = GUICtrlGetHandle($hWnd)
    If $hWnd = 0 Then
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Local $hIcon = __WinAPI_ShellExtractIcons($sIcon, $iIndex, $iWidth, $iHeight)
    If $hIcon = 0 Then
    Return SetError(1, 0, 0)
    EndIf
    Local $hBitmap, $hObj, $hDC, $hMem, $hSv
    $hDC = _WinAPI_GetDC($hWnd)
    $hMem = _WinAPI_CreateCompatibleDC($hDC)
    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    $hSv = _WinAPI_SelectObject($hMem, $hBitmap)
    _WinAPI_DrawIconEx($hMem, 0, 0, $hIcon, $iWidth, $iHeight, 0, 0, 2)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _WinAPI_SelectObject($hMem, $hSv)
    _WinAPI_DeleteDC($hMem)
    _WinAPI_DestroyIcon($hIcon)
    _WinAPI_DeleteObject(_SendMessage($hWnd, 0x0172, 0, 0))
    _SendMessage($hWnd, 0x0172, 0, $hBitmap)
    $hObj = _SendMessage($hWnd, 0x0173)
    If $hObj <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
    EndIf
    Return 1
    EndFunc ;==>_SetIconAlpha

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

    Func __WinAPI_ShellExtractIcons($sIcon, $iIndex, $iWidth, $iHeight)
    Local $Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
    If (@error) Or ($Ret[0] = 0) Or ($Ret[5] = Ptr(0)) Then
    Return SetError(1, 0, 0)
    EndIf
    Return $Ret[5]
    EndFunc ;==>_WinAPI_ShellExtractIcons

    [/autoit]

    MFG chris :D

  • Hallo,
    das ist genau das was ich momentan suche. Danke :rock:
    Hätte da aber noch das Problem, dass wenn ich das Icon anklicke etwas ausgeführt werden soll. Leider reagiert das Icon jedoch nicht darauf.
    Kann mir jemand mit dem Problem helfen?

    Danke

    Einmal editiert, zuletzt von user2009 (23. Oktober 2009 um 22:40)

  • Hallo user2009,

    du must beim erstellen mir GuiCreatePic den Stil $WS_CLIPSIBLINGS verwenden, zusätzlich noch

    [autoit]

    GUICtrlSetState($hPic, BitOR($GUI_ONTOP, $GUI_SHOW)) und dann klappt's

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

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

    $hgui = GUICreate ( "test", 500 , 500 )
    GUISetBkColor (0x00ff00)
    GUICtrlCreatePic ( 'hg.jpg',0,0 ,$WS_CLIPSIBLINGS)
    $hPic = GUICtrlCreatePic ('',40,40,48,48 )
    __SetIconAlpha($hPic, 'test.ico',0, 48, 48)

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

    GUICtrlSetState($hPic, BitOR($GUI_ONTOP, $GUI_SHOW))

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

    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    case $hPic
    MsgBox(0,"","Das Icon wurde angeklickt!!!")
    EndSwitch
    WEnd

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

    Func __SetIconAlpha($hWnd, $sIcon, $iIndex, $iWidth, $iHeight)
    If Not IsHWnd($hWnd) Then
    $hWnd = GUICtrlGetHandle($hWnd)
    If $hWnd = 0 Then
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Local $hIcon = __WinAPI_ShellExtractIcons($sIcon, $iIndex, $iWidth, $iHeight)
    If $hIcon = 0 Then
    Return SetError(1, 0, 0)
    EndIf
    Local $hBitmap, $hObj, $hDC, $hMem, $hSv
    $hDC = _WinAPI_GetDC($hWnd)
    $hMem = _WinAPI_CreateCompatibleDC($hDC)
    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    $hSv = _WinAPI_SelectObject($hMem, $hBitmap)
    _WinAPI_DrawIconEx($hMem, 0, 0, $hIcon, $iWidth, $iHeight, 0, 0, 2)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _WinAPI_SelectObject($hMem, $hSv)
    _WinAPI_DeleteDC($hMem)
    _WinAPI_DestroyIcon($hIcon)
    _WinAPI_DeleteObject(_SendMessage($hWnd, 0x0172, 0, 0))
    _SendMessage($hWnd, 0x0172, 0, $hBitmap)
    $hObj = _SendMessage($hWnd, 0x0173)
    If $hObj <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
    EndIf
    Return 1
    EndFunc ;==>_SetIconAlpha

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

    Func __WinAPI_ShellExtractIcons($sIcon, $iIndex, $iWidth, $iHeight)
    Local $Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
    If (@error) Or ($Ret[0] = 0) Or ($Ret[5] = Ptr(0)) Then
    Return SetError(1, 0, 0)
    EndIf
    Return $Ret[5]
    EndFunc ;==>_WinAPI_ShellExtractIcons

    [/autoit]

    mfg (Auto)bert

  • Danke für die schnelle Antwort.
    Habe aber natürlich noch ein Problem.
    Durch den Befehl GUICtrlSetState wird wieder der Hintergrund um das Icon angezeigt. Wenn der Befehlt nicht verwendet wird funktioniert es einwandfrei.

    Aber zu meinem Problem. Wenn das Icon angeklickt wird soll sich das Icon ändern. Habe in diesem Fall einfach den Befehl

    [autoit]

    __SetIconAlpha($hPic, 'test2.ico',0, 48, 48)

    [/autoit]

    verwendet. Jedoch verschwindet dann das Icon einfach. Wenn ich den GUICtrlSetState-Befehl hinterher schicke wird das neue Icon zwar angezeigt, jedoch wieder mit dem GUI Hintergrund (grau).
    Eine Idee wie ich das Icon einwandfrei ändern kann.

    Edit: Habe gerade gemerkt, dass wenn das Hintergrundbild nicht vorhanden ist, funktioniert es so wie ich es mir vorstelle. Aber der Hintergrund ist notwendig.

    Einmal editiert, zuletzt von user2009 (25. Oktober 2009 um 13:37)