Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Progress control |
| 3 | * |
| 4 | * Copyright 1997 Dimitrie O. Paun |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 5 | * Copyright 1998, 1999 Eric Kohl |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 6 | * |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 7 | */ |
| 8 | |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 9 | #include "commctrl.h" |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 10 | #include "progress.h" |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 11 | #include "win.h" |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 12 | #include "debug.h" |
| 13 | |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 14 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 15 | /* Control configuration constants */ |
| 16 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 17 | #define LED_GAP 2 |
| 18 | |
| 19 | /* Work constants */ |
| 20 | |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 21 | #define UNKNOWN_PARAM(msg, wParam, lParam) WARN(progress, \ |
| 22 | "Unknown parameter(s) for message " #msg \ |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 23 | "(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); |
| 24 | |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 25 | #define PROGRESS_GetInfoPtr(hwnd) ((PROGRESS_INFO *)GetWindowLongA(hwnd, 0)) |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 26 | |
| 27 | |
| 28 | /*********************************************************************** |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 29 | * PROGRESS_Draw |
| 30 | * Draws the progress bar. |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 31 | */ |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 32 | static void |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 33 | PROGRESS_Draw (HWND hwnd, HDC hdc) |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 34 | { |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 35 | PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 36 | HBRUSH hbrBar, hbrBk; |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 37 | int rightBar, rightMost, ledWidth; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 38 | RECT rect; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 39 | DWORD dwStyle; |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 40 | |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 41 | TRACE(progress, "refresh pos=%d min=%d, max=%d\n", |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 42 | infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 43 | |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 44 | /* get the required bar brush */ |
| 45 | if (infoPtr->ColorBar == CLR_DEFAULT) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 46 | hbrBar = GetSysColorBrush(COLOR_HIGHLIGHT); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 47 | else |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 48 | hbrBar = CreateSolidBrush (infoPtr->ColorBar); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 49 | |
| 50 | /* get the required background brush */ |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 51 | if (infoPtr->ColorBk == CLR_DEFAULT) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 52 | hbrBk = GetSysColorBrush (COLOR_3DFACE); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 53 | else |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 54 | hbrBk = CreateSolidBrush (infoPtr->ColorBk); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 55 | |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 56 | /* get client rectangle */ |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 57 | GetClientRect (hwnd, &rect); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 58 | |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 59 | /* draw the background */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 60 | FillRect(hdc, &rect, hbrBk); |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 61 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 62 | rect.left++; rect.right--; rect.top++; rect.bottom--; |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 63 | |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 64 | /* get the window style */ |
| 65 | dwStyle = GetWindowLongA (hwnd, GWL_STYLE); |
| 66 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 67 | /* compute extent of progress bar */ |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 68 | if (dwStyle & PBS_VERTICAL) |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 69 | { |
| 70 | rightBar = rect.bottom - |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 71 | MulDiv(infoPtr->CurVal-infoPtr->MinVal, |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 72 | rect.bottom - rect.top, |
| 73 | infoPtr->MaxVal-infoPtr->MinVal); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 74 | ledWidth = MulDiv ((rect.right - rect.left), 2, 3); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 75 | rightMost = rect.top; |
| 76 | } |
| 77 | else |
| 78 | { |
| 79 | rightBar = rect.left + |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 80 | MulDiv(infoPtr->CurVal-infoPtr->MinVal, |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 81 | rect.right - rect.left, |
| 82 | infoPtr->MaxVal-infoPtr->MinVal); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 83 | ledWidth = MulDiv ((rect.bottom - rect.top), 2, 3); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 84 | rightMost = rect.right; |
| 85 | } |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 86 | |
| 87 | /* now draw the bar */ |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 88 | if (dwStyle & PBS_SMOOTH) |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 89 | { |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 90 | if (dwStyle & PBS_VERTICAL) |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 91 | rect.top = rightBar; |
| 92 | else |
| 93 | rect.right = rightBar; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 94 | FillRect(hdc, &rect, hbrBar); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 95 | } |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 96 | else |
| 97 | { |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 98 | if (dwStyle & PBS_VERTICAL) |
| 99 | { |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 100 | while(rect.bottom > rightBar) { |
| 101 | rect.top = rect.bottom-ledWidth; |
| 102 | if (rect.top < rightMost) |
| 103 | rect.top = rightMost; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 104 | FillRect(hdc, &rect, hbrBar); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 105 | rect.bottom = rect.top-LED_GAP; |
| 106 | } |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 107 | } |
| 108 | else { |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 109 | while(rect.left < rightBar) { |
| 110 | rect.right = rect.left+ledWidth; |
| 111 | if (rect.right > rightMost) |
| 112 | rect.right = rightMost; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 113 | FillRect(hdc, &rect, hbrBar); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 114 | rect.left = rect.right+LED_GAP; |
| 115 | } |
| 116 | } |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 117 | } |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 118 | |
| 119 | /* delete bar brush */ |
| 120 | if (infoPtr->ColorBar != CLR_DEFAULT) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 121 | DeleteObject (hbrBar); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 122 | |
| 123 | /* delete background brush */ |
| 124 | if (infoPtr->ColorBk != CLR_DEFAULT) |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 125 | DeleteObject (hbrBk); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 126 | } |
| 127 | |
| 128 | /*********************************************************************** |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 129 | * PROGRESS_Refresh |
| 130 | * Draw the progress bar. The background need not be erased. |
| 131 | */ |
| 132 | static void |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 133 | PROGRESS_Refresh (HWND hwnd) |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 134 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 135 | HDC hdc; |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 136 | |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 137 | hdc = GetDC (hwnd); |
| 138 | PROGRESS_Draw (hwnd, hdc); |
| 139 | ReleaseDC (hwnd, hdc); |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 140 | } |
| 141 | |
| 142 | /*********************************************************************** |
| 143 | * PROGRESS_Paint |
| 144 | * Draw the progress bar. The background need not be erased. |
| 145 | * If dc!=0, it draws on it |
| 146 | */ |
| 147 | static void |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 148 | PROGRESS_Paint (HWND hwnd) |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 149 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 150 | PAINTSTRUCT ps; |
| 151 | HDC hdc; |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 152 | |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 153 | hdc = BeginPaint (hwnd, &ps); |
| 154 | PROGRESS_Draw (hwnd, hdc); |
| 155 | EndPaint (hwnd, &ps); |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 156 | } |
| 157 | |
| 158 | |
| 159 | /*********************************************************************** |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 160 | * PROGRESS_CoercePos |
| 161 | * Makes sure the current position (CUrVal) is within bounds. |
| 162 | */ |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 163 | static void PROGRESS_CoercePos(HWND hwnd) |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 164 | { |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 165 | PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 166 | |
| 167 | if(infoPtr->CurVal < infoPtr->MinVal) |
| 168 | infoPtr->CurVal = infoPtr->MinVal; |
| 169 | if(infoPtr->CurVal > infoPtr->MaxVal) |
| 170 | infoPtr->CurVal = infoPtr->MaxVal; |
| 171 | } |
| 172 | |
Eric Kohl | 8305ad5 | 1999-01-24 19:09:24 +0000 | [diff] [blame] | 173 | |
| 174 | /*********************************************************************** |
| 175 | * PROGRESS_SetFont |
| 176 | * Set new Font for progress bar |
| 177 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 178 | static HFONT |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 179 | PROGRESS_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam) |
Eric Kohl | 8305ad5 | 1999-01-24 19:09:24 +0000 | [diff] [blame] | 180 | { |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 181 | PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 182 | HFONT hOldFont = infoPtr->hFont; |
Eric Kohl | 8305ad5 | 1999-01-24 19:09:24 +0000 | [diff] [blame] | 183 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 184 | infoPtr->hFont = (HFONT)wParam; |
Eric Kohl | 8305ad5 | 1999-01-24 19:09:24 +0000 | [diff] [blame] | 185 | if (LOWORD(lParam)) |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 186 | PROGRESS_Refresh (hwnd); |
Eric Kohl | 8305ad5 | 1999-01-24 19:09:24 +0000 | [diff] [blame] | 187 | return hOldFont; |
| 188 | } |
| 189 | |
| 190 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 191 | /*********************************************************************** |
| 192 | * ProgressWindowProc |
| 193 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 194 | LRESULT WINAPI ProgressWindowProc(HWND hwnd, UINT message, |
| 195 | WPARAM wParam, LPARAM lParam) |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 196 | { |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 197 | PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(hwnd); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 198 | UINT temp; |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 199 | |
| 200 | switch(message) |
| 201 | { |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 202 | case WM_NCCREATE: |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 203 | { |
| 204 | DWORD dwExStyle; |
| 205 | dwExStyle = GetWindowLongA (hwnd, GWL_EXSTYLE); |
| 206 | SetWindowLongA (hwnd, GWL_EXSTYLE, dwExStyle | WS_EX_STATICEDGE); |
| 207 | } |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 208 | return TRUE; |
| 209 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 210 | case WM_CREATE: |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 211 | /* allocate memory for info struct */ |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 212 | infoPtr = |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 213 | (PROGRESS_INFO *)COMCTL32_Alloc (sizeof(PROGRESS_INFO)); |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 214 | SetWindowLongA (hwnd, 0, (DWORD)infoPtr); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 215 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 216 | /* initialize the info struct */ |
| 217 | infoPtr->MinVal=0; |
| 218 | infoPtr->MaxVal=100; |
| 219 | infoPtr->CurVal=0; |
| 220 | infoPtr->Step=10; |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 221 | infoPtr->ColorBar=CLR_DEFAULT; |
| 222 | infoPtr->ColorBk=CLR_DEFAULT; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 223 | infoPtr->hFont=(HANDLE)NULL; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 224 | TRACE(progress, "Progress Ctrl creation, hwnd=%04x\n", hwnd); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 225 | break; |
| 226 | |
| 227 | case WM_DESTROY: |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 228 | TRACE (progress, "Progress Ctrl destruction, hwnd=%04x\n", hwnd); |
| 229 | COMCTL32_Free (infoPtr); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 230 | break; |
| 231 | |
| 232 | case WM_ERASEBKGND: |
| 233 | /* pretend to erase it here, but we will do it in the paint |
| 234 | function to avoid flicker */ |
| 235 | return 1; |
| 236 | |
| 237 | case WM_GETFONT: |
Eric Kohl | 8305ad5 | 1999-01-24 19:09:24 +0000 | [diff] [blame] | 238 | return (LRESULT)infoPtr->hFont; |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 239 | |
| 240 | case WM_SETFONT: |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 241 | return PROGRESS_SetFont (hwnd, wParam, lParam); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 242 | |
| 243 | case WM_PAINT: |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 244 | PROGRESS_Paint (hwnd); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 245 | break; |
| 246 | |
| 247 | case PBM_DELTAPOS: |
| 248 | if(lParam) |
| 249 | UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam); |
| 250 | temp = infoPtr->CurVal; |
| 251 | if(wParam != 0){ |
| 252 | infoPtr->CurVal += (UINT16)wParam; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 253 | PROGRESS_CoercePos (hwnd); |
| 254 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 255 | } |
| 256 | return temp; |
| 257 | |
| 258 | case PBM_SETPOS: |
| 259 | if (lParam) |
| 260 | UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam); |
| 261 | temp = infoPtr->CurVal; |
| 262 | if(temp != wParam){ |
| 263 | infoPtr->CurVal = (UINT16)wParam; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 264 | PROGRESS_CoercePos(hwnd); |
| 265 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 266 | } |
| 267 | return temp; |
| 268 | |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 269 | case PBM_SETRANGE: |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 270 | if (wParam) |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 271 | UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 272 | temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal); |
| 273 | if(temp != lParam){ |
| 274 | infoPtr->MinVal = LOWORD(lParam); |
| 275 | infoPtr->MaxVal = HIWORD(lParam); |
| 276 | if(infoPtr->MaxVal <= infoPtr->MinVal) |
| 277 | infoPtr->MaxVal = infoPtr->MinVal+1; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 278 | PROGRESS_CoercePos(hwnd); |
| 279 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 280 | } |
| 281 | return temp; |
| 282 | |
| 283 | case PBM_SETSTEP: |
| 284 | if (lParam) |
| 285 | UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam); |
| 286 | temp = infoPtr->Step; |
| 287 | infoPtr->Step = (UINT16)wParam; |
| 288 | return temp; |
| 289 | |
| 290 | case PBM_STEPIT: |
| 291 | if (wParam || lParam) |
| 292 | UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam); |
| 293 | temp = infoPtr->CurVal; |
| 294 | infoPtr->CurVal += infoPtr->Step; |
| 295 | if(infoPtr->CurVal > infoPtr->MaxVal) |
| 296 | infoPtr->CurVal = infoPtr->MinVal; |
| 297 | if(temp != infoPtr->CurVal) |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 298 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 299 | return temp; |
| 300 | |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 301 | case PBM_SETRANGE32: |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 302 | temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 303 | if((infoPtr->MinVal != (INT)wParam) || |
| 304 | (infoPtr->MaxVal != (INT)lParam)) { |
| 305 | infoPtr->MinVal = (INT)wParam; |
| 306 | infoPtr->MaxVal = (INT)lParam; |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 307 | if(infoPtr->MaxVal <= infoPtr->MinVal) |
| 308 | infoPtr->MaxVal = infoPtr->MinVal+1; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 309 | PROGRESS_CoercePos(hwnd); |
| 310 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 311 | } |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 312 | return temp; |
| 313 | |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 314 | case PBM_GETRANGE: |
| 315 | if (lParam){ |
| 316 | ((PPBRANGE)lParam)->iLow = infoPtr->MinVal; |
| 317 | ((PPBRANGE)lParam)->iHigh = infoPtr->MaxVal; |
| 318 | } |
| 319 | return (wParam) ? infoPtr->MinVal : infoPtr->MaxVal; |
| 320 | |
| 321 | case PBM_GETPOS: |
| 322 | if (wParam || lParam) |
| 323 | UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam); |
| 324 | return (infoPtr->CurVal); |
| 325 | |
| 326 | case PBM_SETBARCOLOR: |
| 327 | if (wParam) |
| 328 | UNKNOWN_PARAM(PBM_SETBARCOLOR, wParam, lParam); |
| 329 | infoPtr->ColorBar = (COLORREF)lParam; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 330 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 331 | break; |
| 332 | |
| 333 | case PBM_SETBKCOLOR: |
| 334 | if (wParam) |
| 335 | UNKNOWN_PARAM(PBM_SETBKCOLOR, wParam, lParam); |
| 336 | infoPtr->ColorBk = (COLORREF)lParam; |
Eric Kohl | fa8ae2f | 1999-03-12 17:40:32 +0000 | [diff] [blame^] | 337 | PROGRESS_Refresh (hwnd); |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 338 | break; |
| 339 | |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 340 | default: |
| 341 | if (message >= WM_USER) |
Alexandre Julliard | a69b88b | 1998-03-15 20:29:56 +0000 | [diff] [blame] | 342 | ERR(progress, "unknown msg %04x wp=%04x lp=%08lx\n", |
| 343 | message, wParam, lParam ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 344 | return DefWindowProcA( hwnd, message, wParam, lParam ); |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 345 | } |
| 346 | |
| 347 | return 0; |
| 348 | } |
| 349 | |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 350 | |
| 351 | /*********************************************************************** |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 352 | * PROGRESS_Register [Internal] |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 353 | * |
| 354 | * Registers the progress bar window class. |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 355 | */ |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 356 | |
Eric Kohl | 9d8e864 | 1998-10-24 10:49:27 +0000 | [diff] [blame] | 357 | VOID |
| 358 | PROGRESS_Register (VOID) |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 359 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 360 | WNDCLASSA wndClass; |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 361 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 362 | if (GlobalFindAtomA (PROGRESS_CLASSA)) return; |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 363 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 364 | ZeroMemory (&wndClass, sizeof( WNDCLASSA)); |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 365 | wndClass.style = CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 366 | wndClass.lpfnWndProc = (WNDPROC)ProgressWindowProc; |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 367 | wndClass.cbClsExtra = 0; |
Eric Kohl | 9d8e864 | 1998-10-24 10:49:27 +0000 | [diff] [blame] | 368 | wndClass.cbWndExtra = sizeof (PROGRESS_INFO *); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 369 | wndClass.hCursor = LoadCursorA (0, IDC_ARROWA); |
| 370 | wndClass.lpszClassName = PROGRESS_CLASSA; |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 371 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 372 | RegisterClassA (&wndClass); |
Eric Kohl | 9d8e864 | 1998-10-24 10:49:27 +0000 | [diff] [blame] | 373 | } |
| 374 | |
| 375 | |
| 376 | /*********************************************************************** |
| 377 | * PROGRESS_Unregister [Internal] |
| 378 | * |
| 379 | * Unregisters the progress bar window class. |
| 380 | */ |
| 381 | |
| 382 | VOID |
| 383 | PROGRESS_Unregister (VOID) |
| 384 | { |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 385 | if (GlobalFindAtomA (PROGRESS_CLASSA)) |
| 386 | UnregisterClassA (PROGRESS_CLASSA, (HINSTANCE)NULL); |
Alexandre Julliard | dadf78f | 1998-05-17 17:13:43 +0000 | [diff] [blame] | 387 | } |
| 388 | |