From 0e0f62f2fad14144396599bde4537dcb43a30ee2 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 24 Feb 2005 19:42:08 +0000 Subject: [PATCH] Repaint the non-client area to work around broken WM_PAINT handlers also when doing a synchronous update with RDW_UPDATENOW. --- dlls/user/painting.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dlls/user/painting.c b/dlls/user/painting.c index 17bb6ec624a..ff9b309f062 100644 --- a/dlls/user/painting.c +++ b/dlls/user/painting.c @@ -326,7 +326,7 @@ static void erase_now( HWND hwnd, UINT rdw_flags ) */ static void update_now( HWND hwnd, UINT rdw_flags ) { - HWND child; + HWND prev = 0, child; /* desktop window never gets WM_PAINT, only WM_ERASEBKGND */ if (hwnd == GetDesktopWindow()) erase_now( hwnd, rdw_flags | RDW_NOCHILDREN ); @@ -342,8 +342,24 @@ static void update_now( HWND hwnd, UINT rdw_flags ) if (!get_update_flags( hwnd, &child, &flags )) break; if (!flags) break; /* nothing more to do */ - SendMessageW( child, WM_PAINT, 0, 0 ); + if (child == prev) /* same window again, didn't get repainted properly */ + { + UINT erase_flags = UPDATE_NONCLIENT | UPDATE_ERASE | UPDATE_NOCHILDREN; + HRGN hrgn; + RECT rect; + TRACE( "%p not repainted properly, erasing\n", child ); + if ((hrgn = send_ncpaint( child, NULL, &erase_flags ))) + { + send_erase( child, erase_flags, hrgn, &rect, NULL ); + DeleteObject( hrgn ); + } + } + else + { + prev = child; + SendMessageW( child, WM_PAINT, 0, 0 ); + } if (rdw_flags & RDW_NOCHILDREN) break; } }