Progress Bar: Fix Class Style & Repainting (resend2)
Robert Shearman
rob at codeweavers.com
Tue Sep 28 07:04:22 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 23 Sep 2004 01:11:57 -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