Progress Bar: Fix Class Style & Repainting

Robert Shearman rob at codeweavers.com
Tue Sep 21 13:07:07 CDT 2004


Changelog:
- Fix class style to include the hbrBackground member.
- Fix repainting issues introduced by this change.
- Add WM_ERASEBKGND handler and remove background drawing code from the 
WM_PAINT handler.
-------------- next part --------------
Index: wine/dlls/comctl32/progress.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/progress.c,v
retrieving revision 1.38
diff -u -p -r1.38 progress.c
--- wine/dlls/comctl32/progress.c	25 Aug 2004 17:33:01 -0000	1.38
+++ wine/dlls/comctl32/progress.c	21 Sep 2004 18:01:33 -0000
@@ -71,7 +71,7 @@ static void PROGRESS_Invalidate( PROGRES
 {
     LONG style = GetWindowLongW (infoPtr->Self, GWL_STYLE);
     RECT rect;
-    int oldPos, newPos, ledWidth;
+    int oldPos, newPos;
 
     GetClientRect (infoPtr->Self, &rect);
     InflateRect(&rect, -1, -1);
@@ -82,11 +82,6 @@ static void PROGRESS_Invalidate( PROGRES
                                        infoPtr->MaxVal - infoPtr->MinVal);
         newPos = rect.bottom - MulDiv (new - infoPtr->MinVal, rect.bottom - rect.top,
                                        infoPtr->MaxVal - infoPtr->MinVal);
-        ledWidth = MulDiv (rect.right - rect.left, 2, 3);
-        rect.top = min( oldPos, newPos );
-        rect.bottom = max( oldPos, newPos );
-        if (!(style & PBS_SMOOTH)) rect.top -= ledWidth;
-        InvalidateRect( infoPtr->Self, &rect, oldPos < newPos );
     }
     else
     {
@@ -94,12 +89,10 @@ static void PROGRESS_Invalidate( PROGRES
                                      infoPtr->MaxVal - infoPtr->MinVal);
         newPos = rect.left + MulDiv (new - infoPtr->MinVal, rect.right - rect.left,
                                      infoPtr->MaxVal - infoPtr->MinVal);
-        ledWidth = MulDiv (rect.bottom - rect.top, 2, 3);
-        rect.left = min( oldPos, newPos );
-        rect.right = max( oldPos, newPos );
-        if (!(style & PBS_SMOOTH)) rect.right += ledWidth;
-        InvalidateRect( infoPtr->Self, &rect, oldPos > newPos );
     }
+    /* at least one app (InstallShield) depends on us invalidating the
+     * entire client area. */
+    InvalidateRect( infoPtr->Self, NULL, oldPos < newPos );
 }
 
 
@@ -109,7 +102,7 @@ static void PROGRESS_Invalidate( PROGRES
  */
 static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc)
 {
-    HBRUSH hbrBar, hbrBk;
+    HBRUSH hbrBar;
     int rightBar, rightMost, ledWidth;
     RECT rect;
     DWORD dwStyle;
@@ -122,14 +115,8 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
     else
         hbrBar = CreateSolidBrush (infoPtr->ColorBar);
 
-    if (infoPtr->ColorBk == CLR_DEFAULT)
-        hbrBk = GetSysColorBrush(COLOR_3DFACE);
-    else
-        hbrBk = CreateSolidBrush(infoPtr->ColorBk);
-
     /* get client rectangle */
     GetClientRect (infoPtr->Self, &rect);
-    FrameRect( hdc, &rect, hbrBk );
     InflateRect(&rect, -1, -1);
 
     /* get the window style */
@@ -175,7 +162,6 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                 if(infoPtr->MarqueePos > 0)
                 {
                     rect.top = max(old_bottom - infoPtr->MarqueePos, old_top);
-                    FillRect(hdc, &rect, hbrBk);
                     rect.bottom = rect.top;
                 }
                 if(rect.top >= old_top)
@@ -184,20 +170,11 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     FillRect(hdc, &rect, hbrBar);
                     rect.bottom = rect.top;
                 }
-                if(rect.top >= old_top)
-                {
-                    rect.top = old_top;
-                    FillRect(hdc, &rect, hbrBk);
-                }
             }
             else
             {
-                INT old_top = rect.top;
                 rect.top = rightBar;
                 FillRect(hdc, &rect, hbrBar);
-                rect.bottom = rect.top;
-                rect.top = old_top;
-                FillRect(hdc, &rect, hbrBk);
             }
         }
         else
@@ -221,7 +198,6 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                 if(infoPtr->MarqueePos > 0)
                 {
                     rect.right = min(old_left + infoPtr->MarqueePos, old_right);
-                    FillRect(hdc, &rect, hbrBk);
                     rect.left = rect.right;
                 }
                 if(rect.right < old_right)
@@ -230,20 +206,11 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     FillRect(hdc, &rect, hbrBar);
                     rect.left = rect.right;
                 }
-                if(rect.right < old_right)
-                {
-                    rect.right = old_right;
-                    FillRect(hdc, &rect, hbrBk);
-                }
             }
             else
             {
-                INT old_right = rect.right;
                 rect.right = rightBar;
                 FillRect(hdc, &rect, hbrBar);
-                rect.left = rect.right;
-                rect.right = old_right;
-                FillRect(hdc, &rect, hbrBk);
             }
         }
     } else {
@@ -264,14 +231,12 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     rect.bottom = rect.top;
                     rect.top -= LED_GAP;
                     if (rect.top <= old_top) break;
-                    FillRect(hdc, &rect, hbrBk);
                     rect.bottom = rect.top;
                     ledMStart--;
                 }
                 if(infoPtr->MarqueePos > 0)
                 {
                     rect.top = max(old_bottom - (infoPtr->MarqueePos * (ledWidth + LED_GAP)), old_top);
-                    FillRect(hdc, &rect, hbrBk);
                     rect.bottom = rect.top;
                 }
                 for(i = 0; i < MARQUEE_LEDS && rect.top >= old_top; i++)
@@ -281,14 +246,8 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     rect.bottom = rect.top;
                     rect.top -= LED_GAP;
                     if (rect.top <= old_top) break;
-                    FillRect(hdc, &rect, hbrBk);
                     rect.bottom = rect.top;
                 }
-                if(rect.top >= old_top)
-                {
-                    rect.top = old_top;
-                    FillRect(hdc, &rect, hbrBk);
-                }
             }
             else
             {
@@ -300,12 +259,9 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     rect.bottom = rect.top;
                     rect.top -= LED_GAP;
                     if (rect.top <= rightBar) break;
-                    FillRect(hdc, &rect, hbrBk);
                     rect.bottom = rect.top;
                 }
             }
-            rect.top = rightMost;
-            FillRect(hdc, &rect, hbrBk);
         } else {
             if (dwStyle & PBS_MARQUEE)
             {
@@ -324,14 +280,12 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     rect.left = rect.right;
                     rect.right += LED_GAP;
                     if (rect.right > old_right) break;
-                    FillRect(hdc, &rect, hbrBk);
                     rect.left = rect.right;
                     ledMStart--;
                 }
                 if(infoPtr->MarqueePos > 0)
                 {
                     rect.right = min(old_left + (infoPtr->MarqueePos * (ledWidth + LED_GAP)), old_right);
-                    FillRect(hdc, &rect, hbrBk);
                     rect.left = rect.right;
                 }
                 for(i = 0; i < MARQUEE_LEDS && rect.right < old_right; i++)
@@ -341,14 +295,8 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     rect.left = rect.right;
                     rect.right += LED_GAP;
                     if (rect.right > old_right) break;
-                    FillRect(hdc, &rect, hbrBk);
                     rect.left = rect.right;
                 }
-                if(rect.right < old_right)
-                {
-                    rect.right = old_right;
-                    FillRect(hdc, &rect, hbrBk);
-                }
             }
             else
             {
@@ -360,18 +308,14 @@ static LRESULT PROGRESS_Draw (PROGRESS_I
                     rect.left = rect.right;
                     rect.right += LED_GAP;
                     if (rect.right >= rightBar) break;
-                    FillRect(hdc, &rect, hbrBk);
                     rect.left = rect.right;
                 }
-                rect.right = rightMost;
-                FillRect(hdc, &rect, hbrBk);
             }
         }
     }
 
     /* delete bar brush */
     if (infoPtr->ColorBar != CLR_DEFAULT) DeleteObject (hbrBar);
-    if (infoPtr->ColorBk != CLR_DEFAULT) DeleteObject (hbrBk);
 
     return 0;
 }
@@ -547,9 +491,25 @@ static LRESULT WINAPI ProgressWindowProc
     case WM_SETFONT:
         return (LRESULT)PROGRESS_SetFont(infoPtr, (HFONT)wParam, (BOOL)lParam);
 
+    case WM_PRINTCLIENT:
     case WM_PAINT:
         return PROGRESS_Paint (infoPtr, (HDC)wParam);
 
+    case WM_ERASEBKGND:
+        if (infoPtr->ColorBk == CLR_DEFAULT)
+            return DefWindowProcW(hwnd, message, wParam, lParam);
+        else
+        {
+            RECT rc;
+            HDC hDC = (HDC)wParam;
+            HBRUSH hbrBackground = CreateSolidBrush(infoPtr->ColorBk);
+
+            GetClientRect(hwnd, &rc);
+            FillRect(hDC, &rc, hbrBackground);
+            DeleteObject(hbrBackground);
+            return TRUE;
+        }
+
     case WM_TIMER:
         return PROGRESS_Timer (infoPtr, (INT)wParam);
 
@@ -660,10 +620,11 @@ VOID PROGRESS_Register (void)
 
     ZeroMemory (&wndClass, sizeof(wndClass));
     wndClass.style         = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW;
-    wndClass.lpfnWndProc   = (WNDPROC)ProgressWindowProc;
+    wndClass.lpfnWndProc   = ProgressWindowProc;
     wndClass.cbClsExtra    = 0;
     wndClass.cbWndExtra    = sizeof (PROGRESS_INFO *);
     wndClass.hCursor       = LoadCursorW (0, (LPWSTR)IDC_ARROW);
+    wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
     wndClass.lpszClassName = PROGRESS_CLASSW;
 
     RegisterClassW (&wndClass);


More information about the wine-patches mailing list