/* Function: ILButton Creates an ImageList and associates it with a button. Parameters: HBtn - Handle of a buttton. Images - A pipe delimited list of images in form "FileName[:zeroBasedIndex]" or ImageList handle. Any position can be omitted in which case icon for state "normal" is used. Cx - Width of the image in pixels. By default 16. Cy - Height of the image in pixels. By default 16. Align - One of the word: Left (default), Right, Top, Bottom, Center. Margin - Margin around the icon. A space separated list of four integers in form "left top right bottom". Images: - File must be of type exe, dll, ico, cur, ani or bmp. - There are 5 states: normal, hot (hover), pressed, disabled, defaulted (focused), stylushot. - If only one image is specified, it will be used for all the button's states - If fewer than six images are specified, nothing is drawn for the states without images - Omit "file" to use the last file specified ( "states.dll:0|:1|:2|:3|:4|:5" ) - Omitting an index is the same as specifying 0. Returns: Handle of the ImageList if operation was completed or 0 otherwise. Remarks: Within Aero theme (WinOS >= Vista), a defaulted (focused) button fades between images 5 and 6. Each succesifull call to this function creates new ImageList. If you are calling this function more times for single button control, freeing previous ImageList is your responsibility. About: - Version 1.0 by majkinetor. - Original code by tkoi. See - Minimum operating systems: Windows XP. - Licensed under GNU GPLv3 */ ILButton(HBtn, Images, Cx=16, Cy=16, Align="Left", Margin="1 1 1 1") { static BCM_SETIMAGELIST=0x1602, a_left=0, a_right=1, a_top=2, a_bottom=3, a_center=4 if Images is not integer { hIL := DllCall("ImageList_Create", "UInt", Cx, "UInt",Cy, "UInt", 0x20, "UInt", 1, "UInt", 6) Loop, Parse, Images, |, %A_Space%%A_Tab% { if (A_LoopField = "") { DllCall("ImageList_AddIcon", "UInt", hIL, "UInt", I) continue } if (k := InStr(A_LoopField, ":", 0, 0)) && ( k!=2 ) v1 := SubStr(A_LoopField, 1, k-1), v2 := SubStr(A_LoopField, k+1) else v1 := A_LoopField, v2 := 0 ifEqual, v1,,SetEnv,v1, %prevFileName% else prevFileName := v1 if SubStr(v1, -3) = ".bmp" { hBmp := DllCall("LoadImage", "UInt", 0, "Str", v1, "UInt", 0, "Int", Cx, "Int", Cy, "UInt", 0x10 , "UInt") ; 0x10=LR_LOADFROMFILE DllCall("ImageList_Add", "UInt", hIL, "UInt", hBmp) ifEqual, A_Index, 1, SetEnv, B, %hBmp% else DllCall("DestroyIcon", "UInt", hBmp) } else { ;although privateextract loads bmps too it shows black dot in top left corner ... DllCall("PrivateExtractIcons", "Str", v1, "UInt", v2, "UInt", Cx, "UInt", Cy, "UIntP", hIcon, "UInt",0, "UInt", 1, "UInt", 0x20) ; LR_LOADTRANSPARENT = 0x20 DllCall("ImageList_AddIcon", "UInt",hIL, "UInt",hIcon) ifEqual, A_Index, 1, SetEnv, I, %hIcon% else DllCall("DestroyIcon", "UInt", hIcon) } } r := I ? DllCall("DestroyIcon", "UInt", I) : DllCall("DeleteObject", "UInt", B) } else hIL := Images VarSetCapacity(BIL, 24), NumPut(hIL, BIL), NumPut(a_%Align%, BIL, 20) Loop, Parse, Margin, %A_Space% NumPut(A_LoopField, BIL, A_Index * 4) SendMessage, BCM_SETIMAGELIST,,&BIL,, ahk_id %HBtn% ifEqual, ErrorLevel, 0, return 0, DllCall("ImageList_Destroy", "Uint", hIL) return hIL } /* -- Function: Image Adds image to the Button control. Parameters: HButton - Handle to the button. Image - Path to the .BMP file or image handle. First pixel signifies transparency color. Width - Width of the image, if omitted, current control width will be used. Height - Height of the image, if omitted, current control height will be used. Returns: Bitmap handle. */ /* OUTDATED BUT COULD BE USED IN WIN2K IF NEEDED. Image(HButton, Image, Width="", Height=""){ static BM_SETIMAGE=247, IMAGE_ICON=2, BS_BITMAP=0x80, IMAGE_BITMAP=0, LR_LOADFROMFILE=16, LR_LOADTRANSPARENT=0x20 if (Width = "" || Height = "") { ControlGetPos, , ,W,H, ,ahk_id %hButton% ifEqual, Width,, SetEnv, Width, % W-8 ifEqual, Height,,SetEnv, Height, % H-8 } if Image is not integer { if (!hBitmap := DllCall("LoadImage", "UInt", 0, "Str", Image, "UInt", 0, "Int", Width, "Int", Height, "UInt", LR_LOADFROMFILE | LR_LOADTRANSPARENT, "UInt")) return 0 } else hBitmap := Image WinSet, Style, +%BS_BITMAP%, ahk_id %hButton% SendMessage, BM_SETIMAGE, IMAGE_BITMAP, hBitmap, , ahk_id %hButton% return hBitmap } */