4 * Copyright 1997 Dimitrie O. Paun
7 * - I do not know what to to on WM_[SG]ET_FONT
9 * - I think I do not compute correctly the numer of leds to be drawn
16 #include "sysmetrics.h"
24 /* Control configuration constants */
31 #define UNKNOWN_PARAM(msg, wParam, lParam) dprintf_progress(stddeb, \
32 "Progress Ctrl: Unknown parameter(s) for message " #msg \
33 "(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam);
35 #define PROGRESS_GetInfoPtr(wndPtr) ((PROGRESS_INFO *)wndPtr->wExtra)
38 /***********************************************************************
40 * Draw the arrows. The background need not be erased.
41 * If dc!=0, it draws on it
43 static void PROGRESS_Paint(WND *wndPtr, HDC32 dc)
45 PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
47 int rightBar, rightMost;
52 dprintf_progress(stddeb, "Progress Bar: paint pos=%d min=%d, max=%d\n",
53 infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal);
56 hdc = dc==0 ? BeginPaint32(wndPtr->hwndSelf, &ps) : dc;
58 /* get the required brush */
59 ledBrush = GetSysColorBrush32(COLOR_HIGHLIGHT);
61 /* get rect for the bar, adjusted for the border */
62 GetClientRect32(wndPtr->hwndSelf, &rect);
65 DrawEdge32(hdc, &rect, BDR_SUNKENOUTER, BF_RECT|BF_ADJUST|BF_MIDDLE);
66 rect.left++; rect.right--; rect.top++; rect.bottom--;
67 rightMost = rect.right;
69 /* compute extent of progress bar */
70 rightBar = rect.left +
71 MulDiv32(infoPtr->CurVal-infoPtr->MinVal,
72 rect.right - rect.left,
73 infoPtr->MaxVal-infoPtr->MinVal);
75 /* now draw the bar */
76 while(rect.left < rightBar) {
77 rect.right = rect.left+LED_WIDTH;
78 FillRect32(hdc, &rect, ledBrush);
79 rect.left = rect.right+LED_GAP;
84 EndPaint32(wndPtr->hwndSelf, &ps);
87 /***********************************************************************
89 * Makes sure the current position (CUrVal) is within bounds.
91 static void PROGRESS_CoercePos(WND *wndPtr)
93 PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
95 if(infoPtr->CurVal < infoPtr->MinVal)
96 infoPtr->CurVal = infoPtr->MinVal;
97 if(infoPtr->CurVal > infoPtr->MaxVal)
98 infoPtr->CurVal = infoPtr->MaxVal;
101 /***********************************************************************
104 LRESULT WINAPI ProgressWindowProc(HWND32 hwnd, UINT32 message,
105 WPARAM32 wParam, LPARAM lParam)
107 WND *wndPtr = WIN_FindWndPtr(hwnd);
108 PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
114 /* initialize the info struct */
119 dprintf_updown(stddeb, "Progress Ctrl creation, hwnd=%04x\n", hwnd);
123 dprintf_updown(stddeb, "Progress Ctrl destruction, hwnd=%04x\n", hwnd);
127 /* pretend to erase it here, but we will do it in the paint
128 function to avoid flicker */
132 /* FIXME: What do we need to do? */
136 /* FIXME: What do we need to do? */
140 PROGRESS_Paint(wndPtr, wParam);
145 UNKNOWN_PARAM(PBM_DELTAPOS, wParam, lParam);
146 temp = infoPtr->CurVal;
148 infoPtr->CurVal += (UINT16)wParam;
149 PROGRESS_CoercePos(wndPtr);
150 PROGRESS_Paint(wndPtr, 0);
156 UNKNOWN_PARAM(PBM_SETPOS, wParam, lParam);
157 temp = infoPtr->CurVal;
159 infoPtr->CurVal = (UINT16)wParam;
160 PROGRESS_CoercePos(wndPtr);
161 PROGRESS_Paint(wndPtr, 0);
167 UNKNOWN_PARAM(PBM_SETRANGE, wParam, lParam);
168 temp = MAKELONG(infoPtr->MinVal, infoPtr->MaxVal);
170 infoPtr->MinVal = LOWORD(lParam);
171 infoPtr->MaxVal = HIWORD(lParam);
172 if(infoPtr->MaxVal <= infoPtr->MinVal)
173 infoPtr->MaxVal = infoPtr->MinVal+1;
174 PROGRESS_CoercePos(wndPtr);
175 PROGRESS_Paint(wndPtr, 0);
181 UNKNOWN_PARAM(PBM_SETSTEP, wParam, lParam);
182 temp = infoPtr->Step;
183 infoPtr->Step = (UINT16)wParam;
187 if (wParam || lParam)
188 UNKNOWN_PARAM(PBM_STEPIT, wParam, lParam);
189 temp = infoPtr->CurVal;
190 infoPtr->CurVal += infoPtr->Step;
191 if(infoPtr->CurVal > infoPtr->MaxVal)
192 infoPtr->CurVal = infoPtr->MinVal;
193 if(temp != infoPtr->CurVal)
194 PROGRESS_Paint(wndPtr, 0);
198 if (message >= WM_USER)
199 fprintf( stderr, "Progress Ctrl: unknown msg %04x wp=%04x lp=%08lx\n",
200 message, wParam, lParam );
201 return DefWindowProc32A( hwnd, message, wParam, lParam );