Hi, Timo Kreuzer wrote:
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.
Not surprised at all. We dont use the desktop class when the explorer desktop is opened.
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.
To init the system colors before the desktop is displayed.
OT Q. Is our explorer desktop a plug in replacement to the windows one? One way to find out,,, look for explorer desktop replacement projects and read their source.
2.) RedrawWindow calls NtUserRedrawWindow wich calls co_UserRedrawWindow wich calls co_IntPaintWindows wich sends a WM_PAINT message to the desktop window.
Redraw should refresh all of its children including its self and not push the responsibility off to another app.
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.
No its not.
I tried the following:
case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); PaintDesktop(hdc); EndPaint(hwnd, &ps); }
this could be done in explorer desktop?
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?
No, sorry, not at this moment.
For the Devs, Yes, we plug in explorer by creating the desktop using the desktop class, So the class proc will get called. Was there a patch?
8^) Okay, James