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
15 #include "sysmetrics.h"
22 /* Control configuration constants */
29 #define UNKNOWN_PARAM(msg, wParam, lParam) WARN(progress, \
30 "Unknown parameter(s) for message " #msg \
31 "(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam);
33 #define PROGRESS_GetInfoPtr(wndPtr) ((PROGRESS_INFO *)wndPtr->wExtra)
36 /***********************************************************************
38 * Draw the arrows. The background need not be erased.
39 * If dc!=0, it draws on it
41 static void PROGRESS_Paint(WND
*wndPtr
, HDC32 dc
)
43 PROGRESS_INFO
*infoPtr
= PROGRESS_GetInfoPtr(wndPtr
);
45 int rightBar
, rightMost
;
50 TRACE(progress
, "paint pos=%d min=%d, max=%d\n",
51 infoPtr
->CurVal
, infoPtr
->MinVal
, infoPtr
->MaxVal
);
54 hdc
= dc
==0 ? BeginPaint32(wndPtr
->hwndSelf
, &ps
) : dc
;
56 /* get the required brush */
57 ledBrush
= GetSysColorBrush32(COLOR_HIGHLIGHT
);
59 /* get rect for the bar, adjusted for the border */
60 GetClientRect32(wndPtr
->hwndSelf
, &rect
);
63 DrawEdge32(hdc
, &rect
, BDR_SUNKENOUTER
, BF_RECT
|BF_ADJUST
|BF_MIDDLE
);
64 rect
.left
++; rect
.right
--; rect
.top
++; rect
.bottom
--;
65 rightMost
= rect
.right
;
67 /* compute extent of progress bar */
68 rightBar
= rect
.left
+
69 MulDiv32(infoPtr
->CurVal
-infoPtr
->MinVal
,
70 rect
.right
- rect
.left
,
71 infoPtr
->MaxVal
-infoPtr
->MinVal
);
73 /* now draw the bar */
74 while(rect
.left
< rightBar
) {
75 rect
.right
= rect
.left
+LED_WIDTH
;
76 FillRect32(hdc
, &rect
, ledBrush
);
77 rect
.left
= rect
.right
+LED_GAP
;
82 EndPaint32(wndPtr
->hwndSelf
, &ps
);
85 /***********************************************************************
87 * Makes sure the current position (CUrVal) is within bounds.
89 static void PROGRESS_CoercePos(WND
*wndPtr
)
91 PROGRESS_INFO
*infoPtr
= PROGRESS_GetInfoPtr(wndPtr
);
93 if(infoPtr
->CurVal
< infoPtr
->MinVal
)
94 infoPtr
->CurVal
= infoPtr
->MinVal
;
95 if(infoPtr
->CurVal
> infoPtr
->MaxVal
)
96 infoPtr
->CurVal
= infoPtr
->MaxVal
;
99 /***********************************************************************
102 LRESULT WINAPI
ProgressWindowProc(HWND32 hwnd
, UINT32 message
,
103 WPARAM32 wParam
, LPARAM lParam
)
105 WND
*wndPtr
= WIN_FindWndPtr(hwnd
);
106 PROGRESS_INFO
*infoPtr
= PROGRESS_GetInfoPtr(wndPtr
);
112 /* initialize the info struct */
117 TRACE(updown
, "Progress Ctrl creation, hwnd=%04x\n", hwnd
);
121 TRACE(updown
, "Progress Ctrl destruction, hwnd=%04x\n", hwnd
);
125 /* pretend to erase it here, but we will do it in the paint
126 function to avoid flicker */
130 /* FIXME: What do we need to do? */
134 /* FIXME: What do we need to do? */
138 PROGRESS_Paint(wndPtr
, wParam
);
143 UNKNOWN_PARAM(PBM_DELTAPOS
, wParam
, lParam
);
144 temp
= infoPtr
->CurVal
;
146 infoPtr
->CurVal
+= (UINT16
)wParam
;
147 PROGRESS_CoercePos(wndPtr
);
148 PROGRESS_Paint(wndPtr
, 0);
154 UNKNOWN_PARAM(PBM_SETPOS
, wParam
, lParam
);
155 temp
= infoPtr
->CurVal
;
157 infoPtr
->CurVal
= (UINT16
)wParam
;
158 PROGRESS_CoercePos(wndPtr
);
159 PROGRESS_Paint(wndPtr
, 0);
165 UNKNOWN_PARAM(PBM_SETRANGE
, wParam
, lParam
);
166 temp
= MAKELONG(infoPtr
->MinVal
, infoPtr
->MaxVal
);
168 infoPtr
->MinVal
= LOWORD(lParam
);
169 infoPtr
->MaxVal
= HIWORD(lParam
);
170 if(infoPtr
->MaxVal
<= infoPtr
->MinVal
)
171 infoPtr
->MaxVal
= infoPtr
->MinVal
+1;
172 PROGRESS_CoercePos(wndPtr
);
173 PROGRESS_Paint(wndPtr
, 0);
179 UNKNOWN_PARAM(PBM_SETSTEP
, wParam
, lParam
);
180 temp
= infoPtr
->Step
;
181 infoPtr
->Step
= (UINT16
)wParam
;
185 if (wParam
|| lParam
)
186 UNKNOWN_PARAM(PBM_STEPIT
, wParam
, lParam
);
187 temp
= infoPtr
->CurVal
;
188 infoPtr
->CurVal
+= infoPtr
->Step
;
189 if(infoPtr
->CurVal
> infoPtr
->MaxVal
)
190 infoPtr
->CurVal
= infoPtr
->MinVal
;
191 if(temp
!= infoPtr
->CurVal
)
192 PROGRESS_Paint(wndPtr
, 0);
196 if (message
>= WM_USER
)
197 ERR(progress
, "unknown msg %04x wp=%04x lp=%08lx\n",
198 message
, wParam
, lParam
);
199 return DefWindowProc32A( hwnd
, message
, wParam
, lParam
);