MaxGUI - Changing Gadget Color and Alpha?

BlitzMax Forums/BlitzMax Programming/MaxGUI - Changing Gadget Color and Alpha?

WendellM(Posted 2005) [#1]
Using the 1.12 BlitzMax demo (trying the GUI before buying as Mark suggested), I can't seem to get SetGadgetColor, SetGadgetTextColor, or SetGadgetAlpha to do anything (with one exception under OS X). I know that in Windows the default is to use the system's style/color scheme, but is there no way to override that with these commands (like in Visual Basic, where system colors can be replaced with custom ones)?

The example below (assembled from those in the Help) doesn't change any gadget's color or alpha under Windows XP Pro SP 2. In Mac OS X 10.3.9, only the ListBox colors change, to blue text on a red background (which is what they should be).

IMHO, the alpha stuff isn't that important, but it'd be very useful to be able to change colors. Am I overlooking something, or is something wrong?

Strict 

Local window:TGadget
Local button:TGadget[5]

window=CreateWindow("MaxGui Buttons",40,40,180,500,0,WINDOW_TITLEBAR)

button[0]=CreateButton("Push Button",10,10,140,24,window,BUTTON_PUSH)
button[1]=CreateButton("Checkbox Button",10,34,140,24,window,BUTTON_CHECKBOX)
button[2]=CreateButton("Radio Button",10,58,140,24,window,BUTTON_RADIO)
button[3]=CreateButton("OK",10,82,70,24,window,BUTTON_OK)
button[4]=CreateButton("Cancel",84,82,70,24,window,BUTTON_CANCEL)

For Local i = 0 To 4
	SetGadgetColor button[i],255,0,0,True 
	SetGadgetColor button[i],0,255,0,False
	SetGadgetTextColor button[i],0,0,255
	SetGadgetAlpha button[i], 0.33
Next

Local canvas:TGadget=CreateCanvas(10,120,133,100,window)

SetGadgetColor canvas,255,0,0,True 
SetGadgetColor canvas,0,255,0,False
SetGadgetTextColor canvas,0,0,255
SetGadgetAlpha canvas, 0.33

Local combobox:TGadget=CreateComboBox(10,240,120,22,window)
AddGadgetItem combobox,"Short"
AddGadgetItem combobox,"Medium"
AddGadgetItem combobox,"Fat",True
AddGadgetItem combobox,"Humungous"

SetGadgetColor combobox,255,0,0,True 
SetGadgetColor combobox,0,255,0,False
SetGadgetTextColor combobox,0,0,255
SetGadgetAlpha combobox, 0.33

Local label:TGadget=CreateLabel("A plain label",10,270,280,52,window)

SetGadgetColor label,255,0,0,True 
SetGadgetColor label,0,255,0,False
SetGadgetTextColor label,0,0,255
SetGadgetAlpha label, 0.33

Const ETIP$="Greate for lovers of rain, mushy peas and stomping beats.~r~nNew line..."

Local listbox:TGadget=CreateListBox(4,300,100,50,window)

AddGadgetItem listbox,"German"
AddGadgetItem listbox,"England",False,-1,ETIP
AddGadgetItem listbox,"French",False,-1,"tip - goes here","mystringobject"

SetGadgetColor listbox,255,0,0,True 
SetGadgetColor listbox,0,255,0,False
SetGadgetTextColor listbox,0,0,255
SetGadgetAlpha listbox, 0.33


Local slider:TGadget[3]

' standard vertical and horizontal scroll bars

slider[0]=CreateSlider(10,360,16,100,window,SLIDER_VERTICAL)
slider[1]=CreateSlider(30,360,100,16,window,SLIDER_HORIZONTAL)

' a horizontal trackbar

slider[2]=CreateSlider(30,380,100,24,window,SLIDER_HORIZONTAL|SLIDER_TRACKBAR)

For Local i = 0 To 2
	SetGadgetColor slider[i],255,0,0,True 
	SetGadgetColor slider[i],0,255,0,False
	SetGadgetTextColor slider[i],0,0,255
	SetGadgetAlpha slider[i], 0.33
Next


' a row of vertical trackbars

Local trackbar:TGadget[5]

For Local i=0 To 4
	trackbar[i]=CreateSlider(30+i*20,400,16,60,window,SLIDER_VERTICAL|SLIDER_TRACKBAR)
	SetGadgetColor trackbar[i],255,0,0,True 
	SetGadgetColor trackbar[i],0,255,0,False
	SetGadgetTextColor trackbar[i],0,0,255
	SetGadgetAlpha trackbar[i], 0.33
Next

' a single stepper

Local stepper:TGadget
stepper=CreateSlider(10,570,24,24,window,SLIDER_STEPPER)
SetGadgetColor stepper,255,0,0,True 
SetGadgetColor stepper,0,255,0,False
SetGadgetTextColor stepper,0,0,255
SetGadgetAlpha stepper, 0.33


SetSliderValue stepper,4
Print SliderValue(stepper)




' create an update timer

CreateTimer 60

While WaitEvent()
	Select EventID()
		Case EVENT_TIMERTICK
			RedrawGadget canvas

		Case EVENT_GADGETPAINT
			Local g=CanvasGraphics(canvas)
			SetGraphics g
			SetOrigin 67,50
			SetLineWidth 5
			Cls
			Local t=MilliSecs()
			DrawLine 0,0,120*Cos(t),60*Sin(t)
			DrawLine 0,0,80*Cos(t/60),40*Sin(t/60)
			Flip

		Case EVENT_WINDOWCLOSE
			FreeGadget canvas
			End

		Case EVENT_APPTERMINATE
			End
	End Select
Wend


While True
	WaitEvent 
	Select EventID()

		Case EVENT_WINDOWCLOSE
			End

		Case EVENT_TIMERTICK
			RedrawGadget canvas

		Case EVENT_GADGETPAINT
			Local g=CanvasGraphics(canvas)
			SetGraphics g
			SetOrigin 160,120
			SetLineWidth 5
			Cls
			Local t=MilliSecs()
			DrawLine 0,0,120*Cos(t),120*Sin(t)
			DrawLine 0,0,80*Cos(t/60),80*Sin(t/60)
			Flip
		
		Case EVENT_GADGETACTION
			Print "EVENT_GADGETACTION"

	End Select
Wend



Perturbatio(Posted 2005) [#2]
I can change the textarea colours no problem, the main window doesn't seem to get affected by SetGadgetColor and if you try it on a menu, it causes an unhandled exception.
Strict

'CONSTS
Const MENU_NEW=101
Const MENU_OPEN=102
Const MENU_SAVE=103
Const MENU_CLOSE=104
Const MENU_EXIT=105

Const MENU_CUT=106
Const MENU_COPY=107
Const MENU_PASTE=108

Const MENU_ABOUT=109

'SETUP
Global mainWindow:TGadget = CreateWindow("Edit Pad",30,20,500,400,Null, WINDOW_TITLEBAR|WINDOW_RESIZABLE|WINDOW_MENU|WINDOW_STATUS|WINDOW_ACCEPTFILES)
Global filemenu:TGadget=CreateMenu("&File",0,WindowMenu(mainWindow))

	CreateMenu"&New",MENU_NEW,filemenu,KEY_N,MODIFIER_COMMAND
	CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
	CreateMenu"&Close",MENU_CLOSE,filemenu,KEY_W,MODIFIER_COMMAND
	CreateMenu"",0,filemenu
	CreateMenu"&Save",MENU_SAVE,filemenu,KEY_S,MODIFIER_COMMAND
	CreateMenu"",0,filemenu
	CreateMenu"E&xit",MENU_EXIT,filemenu,KEY_F4,MODIFIER_COMMAND

Global editmenu:TGadget=CreateMenu("&Edit",0,WindowMenu(mainWindow))
	CreateMenu "Cu&t",MENU_CUT,editmenu,KEY_X,MODIFIER_COMMAND
	CreateMenu "&Copy",MENU_COPY,editmenu,KEY_C,MODIFIER_COMMAND
	CreateMenu "&Paste",MENU_PASTE,editmenu,KEY_V,MODIFIER_COMMAND

Global helpmenu:TGadget=CreateMenu("&Help",0,WindowMenu(mainWindow))
	CreateMenu "&About",MENU_ABOUT,helpmenu

Global font_Courier:TGUIFont = LoadGuiFont("Courier New", 12)

Global textArea : TGadget = CreateTextArea(0, 0, ClientWidth(mainWindow),ClientHeight(mainWindow), mainWindow)
	SetGadgetFont(textArea, font_Courier)
	SetGadgetColor(textArea,155,0,0)
	SetGadgetColor(textArea,255,255,255,False)


'setting menu colour causes an exception
'SetGadgetColor(fileMenu, 155,0,0)
'SetGadgetColor(fileMenu, 255,255,255, False)

UpdateWindowMenu mainWindow





'MAIN
MainLoop()


Function MainLoop()

While True
	WaitEvent 
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
		Case EVENT_MENUACTION
			Select EventData()
				Case MENU_EXIT
					If Proceed("Are you sure you want to quit?") = 1 Then End
				Case MENU_SAVE
					SaveFile()
				Case MENU_ABOUT
					Notify "Simple notepad type thing in BMax~n (C) me"
			End Select
			
		Case EVENT_APPTERMINATE
			If Proceed("Are you sure you want to quit?")=1 Then End
			
		Case EVENT_GADGETACTION
			?debug
				'Print "EVENT_GADGETACTION"
			?
Rem
			Select EventSource()

					
			End Select
EndRem

		Case EVENT_WINDOWSIZE
			HandleResize()
			
		Case EVENT_WINDOWACCEPT
		
	End Select

Wend

End Function


Function HandleResize()
	SetGadgetShape(textarea, 0,0, ClientWidth(mainWindow),ClientHeight(mainWindow))
Rem
	textarea.Width = ClientWidth(mainWindow)
	textarea.Height = ClientHeight(mainWindow)
EndRem
End Function


Function SaveFile()
	Local FileName:String
	FileName = RequestFile("Save File...", "Text File:txt", True)
End Function



Sarge(Posted 2005) [#3]
Perturbatio, why dont you use SetGadgetLayout( textArea, 1, 1, 1, 1 ) instead of the HandleResize() function ?


Perturbatio(Posted 2005) [#4]
Because I had no idea about it whatsoever, I just jumped in and decided to create a Notepad clone to see how easy the GUI was (I did this with the demo actually).

But thanks for that, I was wondering how it was done :)


WendellM(Posted 2005) [#5]
I can change the textarea colours no problem

Yes. And FormatTextAreaText allows even more control if needed, so that ranges of text can be made different colors (like in the IDE), bold, and/or italic. Should be great for text displays/chat boxes/etc.

the main window doesn't seem to get affected by SetGadgetColor and if you try it on a menu, it causes an unhandled exception.

I haven't tried it on the window itself or on menus - thanks.

But it would be handy to be able to override the default color scheme for gadgets (panels can substitute for pushbuttons, but other gadgets aren't as easily replaced). Skidracer's 07-01 worklog made it look like color control would be simple enough:

The gadgestyle object is the current label, backgroundcolor, forgroundcolor, font combo but instead of a bunch of fixed size gadgets being created i'm now using the friendlier button view extensions:

Type TGadgetStyle Extends TGroupView
	Field	label:TLabel
	Field	fg:TColorButton
	Field	bg:TColorButton
	Field	font:TFontButton

	Method Apply(gadget:TGadget)	
		SetGadgetFont gadget,font.font
		SetGadgetColor gadget,bg.red,bg.green,bg.blue,True
		SetGadgetColor gadget,fg.red,fg.green,fg.blue,False
	End Method


Since the ListBox does it on MaxOS, maybe it is possible, but I'm just not seeing how to do it? Or, since it only works with ListBox and only on MacOS, maybe something is weird somewhere?

-----

Nov. 21, 2005 update: workaround using more-configurable panels as button replacements is now at http://blitzbasic.com/codearcs/codearcs.php?code=1539


tonyg(Posted 2006) [#6]
Bump, 4 months old but can't use setgadgetcolor and setgadgetalpha don't seem to do anything.