[ros-dev] Problem drawing the desktop in the updated color

Timo Kreuzer timo.kreuzer at web.de
Wed Aug 9 01:29:03 CEST 2006


Hi,

First, this is going to be a long post, sorry ;-)
You might have noticed, that I have been working on the desk.cpl 
appearance tab, wich is working partly.
Here's the first version: 
http://www.reactos.org/bugzilla/show_bug.cgi?id=1732

Some things still don't work. For example the desktop doesn't get 
repainted in the new color.

> ------- /Comment #5 
> <http://www.reactos.org/bugzilla/show_bug.cgi?id=1732#c5> >From 
> jimtabor 2006-08-05 04:46:36 CET / [reply 
> <http://www.reactos.org/bugzilla/show_bug.cgi?id=1732#add_comment>] 
> -------
> Hi,
> You can use WM_SYSCOLORCHANGE in the desktop proc if it is used, should be!,
> user32/misc/desktop.c;
>
> static
> LRESULT
> WINAPI
> DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
> {
>     DPRINT1("Desktop Class Atom!\n");
>     switch(message)
>    {
>     case WM_NCCREATE:
>          return TRUE;
>
>     case WM_CREATE:
>     /* when I spy I see notify */
>          SendNotifyMessageW( hwnd, WM_SYSCOLORCHANGE , 0, 0 );
>     break;
>
>     case WM_SYSCOLORCHANGE:
>     /* update everything, well in theory anyway */
>          RedrawWindow( hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE |
> RDW_ALLCHILDREN );
>     break;
>
>     default:
>          return DefWindowProcW(hwnd,message,wParam,lParam);
>     }
>     return 0;  /* all other messages are ignored */
> }
>
> Its crude, I'm not sure if it will compile, its off the top of my head ATM.
> 8^D
> Thanks,
> James
>   
Thanks for helping, James. I tried it, but it doesn't work.
1.) Sending WM_SYSCOLORCHANGE on WM_CREATE will probably do nothing, 
because the desktop has just been created with the initial SysColors, no 
need to update them.
2.) RedrawWindow calls NtUserRedrawWindow wich calls co_UserRedrawWindow 
wich calls co_IntPaintWindows wich sends a WM_PAINT message to the 
desktop window.
WM_PAINT is then passed to DefWindowProc and passed on to 
User32DefWindowProc wich does only repaint the icon as it seems.
So WM_PAINT must be evaluated in DesktopWndProc.

I tried the following:
>       case WM_PAINT:
>       {
>          PAINTSTRUCT ps;
>          HDC hdc = BeginPaint(hwnd, &ps);
>          PaintDesktop(hdc);
>          EndPaint(hwnd, &ps);
>       }
PaintDesktop calls NtUserPaintDesktop, wich then paints the desktop.
I have also replaced
  DesktopBrush = (HBRUSH)UserGetClassLongPtr(WndDesktop->Class, 
GCL_HBRBACKGROUND, FALSE);
with
  DesktopBrush = IntGetSysColorBrush(COLOR_BACKGROUND);

But the desktop is still painted in the original color, whereas the icon 
text is in the color I have set in the registry.

I played a little around with the code in NtUserPaintDesktop. I added 
the following code before the desktop background is painted:
> if (IntGetSysColor(COLOR_BACKGROUND) == 0) // This is true after 
> SysColors are loaded from Registry
> {
>   DesktopBrush = IntGetSysColorBrush(COLOR_ACTIVECAPTION);
> }
And suddenly the desktop is painted in COLOR_ACTIVECAPTION.
This is strange, because I also added CreateSysColorObjects(); at the 
beginning of NtUserPaintDesktop.

Anybody any idea?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-dev/attachments/20060809/4fabb076/attachment-0001.html 


More information about the Ros-dev mailing list