Jump to content

Button Icons With _WinAPI_ExtractIconEx


Bilgus
 Share

Recommended Posts

@TexWiller asked in Help & Support how to use _WinAPI_ExtractIconEx instead of GUICtrlSetImage

This is his reproducer script for displaying his issue I cleaned it up and made it work for _WinAPI_ExtractIconEx

;============================================================================================================
;Program Options
;============================================================================================================
Opt("MustDeclareVars", 1) ;Variables must be pre-declared.
Opt("TrayMenuMode", 3) ;The default tray menu items will not be shown, items are not checked when selected.

;============================================================================================================
;Libraries Inclusions
;============================================================================================================

#include <ColorConstants.au3>
#include <TrayConstants.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <GuiConstantsEx.au3>
#include <Array.au3>
#include <GuiButton.au3>
#include <StaticConstants.au3>


;============================================================================================================
;Global Vars
;============================================================================================================

Global $hMainGUI
Global $nMsg
Global $IdTrayMenuMain
Global $IdTrayMenuExit

Main()

Func Main()
    ;------------------------------------------------------------------------------------------------------------
    ;Create Main Window
    ;------------------------------------------------------------------------------------------------------------
    $hMainGUI = GUICreate("Sample", 1024, 700, 50, 50, BitOR($WS_SYSMENU, $WS_CAPTION, $DS_SETFOREGROUND))
    GUISetFont(8, $FW_NORMAL, $GUI_FONTNORMAL, "Arial", $hMainGUI, $CLEARTYPE_QUALITY)
    GUISetBkColor(0xDDDDDD, $hMainGUI)
    GUISetState(@SW_SHOW, $hMainGUI)
    WinWaitActive($hMainGUI)

    ;============================================================================================================
    ;Create Traymenu
    ;============================================================================================================

    ;Create a Traymenu.
    $IdTrayMenuMain = TrayCreateItem("Sample", -1, 0)

    ;Create a Separator line.
    TrayCreateItem("", -1, -1)

    ;Create a Menuitem.
    $IdTrayMenuExit = TrayCreateItem("Exit", -1, -1)

    ;Show the Traymenu.
    TraySetState($TRAY_ICONSTATE_SHOW)

    ;------------------------------------------------------------------------------------------------------------
    ;Sample
    ;------------------------------------------------------------------------------------------------------------

    Local $aIconButtons[0] ;Array to manage Buttons
    Local $aIconBLabels[0] ;Array to manage Buttons

    Local $iButtonPosLeft = 10 ;Inserting Position X
    Local $iButtonPosTop = 10 ;Inserting Position Y

    Local $iButtonCount
    Local $iIcnPosOffset = 0

    Local $iIconCt = _WinAPI_ExtractIconEx("shell32.dll", -1, 0, 0, 0) ;retrieve count of Icons
    ConsoleWrite("Icons: " & $iIconCt & @CRLF)
    Local $iIconIdx = 0 ;The Icon Index to begin extracting at

    Local $tIconsLg = DllStructCreate("HANDLE[" & $iIconCt & "]")
    Local $pIconsLg = DllStructGetPtr($tIconsLg)

    Local $tIconsSm = DllStructCreate("HANDLE[" & $iIconCt & "]")
    Local $pIconsSm = DllStructGetPtr($tIconsSm)

    $iIconCt = _WinAPI_ExtractIconEx("shell32.dll", $iIconIdx, $pIconsLg, $pIconsSm, $iIconCt) ;Get Large/ Small Icon Handles into arrays
    ConsoleWrite("Icons Extracted: " & $iIconCt & @CRLF) ; ;; PS Don't Forget _WinAPI_DestroyIcon()

    For $iButtonCount = 1 To 200

        If BitAND($iButtonCount, 1) Then
            _ArrayAdd($aIconButtons, GUICtrlCreateButton("", $iButtonPosLeft, $iButtonPosTop, 45, 45, $BS_ICON)) ;Icon Only
        Else
            _ArrayAdd($aIconButtons, GUICtrlCreateButton($iButtonCount, $iButtonPosLeft, $iButtonPosTop, 45, 45)) ;Icon and Text
        EndIf
        _ArrayAdd($aIconBLabels, GUICtrlCreateLabel(1 * ($iButtonCount + $iIcnPosOffset), $iButtonPosLeft, $iButtonPosTop + 45, 45, 15))
        GUICtrlSetStyle($aIconBLabels[$iButtonCount - 1], BitOR($SS_CENTER, $SS_CENTERIMAGE))

        $iButtonPosLeft = $iButtonPosLeft + 50

        If Mod($iButtonCount, 20) = 0 Then
            $iButtonPosTop = $iButtonPosTop + 70
            $iButtonPosLeft = 10
        EndIf

        ;retrieving Icons by positive position
        ;*****************************************************************************************
        ;$MessageTemp = GUICtrlSetImage($aIconButtons[$iButtonCount - 1], "shell32.dll", 1 * ($iButtonCount + $iIcnPosOffset) , 1)
        ;*****************************************************************************************

        If $iButtonCount < $iIconCt Then
            If BitAND($iButtonCount, 1) Then
                GUICtrlSendMsg($aIconButtons[$iButtonCount - 1], $BM_SETIMAGE, $IMAGE_ICON, DllStructGetData($tIconsLg, 1, $iButtonCount))
            Else
                GUICtrlSendMsg($aIconButtons[$iButtonCount - 1], $BM_SETIMAGE, $IMAGE_ICON, DllStructGetData($tIconsSm, 1, $iButtonCount))
            EndIf
        EndIf

    Next

    ;Destroy all the extracted icons
    ConsoleWrite("Destroying Icons" & @CRLF)
    For $i = 1 To $iIconCt
        _WinAPI_DestroyIcon(DllStructGetData($tIconsLg, 1, $i))
        _WinAPI_DestroyIcon(DllStructGetData($tIconsSm, 1, $i))
    Next


    ;============================================================================================================
    ;GUI Loop
    ;============================================================================================================
    While True
        ;------------------------------------------------------------------------------------------------------------
        ;Get GUI-Messages
        ;------------------------------------------------------------------------------------------------------------
        $nMsg = GUIGetMsg()
        If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
        ;------------------------------------------------------------------------------------------------------------
        ;Get Traymenu Messages
        ;------------------------------------------------------------------------------------------------------------
        Switch TrayGetMsg()
            Case $IdTrayMenuExit ;Exit.
                ExitLoop
        EndSwitch
        ;------------------------------------------------------------------------------------------------------------
    WEnd
EndFunc   ;==>Main

 

Edited by Bilgus
Link to comment
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
 Share

×
×
  • Create New...