RibbonsBar (Office 2007 Bar) UDF

  • Hi,

    ich versuche mich gerade an dieser schönen UDF und versuche auch, sie unter Wine zum Laufen zu bringen. Das funktioniert jetzt grundsätzlich mit dem gerade behobenen Wine-Bug zur shell32.dll (mit "SHExtractIconsW"), bzw. mit einer MS-Version. Allerdings werden die Icons aus der *Icons.dll nicht transparent angezeigt. Jetzt habe ich testweise mal ein Icon aus der shell32.dll eingebaut, z.B.:

    [autoit]


    $hGrandButton_GUIOeffnen = _RibbonsBar_Create_GrandButton($hItem_Allgemein,'shell32.dll',-5,'Öffnen',75 )

    [/autoit]

    Das schaut jetzt auch unter Windows so aus wie in Wine: Nicht transparente Icons. Kann mir jemand sagen, wo hier das Problem ist? Die Frage ließe sich auch am einfachsten beantworten, wenn man in der UDF das o.g. Beispiels-Icon aus der shell32.dll transparent unter Win anzeigen könnte...

    Dank und Gruß
    Thomas

  • Hallo TJF

    Ich habe mal ein paar Tests gemacht. Die Farbtiefe der Icons muss mindestens 16,8 Mio haben damit es mit dem Alphawert klappt.
    Wenn du mit dem ResHacker die shell32.dll öffnest kannst du die Informationen zu den Icons sehen.

    einfach unter Icon Group und dann der Nummer... Damit es klappt muss in etwas das hier da stehen.

    SQL
    48 x 48 (16 colors) - Ordinal name: 108
    32 x 32 (16 colors) - Ordinal name: 109
    16 x 16 (16 colors) - Ordinal name: 110
    48 x 48 (256 colors) - Ordinal name: 111
    32 x 32 (256 colors) - Ordinal name: 112
    16 x 16 (256 colors) - Ordinal name: 113
    48 x 48 (16.8mil colors) - Ordinal name: 114
    32 x 32 (16.8mil colors) - Ordinal name: 115
    16 x 16 (16.8mil colors) - Ordinal name: 116

    Ich hoffe ich konnte dir helfen.

    MFG Chris :D

  • Danke! Jetzt sind die Icons aus der shell32.dll in Win transparent. Das isses aber dann nicht für Wine: Dort sind auch diese Icons wie die aus den *icon.dll nicht transparent. Gibt es da eine bestimmte dll, die dafür zuständig sein könnte? Der Process-Monitor zeigt zu viele dlls an, die da ins Spiel kommen nach dem Programmstart ...

  • Moin...

    Ich denke mal das in __RibbonsBar_SetIconAlpha() einiges gecallt wird.
    Auf jeden fall:
    __RibbonsBar_ShellExtractIcons => shell32.dll
    _WinAPI => user32.dll
    __RibbonsBar_SendMessage => wieder shell32.dll

    Ich kann dir aber leider nicht dabei helfen sorry. DLL und Wine kenne ich mich überhaupt nicht aus.

    MFG Chris :D

    Spoiler anzeigen
    [autoit]

    ; #INTERNAL_USE_ONLY# ===========================================================================================================
    ; Name...........: __RibbonsBar_SetIconAlpha()
    ; Description ...: Fügt einem Icon mit transparentz ein
    ; Parameters ....: $hWnd - GuiHandle
    ; $sIcon - Pfad zum Icon
    ; $iIndex - Icon Nummer
    ; $iWidth - Breite
    ; $iHeight - Höhe
    ; Return values .: Erfolg - Zeichnet ein transparentes Icon in einen Gui
    ; Fehler - Gibt 0 zurück und setzt @error auf 1
    ; Author ........: n/a
    ; Remarks .......: n/a
    ; ===============================================================================================================================
    Func __RibbonsBar_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 = __RibbonsBar_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(__RibbonsBar_SendMessage($hWnd, 0x0172, 0, 0))
    __RibbonsBar_SendMessage($hWnd, 0x0172, 0, $hBitmap)
    $hObj = __RibbonsBar_SendMessage($hWnd, 0x0173)
    If $hObj <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
    EndIf
    Return 1
    EndFunc ;==>__RibbonsBar_SetIconAlpha

    [/autoit]
  • Hi Chris,

    die beiden dlls sind es nicht. Danke auf jeden Fall. Die Lösung des Problems liegt leider auf einer ganz anderen Baustelle.

    Viele Grüße
    Thomas

  • Hallo,

    kann mir jemand bitte sagen, wie man am einfachsten eine von mehreren "Tab-Seiten" komplett in den Hide/Show-Zustand bringen kann? Mir gelingt das nur, wenn alle einzelnen Controls aktiviert/deaktiviert werden. Vielleicht habe ich auch eine veraltete Version(0.2.19 Beta). Die Download-Links auf der ersten Seite funktionieren ja nicht mehr - wie zahlreiche alte Links.

    Vielleicht hat jemand ein Beispiel...?

    Dank und Gruß
    Thomas