The same method (split icon, manipulate color, recombine images) could be used to create greyscale icons for example.
Code: Select all
;//////////////////////////////////////////////////////////////////////////
;//
;// Author: Inf0Byt3
;//
;// Description:
;// ICO_Resize takes an existing hIcon and returns a new, resized 24 or 32
;// bit hIcon (Not a PB image object!)
;//
;// Parameters:
;// hIcon: Icon handle, returned by ExtractIcon_, LoadIcon_, etc.
;// Width: Height = Width and Height of the new icon
;// Depth: The depth of the new icon (can be either 24 or 32)
;//
;// OS: Tested on XP, 32 bit
;// Compiler: PureBasic 5.00 +
;// License: free, unrestricted, no warranty
;// Last update: 18 Jan 2013
;//
;//////////////////////////////////////////////////////////////////////////
Procedure.i ResizeIcon(hIcon.i, Width.l, Height.l, Depth.l=32)
Protected IInfo.ICONINFO, ColorImg.i, MaskImg.i, DC.i, RethIcon.i, ICONINFO.ICONINFO
If hIcon <> 0
;Get icon data
If GetIconInfo_(hIcon, @IInfo)
Select Depth
Case 24
ColorImg = CreateImage(#PB_Any, Width, Height, 24)
Default
ColorImg = CreateImage(#PB_Any, Width, Height, 32)
EndSelect
If IsImage(ColorImg) <> 0
;Draw color image
DC = StartDrawing(ImageOutput(ColorImg))
If DC <> 0
DrawIconEx_(DC,0,0,hIcon,Width,Height,0,0,#DI_IMAGE)
StopDrawing()
EndIf
EndIf
MaskImg = CreateImage(#PB_Any, Width, Height) ;Depth is 24 by default
If IsImage(MaskImg) <> 0
;Draw mask
DC = StartDrawing(ImageOutput(MaskImg))
If DC <> 0
DrawIconEx_(DC,0,0,hIcon,Width,Height,0,0,#DI_MASK)
StopDrawing()
EndIf
EndIf
;Create new icon
ICONINFO\fIcon = 1
ICONINFO\hbmMask = ImageID(MaskImg)
ICONINFO\hbmColor = ImageID(ColorImg)
RethIcon = CreateIconIndirect_(@ICONINFO)
;And free the resources
If IsImage(ColorImg)
FreeImage(ColorImg)
EndIf
If IsImage(MaskImg)
FreeImage(MaskImg)
EndIf
DeleteObject_(IInfo\hbmColor)
DeleteObject_(IInfo\hbmMask)
EndIf
EndIf
ProcedureReturn RethIcon
EndProcedure
;A quick example:
If OpenWindow(0, 100, 200, 280, 280, "Resize icon", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Original_hIcon = LoadIcon_(0, #IDI_INFORMATION)
Resized_hIcon1 = ResizeIcon(Original_hIcon, 64, 64, 32)
Resized_hIcon2 = ResizeIcon(Original_hIcon, 128, 128, 32)
ImageGadget(0, 30, 30, 32, 32, Original_hIcon)
ImageGadget(2, 60, 60, 64, 64, Resized_hIcon1)
ImageGadget(1, 120, 120, 128, 128, Resized_hIcon2)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow ; If the user has pressed on the close button
Quit = 1
EndIf
Until Quit = 1
DestroyIcon_(Original_hIcon)
DestroyIcon_(Resized_hIcon1)
DestroyIcon_(Resized_hIcon2)
EndIf