Re: Responding to system color changes

new topic     » goto parent     » topic index » view thread      » older message » newer message

According to MSDN, the message for this is WM_SYSCOLORCHANGE. Here are some 
of the remarks...

-=-
The system sends a WM_PAINT message to any window that is affected by a 
system color change.

Applications that have brushes using the existing system colors should 
delete those brushes and recreate them using the new system colors.

Top level windows that use common controls must forward the 
WM_SYSCOLORCHANGE message to the controls; otherwise, the controls will not 
be notified of the color change. This ensures that the colors used by your 
common controls are consistent with those used by other user interface 
objects. For example, a toolbar control uses the "3D Objects" color to draw 
its buttons. If the user changes the 3D Objects color but the 
WM_SYSCOLORCHANGE message is not forwarded to the toolbar, the toolbar 
buttons will remain in their original color while the color of other buttons 
in the system changes.
-=-

  So, what would be needed is to recreate any system brushes that win32lib 
might have and SendMessage() the WM_SYSCOLORCHANGE notification to all 
common controls.

>From: Jonas  Temple <jtemple at yhti.net>
>Reply-To: EUforum at topica.com
>To: EUforum <EUforum at topica.com>
>Subject: Responding to system color changes
>Date: Fri, 14 Mar 2003 16:30:28 +0000
>
>
>I know this is trivial, but if a user changes the system color scheme
>within Windows while your win32lib based program is running, the
>background colors for all your controls are the same as when the program
>started.  Not a big deal, but it would be nice if win32lib based
>programs responded to these color changes like other Windows programs.
>
>To that end, I submit the following routine that I use.  The beauty is
>you don't have to code all the controls to be changed, the routine will
>change all child windows/controls based on the passed parent.  So if you
>have a main window with several child windows and they have controls and
>child windows and so on, this routine will work.
>
>
>procedure setChildColor(integer parent, atom color)
>	sequence children
>
>	children = findChildren(parent)
>	for i = 1 to length(children) do
>		if children[i][2] = Window then
>			setWindowBackColor(children[i][1], color)
>		end if
>		if
>find(children[i][2],{PushButton,DefPushButton,LText,Radio,CheckBox})
>then
>			setWindowBackColor(children[i][1], color)
>		elsif children[i][2]=Group then
>			setWindowBackColor(children[i][1],color)
>			setChildColor(children[i][1],color)
>		else
>			setChildColor(children[i][1], color)
>		end if
>	end for
>
>end procedure
>
>In context, here's how I use it:
>
>atom cur_color
>
>procedure Main_onPaint (integer self, integer event, sequence
>params)--params is ( int x1, int y1, int x2, int y2 )
>	object color
>         color = getSysColor(COLOR_BTNFACE)
>	if color != cur_color then
>		cur_color = color
>		setWindowBackColor(Main, color)
>		setChildColor(Main, color)
>	end if
>end procedure
>setHandler( Main, w32HPaint, routine_id("Main_onPaint"))
>
>
>
>TOPICA - Start your own email discussion group. FREE!

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu