[Also sent in private email to Alexandre] ChangeLog: Code cleanup: -- add new SetRange functions (instead of duplicating the code) -- pass the infoPtr around instead of the hwnd -- use W-functions instead of A-functions -- more checks in case of failures -- make indentation and style consistent throughout the file -- Dimi.
Index: dlls/comctl32/progress.c =================================================================== RCS file: /var/cvs/wine/dlls/comctl32/progress.c,v retrieving revision 1.16 diff -u -r1.16 progress.c --- dlls/comctl32/progress.c 26 Jan 2001 20:43:41 -0000 1.16 +++ dlls/comctl32/progress.c 25 Jan 2002 04:42:12 -0000 @@ -1,7 +1,7 @@ /* * Progress control * - * Copyright 1997 Dimitrie O. Paun + * Copyright 1997, 2002 Dimitrie O. Paun * Copyright 1998, 1999 Eric Kohl * */ @@ -15,140 +15,125 @@ typedef struct { - INT CurVal; /* Current progress value */ - INT MinVal; /* Minimum progress value */ - INT MaxVal; /* Maximum progress value */ - INT Step; /* Step to use on PMB_STEPIT */ - COLORREF ColorBar; /* Bar color */ - COLORREF ColorBk; /* Background color */ - HFONT hFont; /* Handle to font (not unused) */ + HWND Self; /* The window handle for this control */ + INT CurVal; /* Current progress value */ + INT MinVal; /* Minimum progress value */ + INT MaxVal; /* Maximum progress value */ + INT Step; /* Step to use on PMB_STEPIT */ + COLORREF ColorBar; /* Bar color */ + COLORREF ColorBk; /* Background color */ + HFONT Font; /* Handle to font (not unused) */ } PROGRESS_INFO; /* Control configuration constants */ #define LED_GAP 2 -/* Work constants */ - -#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(\ - "Unknown parameter(s) for message " #msg \ - "(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); - -#define PROGRESS_GetInfoPtr(hwnd) ((PROGRESS_INFO *)GetWindowLongA(hwnd, 0)) - +#define UNKNOWN_PARAM(msg, wParam, lParam) WARN( \ + "Unknown parameter(s) for message " #msg \ + "(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); /*********************************************************************** * PROGRESS_Draw * Draws the progress bar. */ -static void -PROGRESS_Draw (HWND hwnd, HDC hdc) +static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc) { - PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); - HBRUSH hbrBar, hbrBk; - int rightBar, rightMost, ledWidth; - RECT rect; - DWORD dwStyle; - - TRACE("refresh pos=%d min=%d, max=%d\n", - infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal); - - /* get the required bar brush */ - if (infoPtr->ColorBar == CLR_DEFAULT) - hbrBar = GetSysColorBrush(COLOR_HIGHLIGHT); - else - hbrBar = CreateSolidBrush (infoPtr->ColorBar); - - /* get the required background brush */ - if (infoPtr->ColorBk == CLR_DEFAULT) - hbrBk = GetSysColorBrush (COLOR_3DFACE); - else - hbrBk = CreateSolidBrush (infoPtr->ColorBk); - - /* get client rectangle */ - GetClientRect (hwnd, &rect); - - /* draw the background */ - FillRect(hdc, &rect, hbrBk); - - rect.left++; rect.right--; rect.top++; rect.bottom--; - - /* get the window style */ - dwStyle = GetWindowLongA (hwnd, GWL_STYLE); - - /* compute extent of progress bar */ - if (dwStyle & PBS_VERTICAL) - { - rightBar = rect.bottom - - MulDiv(infoPtr->CurVal-infoPtr->MinVal, - rect.bottom - rect.top, - infoPtr->MaxVal-infoPtr->MinVal); - ledWidth = MulDiv ((rect.right - rect.left), 2, 3); - rightMost = rect.top; - } - else - { - rightBar = rect.left + - MulDiv(infoPtr->CurVal-infoPtr->MinVal, - rect.right - rect.left, - infoPtr->MaxVal-infoPtr->MinVal); - ledWidth = MulDiv ((rect.bottom - rect.top), 2, 3); - rightMost = rect.right; - } - - /* now draw the bar */ - if (dwStyle & PBS_SMOOTH) - { - if (dwStyle & PBS_VERTICAL) - rect.top = rightBar; + HBRUSH hbrBar, hbrBk; + int rightBar, rightMost, ledWidth; + RECT rect; + DWORD dwStyle; + + TRACE("(infoPtr=%p, hdc=%x)\n", infoPtr, hdc); + + /* get the required bar brush */ + if (infoPtr->ColorBar == CLR_DEFAULT) + hbrBar = GetSysColorBrush(COLOR_HIGHLIGHT); else - rect.right = rightBar; - FillRect(hdc, &rect, hbrBar); - } - else - { - if (dwStyle & PBS_VERTICAL) - { - while(rect.bottom > rightBar) { - rect.top = rect.bottom-ledWidth; - if (rect.top < rightMost) - rect.top = rightMost; - FillRect(hdc, &rect, hbrBar); - rect.bottom = rect.top-LED_GAP; - } + hbrBar = CreateSolidBrush (infoPtr->ColorBar); + + /* get the required background brush */ + if (infoPtr->ColorBk == CLR_DEFAULT) + hbrBk = GetSysColorBrush (COLOR_3DFACE); + else + hbrBk = CreateSolidBrush (infoPtr->ColorBk); + + /* get client rectangle */ + GetClientRect (infoPtr->Self, &rect); + + /* draw the background */ + FillRect(hdc, &rect, hbrBk); + + rect.left++; rect.right--; rect.top++; rect.bottom--; + + /* get the window style */ + dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); + + /* compute extent of progress bar */ + if (dwStyle & PBS_VERTICAL) { + rightBar = rect.bottom - + MulDiv (infoPtr->CurVal - infoPtr->MinVal, + rect.bottom - rect.top, + infoPtr->MaxVal - infoPtr->MinVal); + ledWidth = MulDiv (rect.right - rect.left, 2, 3); + rightMost = rect.top; + } else { + rightBar = rect.left + + MulDiv (infoPtr->CurVal - infoPtr->MinVal, + rect.right - rect.left, + infoPtr->MaxVal - infoPtr->MinVal); + ledWidth = MulDiv (rect.bottom - rect.top, 2, 3); + rightMost = rect.right; } - else { - while(rect.left < rightBar) { - rect.right = rect.left+ledWidth; - if (rect.right > rightMost) - rect.right = rightMost; + + /* now draw the bar */ + if (dwStyle & PBS_SMOOTH) { + if (dwStyle & PBS_VERTICAL) + rect.top = rightBar; + else + rect.right = rightBar; FillRect(hdc, &rect, hbrBar); - rect.left = rect.right+LED_GAP; - } - } - } - - /* delete bar brush */ - if (infoPtr->ColorBar != CLR_DEFAULT) - DeleteObject (hbrBar); - - /* delete background brush */ - if (infoPtr->ColorBk != CLR_DEFAULT) - DeleteObject (hbrBk); + } else { + if (dwStyle & PBS_VERTICAL) { + while(rect.bottom > rightBar) { + rect.top = rect.bottom - ledWidth; + if (rect.top < rightMost) + rect.top = rightMost; + FillRect(hdc, &rect, hbrBar); + rect.bottom = rect.top - LED_GAP; + } + } else { + while(rect.left < rightBar) { + rect.right = rect.left + ledWidth; + if (rect.right > rightMost) + rect.right = rightMost; + FillRect(hdc, &rect, hbrBar); + rect.left = rect.right + LED_GAP; + } + } + } + + /* delete bar brush */ + if (infoPtr->ColorBar != CLR_DEFAULT) + DeleteObject (hbrBar); + + /* delete background brush */ + if (infoPtr->ColorBk != CLR_DEFAULT) + DeleteObject (hbrBk); + + return 0; } /*********************************************************************** * PROGRESS_Refresh * Draw the progress bar. The background need not be erased. */ -static void -PROGRESS_Refresh (HWND hwnd) +static LRESULT PROGRESS_Refresh (PROGRESS_INFO *infoPtr) { - HDC hdc; - - hdc = GetDC (hwnd); - PROGRESS_Draw (hwnd, hdc); - ReleaseDC (hwnd, hdc); + HDC hdc = GetDC (infoPtr->Self); + LRESULT res = PROGRESS_Draw (infoPtr, hdc); + ReleaseDC (infoPtr->Self, hdc); + return res; } /*********************************************************************** @@ -156,30 +141,27 @@ * Draw the progress bar. The background need not be erased. * If dc!=0, it draws on it */ -static void -PROGRESS_Paint (HWND hwnd) +static LRESULT PROGRESS_Paint (PROGRESS_INFO *infoPtr, HDC hdc) { PAINTSTRUCT ps; - HDC hdc; - - hdc = BeginPaint (hwnd, &ps); - PROGRESS_Draw (hwnd, hdc); - EndPaint (hwnd, &ps); + if (hdc) return PROGRESS_Draw (infoPtr, hdc); + hdc = BeginPaint (infoPtr->Self, &ps); + PROGRESS_Draw (infoPtr, hdc); + EndPaint (infoPtr->Self, &ps); + return 0; } /*********************************************************************** * PROGRESS_CoercePos - * Makes sure the current position (CUrVal) is within bounds. + * Makes sure the current position (CurVal) is within bounds. */ -static void PROGRESS_CoercePos(HWND hwnd) +static void PROGRESS_CoercePos(PROGRESS_INFO *infoPtr) { - PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); - - if(infoPtr->CurVal < infoPtr->MinVal) - infoPtr->CurVal = infoPtr->MinVal; - if(infoPtr->CurVal > infoPtr->MaxVal) - infoPtr->CurVal = infoPtr->MaxVal; + if(infoPtr->CurVal < infoPtr->MinVal) + infoPtr->CurVal = infoPtr->MinVal; + if(infoPtr->CurVal > infoPtr->MaxVal) + infoPtr->CurVal = infoPtr->MaxVal; } @@ -187,18 +169,29 @@ * PROGRESS_SetFont * Set new Font for progress bar */ -static HFONT -PROGRESS_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam) +static HFONT PROGRESS_SetFont (PROGRESS_INFO *infoPtr, HFONT hFont, BOOL bRedraw) { - PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); - HFONT hOldFont = infoPtr->hFont; - - infoPtr->hFont = (HFONT)wParam; - if (LOWORD(lParam)) - PROGRESS_Refresh (hwnd); - return hOldFont; + HFONT hOldFont = infoPtr->Font; + infoPtr->Font = hFont; + if (bRedraw) PROGRESS_Refresh (infoPtr); + return hOldFont; } +static DWORD PROGRESS_SetRange (PROGRESS_INFO *infoPtr, int low, int high) +{ + DWORD res = MAKELONG(LOWORD(infoPtr->MinVal), LOWORD(infoPtr->MaxVal)); + + /* if nothing changes, simply return */ + if(infoPtr->MinVal == low && infoPtr->MaxVal == high) return res; + + /* if things are different, adjust values and repaint the control */ + if (high <= low) high = low + 1; + infoPtr->MinVal = low; + infoPtr->MaxVal = high; + PROGRESS_CoercePos(infoPtr); + PROGRESS_Refresh (infoPtr); + return res; +} /*********************************************************************** * ProgressWindowProc @@ -206,159 +199,126 @@ static LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); - UINT temp; - if (!infoPtr && (message != WM_CREATE)) - return DefWindowProcA( hwnd, message, wParam, lParam ); - switch(message) - { + PROGRESS_INFO *infoPtr = (PROGRESS_INFO *)GetWindowLongW(hwnd, 0); + DWORD dwExStyle; + UINT temp; + + if (!infoPtr && message != WM_CREATE && message != WM_NCCREATE) + return DefWindowProcW( hwnd, message, wParam, lParam ); + + switch(message) { case WM_NCCREATE: - { - DWORD dwExStyle; - dwExStyle = GetWindowLongA (hwnd, GWL_EXSTYLE); - SetWindowLongA (hwnd, GWL_EXSTYLE, dwExStyle | WS_EX_STATICEDGE); - } - return TRUE; + dwExStyle = GetWindowLongW (hwnd, GWL_EXSTYLE); + SetWindowLongW (hwnd, GWL_EXSTYLE, dwExStyle | WS_EX_STATICEDGE); + return TRUE; case WM_CREATE: - /* allocate memory for info struct */ - infoPtr = - (PROGRESS_INFO *)COMCTL32_Alloc (sizeof(PROGRESS_INFO)); - SetWindowLongA (hwnd, 0, (DWORD)infoPtr); - - /* initialize the info struct */ - infoPtr->MinVal=0; - infoPtr->MaxVal=100; - infoPtr->CurVal=0; - infoPtr->Step=10; - infoPtr->ColorBar=CLR_DEFAULT; - infoPtr->ColorBk=CLR_DEFAULT; - infoPtr->hFont=(HANDLE)NULL; - TRACE("Progress Ctrl creation, hwnd=%04x\n", hwnd); - break; + /* allocate memory for info struct */ + infoPtr = (PROGRESS_INFO *)COMCTL32_Alloc (sizeof(PROGRESS_INFO)); + if (!infoPtr) return -1; + SetWindowLongW (hwnd, 0, (DWORD)infoPtr); + + /* initialize the info struct */ + infoPtr->Self = hwnd; + infoPtr->MinVal = 0; + infoPtr->MaxVal = 100; + infoPtr->CurVal = 0; + infoPtr->Step = 10; + infoPtr->ColorBar = CLR_DEFAULT; + infoPtr->ColorBk = CLR_DEFAULT; + infoPtr->Font = 0; + TRACE("Progress Ctrl creation, hwnd=%04x\n", hwnd); + return 0; case WM_DESTROY: - TRACE("Progress Ctrl destruction, hwnd=%04x\n", hwnd); - COMCTL32_Free (infoPtr); - SetWindowLongA(hwnd, 0, 0); - break; + TRACE("Progress Ctrl destruction, hwnd=%04x\n", hwnd); + COMCTL32_Free (infoPtr); + SetWindowLongW(hwnd, 0, 0); + return 0; case WM_ERASEBKGND: - /* pretend to erase it here, but we will do it in the paint - function to avoid flicker */ - return 1; + /* pretend to erase it here, but we will do it in the paint + function to avoid flicker */ + return TRUE; case WM_GETFONT: - return (LRESULT)infoPtr->hFont; + return (LRESULT)infoPtr->Font; case WM_SETFONT: - return PROGRESS_SetFont (hwnd, wParam, lParam); + return PROGRESS_SetFont (infoPtr, (HFONT)wParam, (BOOL)lParam); case WM_PAINT: - PROGRESS_Paint (hwnd); - break; + return PROGRESS_Paint (infoPtr, (HDC)wParam); case PBM_DELTAPOS: - if(lParam) - UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam); - temp = infoPtr->CurVal; - if(wParam != 0){ - infoPtr->CurVal += (WORD)wParam; - PROGRESS_CoercePos (hwnd); - PROGRESS_Refresh (hwnd); - } - return temp; + if(lParam) UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam); + temp = infoPtr->CurVal; + if(wParam != 0) { + infoPtr->CurVal += (WORD)wParam; + PROGRESS_CoercePos (infoPtr); + PROGRESS_Refresh (infoPtr); + } + return temp; case PBM_SETPOS: - if (lParam) - UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam); - temp = infoPtr->CurVal; - if(temp != wParam){ - infoPtr->CurVal = (WORD)wParam; - PROGRESS_CoercePos(hwnd); - PROGRESS_Refresh (hwnd); - } - return temp; + if (lParam) UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam); + temp = infoPtr->CurVal; + if(temp != wParam) { + infoPtr->CurVal = (WORD)wParam; + PROGRESS_CoercePos(infoPtr); + PROGRESS_Refresh (infoPtr); + } + return temp; case PBM_SETRANGE: - if (wParam) - UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam); - temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal); - if(temp != lParam){ - infoPtr->MinVal = LOWORD(lParam); - infoPtr->MaxVal = HIWORD(lParam); - if(infoPtr->MaxVal <= infoPtr->MinVal) - infoPtr->MaxVal = infoPtr->MinVal+1; - PROGRESS_CoercePos(hwnd); - PROGRESS_Refresh (hwnd); - } - return temp; + if (wParam) UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam); + return PROGRESS_SetRange (infoPtr, (int)LOWORD(lParam), (int)HIWORD(lParam)); case PBM_SETSTEP: - if (lParam) - UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam); - temp = infoPtr->Step; - infoPtr->Step = (WORD)wParam; - return temp; + if (lParam) UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam); + temp = infoPtr->Step; + infoPtr->Step = (WORD)wParam; + return temp; case PBM_STEPIT: - if (wParam || lParam) - UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam); - temp = infoPtr->CurVal; - infoPtr->CurVal += infoPtr->Step; - if(infoPtr->CurVal > infoPtr->MaxVal) - infoPtr->CurVal = infoPtr->MinVal; - if(temp != infoPtr->CurVal) - PROGRESS_Refresh (hwnd); - return temp; + if (wParam || lParam) UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam); + temp = infoPtr->CurVal; + infoPtr->CurVal += infoPtr->Step; + if(infoPtr->CurVal > infoPtr->MaxVal) + infoPtr->CurVal = infoPtr->MinVal; + if(temp != infoPtr->CurVal) + PROGRESS_Refresh (infoPtr); + return temp; case PBM_SETRANGE32: - temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal); - if((infoPtr->MinVal != (INT)wParam) || - (infoPtr->MaxVal != (INT)lParam)) { - infoPtr->MinVal = (INT)wParam; - infoPtr->MaxVal = (INT)lParam; - if(infoPtr->MaxVal <= infoPtr->MinVal) - infoPtr->MaxVal = infoPtr->MinVal+1; - PROGRESS_CoercePos(hwnd); - PROGRESS_Refresh (hwnd); - } - return temp; + return PROGRESS_SetRange (infoPtr, (int)wParam, (int)lParam); case PBM_GETRANGE: - if (lParam){ - ((PPBRANGE)lParam)->iLow = infoPtr->MinVal; - ((PPBRANGE)lParam)->iHigh = infoPtr->MaxVal; - } - return (wParam) ? infoPtr->MinVal : infoPtr->MaxVal; + if (lParam) { + ((PPBRANGE)lParam)->iLow = infoPtr->MinVal; + ((PPBRANGE)lParam)->iHigh = infoPtr->MaxVal; + } + return wParam ? infoPtr->MinVal : infoPtr->MaxVal; case PBM_GETPOS: - if (wParam || lParam) - UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam); - return (infoPtr->CurVal); + if (wParam || lParam) UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam); + return infoPtr->CurVal; case PBM_SETBARCOLOR: - if (wParam) - UNKNOWN_PARAM(PBM_SETBARCOLOR, wParam, lParam); - infoPtr->ColorBar = (COLORREF)lParam; - PROGRESS_Refresh (hwnd); - break; + if (wParam) UNKNOWN_PARAM(PBM_SETBARCOLOR, wParam, lParam); + infoPtr->ColorBar = (COLORREF)lParam; + return PROGRESS_Refresh (infoPtr); case PBM_SETBKCOLOR: - if (wParam) - UNKNOWN_PARAM(PBM_SETBKCOLOR, wParam, lParam); - infoPtr->ColorBk = (COLORREF)lParam; - PROGRESS_Refresh (hwnd); - break; + if (wParam) UNKNOWN_PARAM(PBM_SETBKCOLOR, wParam, lParam); + infoPtr->ColorBk = (COLORREF)lParam; + return PROGRESS_Refresh (infoPtr); default: - if (message >= WM_USER) - ERR("unknown msg %04x wp=%04x lp=%08lx\n", - message, wParam, lParam ); - return DefWindowProcA( hwnd, message, wParam, lParam ); + if (message >= WM_USER) + ERR("unknown msg %04x wp=%04x lp=%08lx\n", message, wParam, lParam ); + return DefWindowProcW( hwnd, message, wParam, lParam ); } - - return 0; } @@ -367,21 +327,19 @@ * * Registers the progress bar window class. */ - -VOID -PROGRESS_Register (void) +VOID PROGRESS_Register (void) { - WNDCLASSA wndClass; + WNDCLASSW wndClass; - ZeroMemory (&wndClass, sizeof( WNDCLASSA)); + ZeroMemory (&wndClass, sizeof(wndClass)); wndClass.style = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc = (WNDPROC)ProgressWindowProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = sizeof (PROGRESS_INFO *); - wndClass.hCursor = LoadCursorA (0, IDC_ARROWA); - wndClass.lpszClassName = PROGRESS_CLASSA; + wndClass.hCursor = LoadCursorW (0, IDC_ARROWW); + wndClass.lpszClassName = PROGRESS_CLASSW; - RegisterClassA (&wndClass); + RegisterClassW (&wndClass); } @@ -390,10 +348,8 @@ * * Unregisters the progress bar window class. */ - -VOID -PROGRESS_Unregister (void) +VOID PROGRESS_Unregister (void) { - UnregisterClassA (PROGRESS_CLASSA, (HINSTANCE)NULL); + UnregisterClassW (PROGRESS_CLASSW, (HINSTANCE)NULL); }