Posted: Sat Mar 18, 2006 7:01 am
Thanks netmaestro
There's almost always more than one way to accomplish any task. 


http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
Procedure x_icon_createicon(width,height,image_h,mask_h) ; create icon from two bitmaps
Protected icon.ICONINFO
;
; *** turn any two images into an icon
;
; note: you have to delete this icon manually when exiting the program!
;
; how do icons behave?
;
; to replace a pixel: pixel in mask should be black, pixel in image should be whatever
; for no changes to a pixel: pixel in mask should be white, pixel in image should be black
;
icon.ICONINFO
icon\ficon = #True
icon\hbmmask = mask_h
icon\hbmcolor = image_h
ProcedureReturn CreateIconIndirect_(@icon)
;
EndProcedure
Procedure x_icon_charactericon(width.l,height.l,text.s,r.l,g.l,b.l) ; create an icon from a single character
;
; *** create an icon using one or two characters as template
;
; note: you have to delete this icon manually when exiting the program!
;
; step 1: draw the image
;
image_nr = CreateImage(#PB_Any,width,height)
image_h = ImageID()
StartDrawing(ImageOutput())
Box(0,0,width,height,$000000) ; background should be black so xor has no effect
d = width/2-TextLength(text)/2-1
DrawingMode(1)
FrontColor(r,g,b) ; then the character in given colour
Locate(d,0)
DrawText(text)
StopDrawing()
;
; step 2: the mask
;
mask_nr = CreateImage(#PB_Any,width,height)
mask_h = ImageID()
StartDrawing(ImageOutput())
DrawingMode(1)
Box(0,0,width,height,$FFFFFF)
FrontColor(0,0,0)
Locate(d,0)
DrawText(text)
StopDrawing()
;
icon_h = x_icon_createicon(widht,height,image_h,mask_h)
FreeImage(image_nr)
FreeImage(mask_nr)
;
ProcedureReturn icon_h
EndProcedure
Procedure x_icon_freeicon(icon_h) ; free icon object
DeleteObject_(icon_h)
EndProcedure
Just running on XP and above!!!sparkie wrote:;/ OS Support : Windows 98/NT/2000/XP/Server 2003
Code: Select all
;/=============================================================
;/ Code : ButtonGadgets with BMP Icons
;/ Author : Sparkie
;/ Date : 03/16/06
;/ PB Version : PB 4.00 Beta7
;/ OS Support : Windows 98/NT/2000/XP/Server 2003
;/ Ref : /http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/winxpintro.asp
;/=============================================================
;/ ThemeCheck by sverson 06-06-30
;/===============================================
;/ Constants / Enumerations
;/===============================================
#BCM_FIRST = $1600
#BCM_SETIMAGELIST = #BCM_FIRST + 2
#BUTTON_IMAGELIST_ALIGN_LEFT = 0
#MyWindow1 = 1
#Dummy = 0
#MyButton1 = 1
#MyButton2 = 2
;/===============================================
;/ Structure used for Button ImageList
;/===============================================
Structure _BUTTON_IMAGELIST
himl.l
margin.RECT
uAlign.l
EndStructure
Global buttonImgList._BUTTON_IMAGELIST
;/===============================================
;/ Procedure - Create icon/text ButtonImageGadget
;/ (Only used when XP theme not active)
;/===============================================
Procedure ButtonIconGadget(num, gadgetX, gadgetY, gadgetW, gadgetH, text$, imageNum, icoW, icoH, maskColor)
buttonBack = GetSysColor_(#COLOR_BTNFACE)
StartDrawing(ImageOutput(imageNum))
;...Replce mask color with Button color
For x = 0 To icoW - 1
For y = 0 To icoH - 1
If Point(x, y) = maskColor
Plot(x, y, buttonBack)
EndIf
Next y
Next x
StopDrawing()
;...Create image for ButtonImageGadget
thisImg = CreateImage(#PB_Any, gadgetW, gadgetH)
StartDrawing(ImageOutput(thisImg))
;...Fill with Button Color
Box(0, 0, gadgetW, gadgetH, buttonBack)
;...Draw our Graphic image
DrawImage(ImageID(imageNum), 5, (gadgetH - icoH)/2, icoW, icoH)
DrawingFont(GetStockObject_(#DEFAULT_GUI_FONT))
;...Add our text
DrawText(icoW + 10, (gadgetH - TextHeight(text$))/2, text$, #Black, buttonBack)
StopDrawing()
;...Create ButtonImageGadget
gadId = ButtonImageGadget(num, gadgetX, gadgetY, gadgetW, gadgetH, ImageID(thisImg))
ProcedureReturn gadId
EndProcedure
;/===============================================
;/ Procedure - Create icon/text ButtonImageGadget
;/ (Only used when XP theme is active)
;/===============================================
Procedure ButtonImageList(imgW, imgH, ImageID, maskColor)
;...Add our image with mask
hButtonImgList = ImageList_Create_(imgW, imgH, #ILC_COLOR24 | #ILC_MASK, 0, 2)
ImageList_AddMasked_(hButtonImgList, ImageID, maskColor)
;...Fill our Button ImageList strcuture
With buttonImgList
\uAlign = #BUTTON_IMAGELIST_ALIGN_LEFT
\margin\top = 3
\margin\bottom = 3
\margin\left = 3
\margin\right = 3
EndWith
ProcedureReturn hButtonImgList
EndProcedure
;/===============================================
;/ Procedure - ThemeCheck
;/ (True when Themes used [XP and above])
;/===============================================
Procedure.l ThemeCheck()
Protected ThFlags.l
If OpenLibrary(0, "UxTheme.dll")
ThFlags = CallFunction(0,"GetThemeAppProperties")
CloseLibrary(0)
Else
ThFlags.l=#False
EndIf
ProcedureReturn ThFlags
EndProcedure
;/===============================================
;/ Main Window
;/===============================================
If OpenWindow(#MyWindow1, 100, 100, 250, 200, "Buttons With Icons", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow1))
If ThemeCheck()
ButtonGadget(#MyButton1, 75, 50, 100, 42, "Clock", #PB_Button_Left)
;...Get our image for Button 1
img1 = CatchImage(#PB_Any, ?ButtonIcon1)
;...Set ImageList for #MyButton1
hImgList1 = ButtonImageList(32, 32, ImageID(img1), RGB(255, 0, 255))
buttonImgList\himl = hImgList1
SendMessage_(GadgetID(#MyButton1), #BCM_SETIMAGELIST, 0, @buttonImgList)
;...Create ButtonGadget 2
ButtonGadget(#MyButton2, 75, 100, 100, 42, "Calculator", #PB_Button_Left)
;...Get our image for Button 2
img2 = CatchImage(#PB_Any, ?ButtonIcon2)
;...Set ImageList for #MyButton2
hImgList2 = ButtonImageList(32, 32, ImageID(img2), RGB(255, 0, 255))
buttonImgList\himl = hImgList2
SendMessage_(GadgetID(#MyButton2), #BCM_SETIMAGELIST, 0, @buttonImgList)
Else
;...Not running with XP skins so go to plan B
FreeGadget(#Dummy)
img1 = CatchImage(#PB_Any, ?ButtonIcon1)
img2 = CatchImage(#PB_Any, ?ButtonIcon2)
ButtonIconGadget(#MyButton1, 75, 50, 100, 42, "Clock", img1, 32, 32, RGB(255, 0, 255))
ButtonIconGadget(#MyButton2, 75, 100, 100, 42, "Calculator", img2, 32, 32, RGB(255, 0, 255))
EndIf
;/===============================================
;/ Main Event Loop
;/===============================================
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
;...Destroy image lists
If hImgList1
ImageList_Destroy_(hImgList1)
EndIf
If hImgList2
ImageList_Destroy_(hImgList2)
EndIf
EndIf
End
DataSection
ButtonIcon1:
Data.b $42,$4D,$72,$04,$00,$00,$00,$00,$00,$00,$72,$00,$00,$00,$28,$00
Data.b $00,$00,$20,$00,$00,$00,$20,$00,$00,$00,$01,$00,$08,$00,$00,$00
Data.b $00,$00,$00,$04,$00,$00,$C3,$0E,$00,$00,$C3,$0E,$00,$00,$0F,$00
Data.b $00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$00,$EF,$FF,$FF,$00,$F7,$F7
Data.b $E6,$00,$B5,$F7,$F7,$00,$AD,$B5,$9C,$00,$6B,$6B,$EF,$00,$84,$84
Data.b $73,$00,$FF,$00,$FF,$00,$42,$5A,$6B,$00,$42,$42,$31,$00,$08,$08
Data.b $9C,$00,$00,$08,$21,$00,$10,$08,$00,$00,$00,$08,$00,$00,$00,$00
Data.b $00,$00,$07,$07,$07,$06,$06,$04,$09,$09,$09,$06,$04,$03,$07,$07
Data.b $07,$07,$07,$03,$04,$04,$09,$06,$03,$06,$09,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$0E,$04,$00,$00,$00,$06,$04,$04,$09,$07
Data.b $0E,$07,$04,$04,$09,$06,$00,$00,$06,$0E,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$0E,$03,$00,$00,$04,$09,$0E,$0E,$0E
Data.b $0B,$0E,$0E,$0C,$04,$00,$00,$00,$0E,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$07,$0E,$0C,$0E,$0B,$0A,$05,$05,$0A
Data.b $0B,$0B,$0E,$0E,$0E,$0B,$0E,$0E,$09,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$09,$0B,$05,$05,$0B,$0B,$09,$06,$06
Data.b $09,$06,$06,$0B,$0E,$0E,$0B,$0B,$0E,$09,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$0E,$0A,$05,$0E,$09,$01,$01,$01,$01,$01
Data.b $0D,$01,$01,$01,$01,$01,$0B,$0E,$0A,$0B,$0E,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$0E,$0A,$0A,$0E,$01,$01,$08,$01,$01,$01,$09
Data.b $0E,$01,$01,$01,$06,$09,$01,$03,$0E,$0A,$0A,$0A,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$0E,$0E,$0A,$0A,$01,$01,$01,$0E,$0E,$01,$01,$01
Data.b $06,$01,$01,$01,$0E,$09,$01,$01,$01,$0A,$0A,$0A,$05,$07,$07,$07
Data.b $07,$07,$07,$09,$0E,$05,$0E,$01,$01,$01,$01,$01,$01,$01,$01,$01
Data.b $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$0E,$0B,$0A,$09,$07,$07
Data.b $07,$07,$07,$0E,$0E,$0B,$08,$04,$0C,$0E,$01,$01,$01,$01,$01,$01
Data.b $01,$01,$01,$01,$01,$01,$01,$09,$0E,$01,$01,$0E,$08,$0E,$07,$07
Data.b $07,$07,$04,$0E,$08,$0A,$04,$01,$06,$06,$01,$01,$01,$01,$01,$01
Data.b $01,$01,$01,$01,$01,$01,$01,$01,$09,$01,$01,$0B,$0B,$0E,$06,$07
Data.b $07,$07,$09,$0E,$05,$0B,$03,$01,$01,$01,$01,$01,$01,$01,$01,$01
Data.b $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$04,$0E,$0B,$0E,$07
Data.b $07,$07,$0C,$0E,$05,$0E,$06,$09,$03,$01,$01,$01,$01,$01,$01,$04
Data.b $0C,$01,$01,$01,$01,$01,$01,$01,$08,$0E,$01,$04,$0A,$0A,$0E,$07
Data.b $07,$07,$0E,$0E,$08,$0E,$0E,$06,$08,$01,$01,$01,$01,$01,$01,$06
Data.b $0E,$01,$01,$01,$01,$01,$01,$01,$0B,$0E,$01,$04,$0A,$0B,$0E,$07
Data.b $07,$07,$0E,$08,$05,$0E,$0E,$01,$01,$01,$01,$01,$01,$01,$01,$0B
Data.b $0E,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$0C,$0A,$0E,$0E,$07
Data.b $07,$07,$06,$0A,$05,$0E,$0E,$09,$01,$04,$01,$01,$01,$01,$01,$0A
Data.b $0B,$09,$01,$01,$01,$01,$01,$06,$04,$01,$01,$0E,$0A,$0B,$06,$07
Data.b $07,$07,$07,$0E,$05,$05,$0E,$0E,$0C,$09,$09,$01,$01,$01,$01,$0B
Data.b $0A,$04,$01,$01,$01,$01,$01,$09,$08,$01,$06,$0A,$05,$0E,$07,$07
Data.b $07,$07,$07,$0A,$0A,$05,$0A,$0B,$0E,$01,$01,$01,$01,$01,$01,$09
Data.b $09,$01,$01,$01,$01,$01,$01,$04,$01,$04,$0E,$0A,$0E,$07,$07,$07
Data.b $07,$07,$07,$07,$0A,$0A,$05,$05,$0E,$0E,$01,$03,$0C,$01,$08,$00
Data.b $08,$01,$01,$01,$09,$01,$01,$01,$01,$0E,$0A,$0E,$0E,$07,$07,$07
Data.b $07,$07,$07,$07,$04,$0E,$05,$05,$0A,$0E,$0E,$0E,$09,$01,$06,$04
Data.b $0C,$04,$01,$01,$09,$01,$01,$01,$0E,$0E,$0E,$0E,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$0E,$0A,$05,$0A,$0E,$0E,$0E,$06,$02,$04
Data.b $06,$03,$01,$01,$01,$05,$0B,$0E,$0E,$0E,$0E,$07,$07,$07,$07,$07
Data.b $07,$07,$03,$0E,$06,$0E,$0E,$0C,$0E,$05,$05,$0A,$0B,$0B,$0E,$0E
Data.b $0B,$0A,$0A,$0A,$0E,$0E,$0E,$0B,$0E,$09,$07,$07,$04,$0E,$08,$07
Data.b $07,$07,$06,$0E,$0E,$08,$06,$02,$0C,$08,$0E,$0A,$0A,$05,$05,$08
Data.b $0A,$0A,$0E,$0E,$0E,$0E,$0E,$03,$08,$02,$0E,$0E,$03,$0E,$09,$07
Data.b $07,$07,$07,$0E,$08,$03,$03,$03,$08,$06,$0E,$06,$0E,$0E,$0E,$0E
Data.b $0E,$0E,$0E,$0E,$0E,$04,$02,$04,$0B,$0E,$0E,$03,$08,$0E,$07,$07
Data.b $07,$07,$07,$07,$06,$0B,$03,$03,$08,$0E,$0E,$03,$07,$07,$07,$07
Data.b $03,$04,$00,$00,$04,$08,$03,$03,$03,$03,$08,$0E,$04,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$0E,$09,$0B,$0E,$0B,$03,$0B,$0E,$07,$07
Data.b $0E,$0E,$06,$08,$08,$03,$03,$08,$0E,$0E,$0E,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$04,$0E,$03,$06,$0B,$09,$0E,$0E,$08,$07,$07
Data.b $07,$07,$07,$07,$0E,$0E,$09,$0E,$04,$07,$0E,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$04,$07,$07,$08,$04,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$0E,$07,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$07,$07,$06,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$0E,$07,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$07,$07,$03,$0E,$03,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$0E,$09,$07,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$07,$07,$07,$03,$0E,$0B,$04,$07,$07
Data.b $07,$07,$07,$07,$09,$0E,$0E,$07,$07,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07,$07,$07,$07,$07,$07,$07,$07,$07,$07,$07,$04,$0B,$0B,$0E
Data.b $0B,$0E,$0E,$0E,$09,$07,$07,$07,$07,$07,$07,$07,$07,$07,$07,$07
Data.b $07,$07
ButtonIcon2:
Data.b $42,$4D,$76,$02,$00,$00,$00,$00,$00,$00,$76,$00,$00,$00,$28,$00
Data.b $00,$00,$20,$00,$00,$00,$20,$00,$00,$00,$01,$00,$04,$00,$00,$00
Data.b $00,$00,$00,$02,$00,$00,$C3,$0E,$00,$00,$C3,$0E,$00,$00,$10,$00
Data.b $00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$00,$F7,$FF,$FF,$00,$97,$FA
Data.b $FF,$00,$79,$FF,$FF,$00,$78,$F2,$FF,$00,$66,$E2,$FF,$00,$F4,$DC
Data.b $AB,$00,$4D,$C5,$FF,$00,$52,$A2,$E1,$00,$AC,$92,$76,$00,$3A,$74
Data.b $A0,$00,$FF,$00,$FF,$00,$46,$2C,$21,$00,$11,$1B,$29,$00,$00,$11
Data.b $2B,$00,$00,$00,$00,$00,$BB,$BB,$BB,$BB,$BB,$BB,$1C,$FF,$FB,$BB
Data.b $BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$B0,$CF,$FA,$1F,$FF,$BB
Data.b $BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$6C,$FD,$58,$CF,$FF,$DA,$FB
Data.b $BB,$BB,$BB,$BB,$BB,$BB,$BB,$B6,$FF,$D4,$AF,$FD,$84,$33,$AE,$8F
Data.b $BB,$BB,$BB,$BB,$BB,$BB,$B9,$FD,$2A,$FF,$A5,$54,$43,$34,$38,$F8
Data.b $F6,$BB,$BB,$BB,$BB,$BB,$F8,$2C,$FA,$55,$54,$44,$5D,$FF,$A3,$7F
Data.b $8F,$6B,$BB,$BB,$BB,$BB,$FE,$E7,$54,$44,$4A,$FF,$8F,$CF,$73,$47
Data.b $F8,$F6,$BB,$BB,$BB,$BB,$F7,$55,$48,$D7,$4F,$9F,$A7,$57,$DD,$44
Data.b $7F,$8F,$9B,$BB,$BB,$BB,$BF,$55,$EF,$FF,$3A,$DA,$AD,$5F,$CF,$44
Data.b $47,$F8,$F9,$BB,$BB,$BB,$B9,$E5,$8F,$F8,$42,$7F,$CF,$7A,$87,$DD
Data.b $44,$8F,$7F,$CB,$BB,$BB,$BB,$FA,$54,$7F,$FA,$3F,$D7,$53,$5F,$CF
Data.b $34,$4A,$F7,$FC,$BB,$BB,$BB,$BF,$75,$AF,$CF,$22,$8F,$F7,$38,$8A
Data.b $F8,$44,$DD,$7F,$FB,$BB,$BB,$B9,$E7,$58,$8F,$F5,$FF,$E5,$7E,$F9
Data.b $CF,$A4,$4F,$A7,$FF,$BB,$BB,$BB,$F8,$54,$FC,$FA,$37,$DF,$C9,$69
Data.b $FF,$84,$45,$F7,$7F,$CB,$BB,$BB,$BF,$75,$7A,$5A,$FC,$96,$9C,$EA
Data.b $53,$37,$44,$8F,$77,$F6,$BB,$BB,$B6,$F7,$54,$FC,$9C,$FE,$A5,$35
Data.b $AF,$FF,$E3,$3D,$A7,$E9,$BB,$BB,$BB,$CA,$75,$8F,$E8,$33,$3A,$FF
Data.b $FC,$20,$FF,$33,$F8,$A9,$BB,$BB,$BB,$BF,$A7,$54,$33,$8E,$FF,$C2
Data.b $11,$AF,$FF,$D2,$4F,$A9,$BB,$BB,$BB,$BB,$F8,$55,$8F,$FC,$21,$2A
Data.b $FF,$F9,$FF,$F8,$37,$F9,$BB,$BB,$BB,$BB,$0F,$75,$AF,$92,$DF,$FF
Data.b $90,$00,$FF,$FD,$33,$F9,$BB,$BB,$BB,$BB,$B6,$F7,$4E,$FF,$F0,$00
Data.b $00,$00,$FF,$A5,$AF,$F0,$BB,$BB,$BB,$BB,$BB,$9F,$73,$FF,$C0,$00
Data.b $00,$00,$DF,$FF,$FF,$00,$BB,$BB,$BB,$BB,$BB,$B9,$F7,$5F,$C0,$00
Data.b $00,$00,$9F,$60,$0C,$F0,$BB,$BB,$BB,$BB,$BB,$BB,$9F,$78,$F0,$00
Data.b $00,$00,$0F,$00,$00,$F6,$BB,$BB,$BB,$BB,$BB,$BB,$B6,$FF,$F0,$00
Data.b $00,$00,$0F,$60,$00,$9D,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$F1,$00
Data.b $00,$00,$09,$F1,$00,$0F,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$DD,$00
Data.b $00,$00,$00,$FF,$10,$0F,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BF,$00
Data.b $00,$00,$00,$0F,$F6,$0F,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$B9,$F0
Data.b $00,$00,$00,$00,$9F,$FF,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$DF
Data.b $00,$00,$00,$00,$01,$FB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BC
Data.b $F0,$00,$00,$00,$DF,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB,$BB
Data.b $BF,$FF,$FF,$FC,$BB,$BB
EndDataSection