Sign in to follow this  
Followers 0
Skitty

Toolbar BMP button image background transparency

5 posts in this topic

The topic title is straight up.

How does one set the bmp button images to the toolbar and keep the transparency?

For example, look at scite, it adds a custom bmp which is the paper with the [x] in the lower right corner and it has full transparency.

The below example will use the same image scite does, but fail to be transparent. :D

#include <GuiToolbar.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <gdiplus.au3>

$Debug_TB = False ; Check ClassName being passed to functions, set to True and use a handle to another control to see it work
Global $iMemo

_Main()

Func _Main()
Local $hGUI, $hToolbar, $hNormal, $hDisabled, $hHot
Local Enum $id1 = 1000, $id2, $id3

; Create GUI
$hGUI = GUICreate("Toolbar", 400, 300)
GUISetBkColor(0)
$hToolbar = _WinAPI_CreateWindowEx(0, "ToolbarWindow32", "",BitOR($WS_CHILD, $WS_CLIPSIBLINGS, $WS_VISIBLE, $TBSTYLE_TOOLTIPS),0,0,0,0, $hGUI)
__GUICtrlToolbar_ButtonStructSize($hToolbar)
_SendMessage($hToolbar, $TB_SETSTYLE, 0, 0x54000901)
$iMemo = GUICtrlCreateEdit("", 2, 36, 396, 262, $WS_VSCROLL)
GUICtrlSetFont($iMemo, 10, 400, 0, "Courier New")
GUISetState()

Local $CloseBMP = _ImgProcess(Binary("0x424DEE000000000000007600000028000000100000000F00000001000" & _
"4000000000078000000120B0000120B00001000000010000000000000000000800000800000008080008" & _
"00000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0" & _
"000FFFFFF0077777777888888887777777F777777787770000F707770787770FFFF770707787770FFFF7" & _
"77077787770FFFF770707787770FFFF707770787770FFFF777777787770FFFFFFFFFFF77770FFFFFFFFF" & _
"0777770FFFFFFFFF0777770FFFFFF0000777770FFFFFF0F07777770FFFFFF0077777770000000077777")); Binary BMP image for the "File Close" icon

; Create normal image list
$hNormal = _GUIImageList_Create(16, 16, 5)
_GUIImageList_Add($hNormal, $STD_COPY)
_GUIImageList_Add($hNormal, $CloseBMP)
_GUIImageList_Add($hNormal, $STD_FIND)
Local $hPrevImageList = _GUICtrlToolbar_SetImageList($hToolbar, $hNormal)
MemoWrite("Previous Image list handle .: 0x" & Hex($hPrevImageList))
MemoWrite("IsPtr = " & IsPtr($hPrevImageList) & " IsHWnd = " & IsHWnd($hPrevImageList))

_GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_SMALL_COLOR)

; Add buttons
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddButton($hToolbar, $id1, 0 )
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddButton($hToolbar, $id2, 1)
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddButton($hToolbar, $id3, 2)

MemoWrite("Normal list handle ...: 0x" & Hex(_GUICtrlToolbar_GetImageList($hToolbar)))

; Loop until user exits
Do
Until GUIGetMsg() = -3

EndFunc ;==>_Main

Func _ImgProcess(Const $bBinary);Merged code by Progandy and Zedna
Local $iLen = BinaryLen($bBinary)
If $iLen = 0 Then Return SetError(2, 0, 0)
Local $hMem = _MemGlobalAlloc($iLen, $GMEM_MOVEABLE)
If @error Or Not $hMem Then Return SetError(3, 0, 0)
DllStructSetData(DllStructCreate("byte[" & $iLen & "]", _MemGlobalLock($hMem)), 1, $bBinary)
If @error Then
_MemGlobalUnlock($hMem)
_MemGlobalFree($hMem)
Return SetError(4, 0, 0)
EndIf
_MemGlobalUnlock($hMem)
_GDIPlus_Startup()
Local $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $hMem, "bool", True, "ptr*", 0)
If @error Or $aResult[0] <> 0 Or $aResult[3] = 0 Then Return SetError(5, @error, 0)
Local $hImage = DllCall($ghGDIPDll, "uint", "GdipLoadImageFromStream", "ptr", $aResult[3], "int*", 0)
Local $error = @error
Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $aResult[3], "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
If @error Then Return SetError(6, $error, 0)
If $hImage[2] = 0 Then Return SetError(7, 0, $hImage[2])
Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[2])
_GDIPlus_ImageDispose($hImage[2])
_GDIPlus_Shutdown()
Return SetError(0, 0, $hBitmap)
EndFunc ;==>_ImgProcess


; Write message to memo
Func MemoWrite($sMessage = "")
GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc ;==>MemoWrite

Things that I've done..

Icon Resource Editor: icon resource editor 

AutoIt Piano: a piano

AutoIt Unlocker: unlocks files when you want to delete them

Colorful tooltips: a wrapper for the tool tips UDF

Rouge GoogleBot: a full screen animation

ASciTE text editor: a text editor written in autoit

Warning: Posts by this user are subject to change or may disappear without notice.

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

I converted your BMP to PNG and it seems to be working:

#include <GuiToolbar.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <gdiplus.au3>

$Debug_TB = False ; Check ClassName being passed to functions, set to True and use a handle to another control to see it work
Global $iMemo

_Main()

Func _Main()
    Local $hGUI, $hToolbar, $hNormal, $hDisabled, $hHot
    Local Enum $id1 = 1000, $id2, $id3, $id4

;~  Local $CloseBMP = _ImgProcess(Binary("0x424DEE000000000000007600000028000000100000000F00000001000" & _
;~          "4000000000078000000120B0000120B00001000000010000000000000000000800000800000008080008" & _
;~          "00000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0" & _
;~          "000FFFFFF0077777777888888887777777F777777787770000F707770787770FFFF770707787770FFFF7" & _
;~          "77077787770FFFF770707787770FFFF707770787770FFFF777777787770FFFFFFFFFFF77770FFFFFFFFF" & _
;~          "0777770FFFFFFFFF0777770FFFFFF0000777770FFFFFF0F07777770FFFFFF0077777770000000077777")); Binary BMP image for the "File Close" icon
    Local $CloseBMP = _ImgProcess(Binary("0x89504E470D0A1A0A0000000D49484452000000100000000F0806000000ED734F2F000000097048597300000B1300000B1301009A9C180000008049444154785E9D93610A80200C85F7C2837934BBD93CD98B09239865CD0F4A067BDFDC0F41B981086501AD255024403E3B00589A517248029243B22D0030AD5A12D383C86FB0CFBE80E4F8FD5AA1F72E6F686BFC75835A6BAC732BA8AA87ECB43A0812120F67051EB6732D00E0DF1436A2A47C3C167AC88935286BCED6962D1714C53BA791E5B88A0000000049454E44AE426082")); Binary PNG image for the "File Close" icon

    ; Create GUI
    $hGUI = GUICreate("Toolbar", 400, 300)
;~  GUISetBkColor(0)
    $hToolbar = _GUICtrlToolbar_Create($hGUI, $TBSTYLE_FLAT)
    _GUICtrlToolbar_SetBitmapSize($hToolbar, 16, 16)
    _GUICtrlToolbar_AddBitmap($hToolbar, 1, 0, $CloseBMP)
    _GUICtrlToolbar_AddButton($hToolbar, $id1, 0)
    _GUICtrlToolbar_AddButtonSep($hToolbar)
    _GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_SMALL_COLOR)
    _GUICtrlToolbar_AddButton($hToolbar, $id2, 1)
    _GUICtrlToolbar_AddButtonSep($hToolbar)
    _GUICtrlToolbar_AddButton($hToolbar, $id3, 2)
    _GUICtrlToolbar_AddButtonSep($hToolbar)
    _GUICtrlToolbar_AddButton($hToolbar, $id4, 3)

    $iMemo = GUICtrlCreateEdit("", 2, 36, 396, 262, $WS_VSCROLL)
    GUICtrlSetFont($iMemo, 10, 400, 0, "Courier New")
    GUISetState()

    ; Loop until user exits
    Do
    Until GUIGetMsg() = -3

EndFunc   ;==>_Main

Func _ImgProcess(Const $bBinary);Merged code by Progandy and Zedna
    Local $iLen = BinaryLen($bBinary)
    If $iLen = 0 Then Return SetError(2, 0, 0)
    Local $hMem = _MemGlobalAlloc($iLen, $GMEM_MOVEABLE)
    If @error Or Not $hMem Then Return SetError(3, 0, 0)
    DllStructSetData(DllStructCreate("byte[" & $iLen & "]", _MemGlobalLock($hMem)), 1, $bBinary)
    If @error Then
        _MemGlobalUnlock($hMem)
        _MemGlobalFree($hMem)
        Return SetError(4, 0, 0)
    EndIf
    _MemGlobalUnlock($hMem)
    _GDIPlus_Startup()
    Local $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $hMem, "bool", True, "ptr*", 0)
    If @error Or $aResult[0] <> 0 Or $aResult[3] = 0 Then Return SetError(5, @error, 0)
    Local $hImage = DllCall($ghGDIPDll, "uint", "GdipLoadImageFromStream", "ptr", $aResult[3], "int*", 0)
    Local $error = @error
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $aResult[3], "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
    If @error Then Return SetError(6, $error, 0)
    If $hImage[2] = 0 Then Return SetError(7, 0, $hImage[2])
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[2])
    _GDIPlus_ImageDispose($hImage[2])
    _GDIPlus_Shutdown()
    Return SetError(0, 0, $hBitmap)
EndFunc   ;==>_ImgProcess


; Write message to memo
Func MemoWrite($sMessage = "")
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite

Br,

UEZ

Edited by UEZ
1 person likes this

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

I converted your BMP to PNG and it seems to be working:

~~

Br,

UEZ

Incredible, when posting this thread, I had a feeling the answer was within you.

Thanks UEZ!

I searched and searched, I don't know why the hell I didn't think about just using a png....

And I'm curious (for compatability reasons), why did you remove the method I used to create the toolbar?

I used that method because it is the only way I could set that particular style for the toolbar where the background color is a sort of bone white. That and by just setting the flat style after its creation, creating it with the style initially does not work as I have found. Edit: Setting it any other ways seems to make the separator buttons invisible...

post-60631-0-24291100-1340665272_thumb.p

This is exactly the effect I was after.

#include <GuiToolbar.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <gdiplus.au3>

$Debug_TB = False ; Check ClassName being passed to functions, set to True and use a handle to another control to see it work
Global $iMemo

_Main()

Func _Main()
Local $hGUI, $hToolbar, $hNormal, $hDisabled, $hHot
Local Enum $id1 = 1000, $id2, $id3, $id4

Local $CloseBMP = _ImgProcess(Binary("0x89504E470D0A1A0A0000000D49484452000000100000000F0803000000DAADBF1D0000001974455874536F6674776172650041646F626520496D616765526561647971C9653C0000000C504C5445000000808080FFFFFFFFFFFF788A14520000000474524E53FFFFFF00402AA9F4000000454944415478DA848DD10A0020080397FBFF7FAEA9A006D13D081E6303492414BA30274C17863BA14C13725F615682C12A11134D9C0F23117D8FC4617488B1E262255B800100EE9901EEBBDA13030000000049454E44AE426082")); Binary PNG image for the "File Close" icon
; Create GUI
$hGUI = GUICreate("Toolbar", 400, 300)

;Create bone whiteish color and allow seperators to be visible
;~ $hToolbar = _WinAPI_CreateWindowEx(0, "ToolbarWindow32", "",BitOR($WS_CHILD, $WS_CLIPSIBLINGS, $WS_VISIBLE, $TBSTYLE_TOOLTIPS),0,0,0,0, $hGUI)
;~ __GUICtrlToolbar_ButtonStructSize($hToolbar)
;~ _SendMessage($hToolbar, $TB_SETSTYLE, 0, 0x54000901)

;Same thing as above but more behind the scene script operations...
$hToolbar = _GUICtrlToolbar_Create($hGUI, $TBSTYLE_TOOLTIPS)
_GUICtrlToolbar_SetStyleFlat($hToolbar,1)

;~ $hToolbar = _GUICtrlToolbar_Create($hGUI, $TBSTYLE_TOOLTIPS+$TBSTYLE_FLAT); creating it this way doesn't work (win xp), that is why I use either of above methods

_GUICtrlToolbar_SetBitmapSize($hToolbar, 16, 16)
_GUICtrlToolbar_AddBitmap($hToolbar, 1, 0, $CloseBMP)
_GUICtrlToolbar_AddButton($hToolbar, $id1, 0)
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_SMALL_COLOR)
_GUICtrlToolbar_AddButton($hToolbar, $id2, 1)
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddButton($hToolbar, $id3, 2)
_GUICtrlToolbar_AddButtonSep($hToolbar)
_GUICtrlToolbar_AddButton($hToolbar, $id4, 3)

$iMemo = GUICtrlCreateEdit("", 2, 36, 396, 262, $WS_VSCROLL)
GUICtrlSetFont($iMemo, 10, 400, 0, "Courier New")
GUISetState()

; Loop until user exits
Do
Until GUIGetMsg() = -3

EndFunc ;==>_Main

Func _ImgProcess(Const $bBinary);Merged code by Progandy and Zedna
Local $iLen = BinaryLen($bBinary)
If $iLen = 0 Then Return SetError(2, 0, 0)
Local $hMem = _MemGlobalAlloc($iLen, $GMEM_MOVEABLE)
If @error Or Not $hMem Then Return SetError(3, 0, 0)
DllStructSetData(DllStructCreate("byte[" & $iLen & "]", _MemGlobalLock($hMem)), 1, $bBinary)
If @error Then
_MemGlobalUnlock($hMem)
_MemGlobalFree($hMem)
Return SetError(4, 0, 0)
EndIf
_MemGlobalUnlock($hMem)
_GDIPlus_Startup()
Local $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $hMem, "bool", True, "ptr*", 0)
If @error Or $aResult[0] <> 0 Or $aResult[3] = 0 Then Return SetError(5, @error, 0)
Local $hImage = DllCall($ghGDIPDll, "uint", "GdipLoadImageFromStream", "ptr", $aResult[3], "int*", 0)
Local $error = @error
Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $aResult[3], "dword", 8 + 8 * @AutoItX64, "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT))
If @error Then Return SetError(6, $error, 0)
If $hImage[2] = 0 Then Return SetError(7, 0, $hImage[2])
Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage[2])
_GDIPlus_ImageDispose($hImage[2])
_GDIPlus_Shutdown()
Return SetError(0, 0, $hBitmap)
EndFunc ;==>_ImgProcess


; Write message to memo
Func MemoWrite($sMessage = "")
GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc ;==>MemoWrite

Edited by ApudAngelorum

Things that I've done..

Icon Resource Editor: icon resource editor 

AutoIt Piano: a piano

AutoIt Unlocker: unlocks files when you want to delete them

Colorful tooltips: a wrapper for the tool tips UDF

Rouge GoogleBot: a full screen animation

ASciTE text editor: a text editor written in autoit

Warning: Posts by this user are subject to change or may disappear without notice.

Share this post


Link to post
Share on other sites

I wasn't aware of what you have tried to achieve and I minimized the code for better understanding.

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0