[Windows] Change text colour in ButtonGadgets (for XP-skin)
Posted: Mon Jun 07, 2010 1:58 pm
Using an image with a depth of 32-bit and a transparent background (thanks to PB 4.40 and PB 4.50 respectively
) this example shows how to set custom text colours in ButtonGadgets. It will only work properly with XP-skin enabled.
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
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