
Tested on Windows Vista. A similar method with a ButtonImageGadget() can probably be used for MacOSX and Linux, but I have not tried this.
One question, however

Can I rely on #WM_SETTEXT as a notification message for text changing?
Please let me know if anything can be improved

Code: Select all
EnableExplicit
Structure ColoredButtonGadgetStructure
GadgetNumber.i
EnabledImage.i
DisabledImage.i
TextColor.i
OldProc.i
EndStructure
Global NewMap ColoredButtonGadgetMap.ColoredButtonGadgetStructure()
Procedure ColoredButtonGadgetEnabledImage(GadgetNumber)
Protected EnabledImage
If Not FindMapElement(ColoredButtonGadgetMap(), Str(GadgetID(GadgetNumber))) : ProcedureReturn 0 : EndIf
If IsImage(ColoredButtonGadgetMap()\EnabledImage) : FreeImage(ColoredButtonGadgetMap()\EnabledImage) : EndIf
ColoredButtonGadgetMap()\EnabledImage = 0
EnabledImage = CreateImage(#PB_Any, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), 32 | #PB_Image_Transparent)
If StartDrawing(ImageOutput(EnabledImage))
DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
DrawingFont(GetGadgetFont(GadgetNumber))
DrawText((GadgetWidth(GadgetNumber) - TextWidth(GetGadgetText(GadgetNumber))) / 2, (GadgetHeight(GadgetNumber) - TextHeight(GetGadgetText(GadgetNumber))) / 2, GetGadgetText(GadgetNumber), ColoredButtonGadgetMap()\TextColor + 4278190080)
StopDrawing()
ColoredButtonGadgetMap()\EnabledImage = EnabledImage
EndIf
EndProcedure
Procedure ColoredButtonGadgetDisabledImage(GadgetNumber)
Protected DisabledImage
If Not FindMapElement(ColoredButtonGadgetMap(), Str(GadgetID(GadgetNumber))) : ProcedureReturn 0 : EndIf
If IsImage(ColoredButtonGadgetMap()\DisabledImage) : FreeImage(ColoredButtonGadgetMap()\DisabledImage) : EndIf
ColoredButtonGadgetMap()\DisabledImage = 0
DisabledImage = CreateImage(#PB_Any, GadgetWidth(GadgetNumber), GadgetHeight(GadgetNumber), 32 | #PB_Image_Transparent)
If StartDrawing(ImageOutput(DisabledImage))
DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
DrawingFont(GetGadgetFont(GadgetNumber))
DrawText((GadgetWidth(GadgetNumber) - TextWidth(GetGadgetText(GadgetNumber))) / 2, (GadgetHeight(GadgetNumber) - TextHeight(GetGadgetText(GadgetNumber))) / 2, GetGadgetText(GadgetNumber), 4278190080)
StopDrawing()
ColoredButtonGadgetMap()\DisabledImage = DisabledImage
EndIf
EndProcedure
Procedure ColoredButtonGadgetProc(Handle, Message, wParam, lParam)
Protected Result
If Not FindMapElement(ColoredButtonGadgetMap(), Str(Handle)) : ProcedureReturn 0 : EndIf
Select Message
Case #WM_DESTROY
Result = CallWindowProc_(ColoredButtonGadgetMap()\OldProc, Handle, Message, wParam, lParam)
If IsImage(ColoredButtonGadgetMap()\DisabledImage) : FreeImage(ColoredButtonGadgetMap()\DisabledImage) : EndIf
If IsImage(ColoredButtonGadgetMap()\EnabledImage) : FreeImage(ColoredButtonGadgetMap()\EnabledImage) : EndIf
DeleteMapElement(ColoredButtonGadgetMap(), Str(GadgetID(ColoredButtonGadgetMap()\GadgetNumber)))
Case #WM_ENABLE
If wParam
SendMessage_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber), #BM_SETIMAGE, #IMAGE_BITMAP, ImageID(ColoredButtonGadgetMap()\EnabledImage))
Else
SendMessage_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber), #BM_SETIMAGE, #IMAGE_BITMAP, ImageID(ColoredButtonGadgetMap()\DisabledImage))
EndIf
Result = CallWindowProc_(ColoredButtonGadgetMap()\OldProc, Handle, Message, wParam, lParam)
Case #WM_SETTEXT
Result = CallWindowProc_(ColoredButtonGadgetMap()\OldProc, Handle, Message, wParam, lParam)
ColoredButtonGadgetEnabledImage(ColoredButtonGadgetMap()\GadgetNumber)
ColoredButtonGadgetDisabledImage(ColoredButtonGadgetMap()\GadgetNumber)
If IsWindowEnabled_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber))
SendMessage_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber), #BM_SETIMAGE, #IMAGE_BITMAP, ImageID(ColoredButtonGadgetMap()\EnabledImage))
Else
SendMessage_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber), #BM_SETIMAGE, #IMAGE_BITMAP, ImageID(ColoredButtonGadgetMap()\DisabledImage))
EndIf
Default
Result = CallWindowProc_(ColoredButtonGadgetMap()\OldProc, Handle, Message, wParam, lParam)
EndSelect
ProcedureReturn Result
EndProcedure
Procedure ColoredButtonGadget(GadgetNumber, x, y, Width, Height, Text$, Flags = 0, FrontColor = 0)
Protected Result = ButtonGadget(GadgetNumber, x, y, Width, Height, Text$, Flags | #BS_BITMAP)
Protected DisabledImage = CreateImage(#PB_Any, Width, Height, 32 | #PB_Image_Transparent)
Protected Gadget = GadgetNumber
If GadgetNumber = #PB_Any : Gadget = Result : EndIf
AddMapElement(ColoredButtonGadgetMap(), Str(GadgetID(Gadget)))
ColoredButtonGadgetMap()\GadgetNumber = Gadget
ColoredButtonGadgetMap()\TextColor = FrontColor
ColoredButtonGadgetEnabledImage(Gadget)
ColoredButtonGadgetDisabledImage(Gadget)
ColoredButtonGadgetMap()\OldProc = SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC, @ColoredButtonGadgetProc())
SendMessage_(GadgetID(Gadget), #BM_SETIMAGE, #IMAGE_BITMAP, ImageID(ColoredButtonGadgetMap()\EnabledImage))
ProcedureReturn Result
EndProcedure
Procedure SetColoredButtonGadgetColor(GadgetNumber, FrontColor)
If Not FindMapElement(ColoredButtonGadgetMap(), Str(GadgetID(GadgetNumber))) : ProcedureReturn 0 : EndIf
ColoredButtonGadgetMap()\TextColor = FrontColor
ColoredButtonGadgetEnabledImage(GadgetNumber)
If IsWindowEnabled_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber))
SendMessage_(GadgetID(ColoredButtonGadgetMap()\GadgetNumber), #BM_SETIMAGE, #IMAGE_BITMAP, ImageID(ColoredButtonGadgetMap()\EnabledImage))
EndIf
EndProcedure
; Example.
Define Event, Clicked
OpenWindow(0, 100, 100, 300, 300, "")
ButtonGadget(0, 5, 5, 290, 25, "Enable all")
ButtonGadget(1, 5, 35, 290, 25, "Disable all")
ColoredButtonGadget(2, 5, 75, 290, 25, "Blue text color", 0, #Blue)
ColoredButtonGadget(3, 5, 105, 290, 25, "Green text color", 0, #Green)
ColoredButtonGadget(4, 5, 135, 290, 25, "Red text color", 0, #Red)
ColoredButtonGadget(5, 5, 165, 290, 25, "Yellow text color", 0, #Yellow)
ColoredButtonGadget(6, 5, 205, 290, 25, "Random color - click count: 0", 0, Random(16777215))
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case 0
DisableGadget(2, 0)
DisableGadget(3, 0)
DisableGadget(4, 0)
DisableGadget(5, 0)
DisableGadget(6, 0)
Case 1
DisableGadget(2, 1)
DisableGadget(3, 1)
DisableGadget(4, 1)
DisableGadget(5, 1)
DisableGadget(6, 1)
Case 2
DisableGadget(2, 1)
Case 3
DisableGadget(3, 1)
Case 4
DisableGadget(4, 1)
Case 5
DisableGadget(5, 1)
Case 6
Clicked + 1
SetColoredButtonGadgetColor(6, Random(16777215))
SetGadgetText(6, "Random color - click count: " + Str(Clicked))
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
End