Commit | Line | Data |
---|---|---|
a0d77315 AJ |
1 | /* |
2 | * Trackbar control | |
3 | * | |
cad17ff7 | 4 | * Copyright 1998, 1999 Eric Kohl <ekohl@abo.rhein-zeitung.de> |
638f169b | 5 | * Copyright 1998,1999 Alex Priem <alexp@sci.kun.nl> |
a0d77315 | 6 | * |
a0d77315 AJ |
7 | * |
8 | * TODO: | |
9 | * - Some messages. | |
ba211eeb | 10 | * - handle dragging slider better |
d30dfd24 AJ |
11 | * - better tic handling. |
12 | * - more notifications. | |
638f169b | 13 | * |
a0d77315 AJ |
14 | */ |
15 | ||
d30dfd24 AJ |
16 | /* known bugs: |
17 | ||
3d35e989 | 18 | -TBM_SETRANGEMAX & TBM_SETRANGEMIN should only change the view of the |
d30dfd24 | 19 | trackbar, not the actual amount of tics in the list. |
3d35e989 | 20 | -TBM_GETTIC & TBM_GETTICPOS shouldn't rely on infoPtr->tics being sorted. |
d30dfd24 AJ |
21 | */ |
22 | ||
23 | ||
383da68c | 24 | #include <stdio.h> |
f4d5fefb | 25 | #include <string.h> |
d30dfd24 | 26 | |
3480e4a5 | 27 | #include "winbase.h" |
a0d77315 | 28 | #include "commctrl.h" |
a099a555 | 29 | #include "debugtools.h" |
a0d77315 | 30 | |
383da68c | 31 | DEFAULT_DEBUG_CHANNEL(trackbar); |
b4b9fae6 | 32 | |
70c9e095 AJ |
33 | typedef struct |
34 | { | |
35 | INT nRangeMin; | |
36 | INT nRangeMax; | |
37 | INT nLineSize; | |
38 | INT nPageSize; | |
39 | INT nSelMin; | |
40 | INT nSelMax; | |
41 | INT nPos; | |
42 | UINT uThumbLen; | |
43 | UINT uNumTics; | |
44 | UINT uTicFreq; | |
45 | HWND hwndNotify; | |
46 | HWND hwndToolTip; | |
47 | HWND hwndBuddyLA; | |
48 | HWND hwndBuddyRB; | |
49 | INT fLocation; | |
50 | COLORREF clrBk; | |
51 | INT flags; | |
52 | BOOL bFocus; | |
53 | RECT rcChannel; | |
54 | RECT rcSelection; | |
55 | RECT rcThumb; | |
56 | INT dragPos; | |
57 | LPLONG tics; | |
58 | } TRACKBAR_INFO; | |
59 | ||
60 | /* #define TB_REFRESH_TIMER 1 */ | |
61 | /* #define TB_REFRESH_DELAY 1 */ | |
a0d77315 | 62 | |
cad17ff7 | 63 | #define TRACKBAR_GetInfoPtr(wndPtr) ((TRACKBAR_INFO *)GetWindowLongA (hwnd,0)) |
a0d77315 AJ |
64 | |
65 | ||
d30dfd24 | 66 | /* Used by TRACKBAR_Refresh to find out which parts of the control |
3d35e989 | 67 | need to be recalculated */ |
a0d77315 | 68 | |
3d35e989 LT |
69 | #define TB_THUMBPOSCHANGED 1 |
70 | #define TB_THUMBSIZECHANGED 2 | |
506115b8 | 71 | #define TB_THUMBCHANGED (TB_THUMBPOSCHANGED | TB_THUMBPOSCHANGED) |
3d35e989 LT |
72 | #define TB_SELECTIONCHANGED 4 |
73 | #define TB_DRAG_MODE 16 /* we're dragging the slider */ | |
74 | #define TB_DRAGPOSVALID 32 /* current Position is in dragPos */ | |
75 | #define TB_SHOW_TOOLTIP 64 /* tooltip-style enabled and tooltip on */ | |
a0d77315 | 76 | |
506115b8 | 77 | /* helper defines for TRACKBAR_DrawTic */ |
3d35e989 LT |
78 | #define TIC_LEFTEDGE 0x20 |
79 | #define TIC_RIGHTEDGE 0x40 | |
80 | #define TIC_EDGE (TIC_LEFTEDGE | TIC_RIGHTEDGE) | |
81 | #define TIC_SELECTIONMARKMAX 0x80 | |
82 | #define TIC_SELECTIONMARKMIN 0x100 | |
83 | #define TIC_SELECTIONMARK (TIC_SELECTIONMARKMAX | TIC_SELECTIONMARKMIN) | |
506115b8 | 84 | |
cad17ff7 | 85 | static BOOL TRACKBAR_SendNotify (HWND hwnd, UINT code); |
a0d77315 | 86 | |
26ffb3cd | 87 | static void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr) |
d30dfd24 AJ |
88 | { |
89 | int i,tic,nrTics; | |
a0d77315 | 90 | |
3d35e989 | 91 | if (infoPtr->uTicFreq && infoPtr->nRangeMax >= infoPtr->nRangeMin) |
d30dfd24 | 92 | nrTics=(infoPtr->nRangeMax - infoPtr->nRangeMin)/infoPtr->uTicFreq; |
3d35e989 LT |
93 | else { |
94 | nrTics=0; | |
95 | COMCTL32_Free (infoPtr->tics); | |
96 | infoPtr->tics=NULL; | |
97 | infoPtr->uNumTics=0; | |
98 | return; | |
99 | } | |
d30dfd24 AJ |
100 | |
101 | if (nrTics!=infoPtr->uNumTics) { | |
3d35e989 LT |
102 | infoPtr->tics=COMCTL32_ReAlloc (infoPtr->tics, |
103 | (nrTics+1)*sizeof (DWORD)); | |
d30dfd24 AJ |
104 | infoPtr->uNumTics=nrTics; |
105 | } | |
3d35e989 | 106 | infoPtr->uNumTics=nrTics; |
d30dfd24 AJ |
107 | tic=infoPtr->nRangeMin+infoPtr->uTicFreq; |
108 | for (i=0; i<nrTics; i++,tic+=infoPtr->uTicFreq) | |
3d35e989 | 109 | infoPtr->tics[i]=tic; |
a0d77315 AJ |
110 | } |
111 | ||
112 | ||
ba211eeb AP |
113 | /* converts from physical (mouse) position to logical position |
114 | (in range of trackbar) */ | |
d30dfd24 | 115 | |
1ed4ecff | 116 | static inline DOUBLE |
506115b8 | 117 | TRACKBAR_ConvertPlaceToPosition (TRACKBAR_INFO *infoPtr, int place, |
3d35e989 | 118 | int vertical) |
d30dfd24 | 119 | { |
3d35e989 | 120 | double range,width,pos; |
d30dfd24 AJ |
121 | |
122 | range=infoPtr->nRangeMax - infoPtr->nRangeMin; | |
506115b8 AP |
123 | if (vertical) { |
124 | width=infoPtr->rcChannel.bottom - infoPtr->rcChannel.top; | |
3d35e989 LT |
125 | pos=(range*(place - infoPtr->rcChannel.top)) / width; |
126 | } else { | |
506115b8 | 127 | width=infoPtr->rcChannel.right - infoPtr->rcChannel.left; |
3d35e989 LT |
128 | pos=(range*(place - infoPtr->rcChannel.left)) / width; |
129 | } | |
051cccee | 130 | pos+=infoPtr->nRangeMin; |
3d35e989 LT |
131 | if (pos > infoPtr->nRangeMax) |
132 | pos = infoPtr->nRangeMax; | |
133 | else if (pos < infoPtr->nRangeMin) | |
134 | pos = infoPtr->nRangeMin; | |
135 | ||
a099a555 | 136 | TRACE("%.2f\n",pos); |
ba211eeb | 137 | return pos; |
d30dfd24 AJ |
138 | } |
139 | ||
ba211eeb | 140 | |
a0d77315 | 141 | static VOID |
cad17ff7 | 142 | TRACKBAR_CalcChannel (HWND hwnd, TRACKBAR_INFO *infoPtr) |
a0d77315 | 143 | { |
cad17ff7 | 144 | DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); |
f64a59f2 | 145 | INT cyChannel,offsettop,offsetedge; |
3d35e989 | 146 | RECT lpRect,*channel = & infoPtr->rcChannel; |
d30dfd24 | 147 | |
cad17ff7 | 148 | GetClientRect (hwnd, &lpRect); |
a0d77315 | 149 | |
cad17ff7 | 150 | if (dwStyle & TBS_ENABLESELRANGE) |
f64a59f2 | 151 | cyChannel = ((int)(infoPtr->uThumbLen/4.5)+1)*3; |
a0d77315 | 152 | else |
3d35e989 | 153 | cyChannel = 4; |
a0d77315 | 154 | |
f64a59f2 AS |
155 | offsettop = (int)(infoPtr->uThumbLen/4.5); |
156 | offsetedge = (int)(infoPtr->uThumbLen/4.5) + 3; | |
157 | ||
cad17ff7 | 158 | if (dwStyle & TBS_VERT) { |
f64a59f2 AS |
159 | channel->top = lpRect.top + offsetedge; |
160 | channel->bottom = lpRect.bottom - offsetedge; | |
d30dfd24 | 161 | |
f64a59f2 AS |
162 | if (dwStyle & (TBS_BOTH | TBS_LEFT)) { |
163 | channel->left = lpRect.left + offsettop + 8 ; | |
3d35e989 LT |
164 | channel->right = channel->left + cyChannel; |
165 | } | |
166 | else { /* TBS_RIGHT */ | |
f64a59f2 AS |
167 | channel->left = lpRect.left + offsettop; |
168 | channel->right = channel->left + cyChannel; | |
3d35e989 LT |
169 | } |
170 | } | |
171 | else { | |
f64a59f2 AS |
172 | channel->left = lpRect.left + offsetedge; |
173 | channel->right = lpRect.right - offsetedge; | |
174 | ||
175 | if (dwStyle & (TBS_BOTH|TBS_TOP)) { | |
176 | channel->top = lpRect.top + offsettop + 8 ; | |
177 | channel->bottom = channel->top + cyChannel; | |
3d35e989 LT |
178 | } |
179 | else { /* TBS_BOTTOM */ | |
f64a59f2 AS |
180 | channel->top = lpRect.top + offsettop; |
181 | channel->bottom = channel->top + cyChannel; | |
3d35e989 LT |
182 | } |
183 | } | |
d30dfd24 AJ |
184 | } |
185 | ||
186 | static VOID | |
cad17ff7 | 187 | TRACKBAR_CalcThumb (HWND hwnd, TRACKBAR_INFO *infoPtr) |
d30dfd24 | 188 | { |
3d35e989 | 189 | RECT *thumb; |
f64a59f2 AS |
190 | int range, width, thumbdepth; |
191 | DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); | |
d30dfd24 | 192 | |
3d35e989 LT |
193 | thumb=&infoPtr->rcThumb; |
194 | range=infoPtr->nRangeMax - infoPtr->nRangeMin; | |
f64a59f2 AS |
195 | thumbdepth = ((INT)((FLOAT)infoPtr->uThumbLen / 4.5) * 2) + 2; |
196 | ||
623c0d6f | 197 | if (!range) return; /* FIXME: may this happen? */ |
f64a59f2 AS |
198 | |
199 | if (dwStyle & TBS_VERT) | |
200 | { | |
506115b8 | 201 | width=infoPtr->rcChannel.bottom - infoPtr->rcChannel.top; |
d30dfd24 | 202 | |
f64a59f2 AS |
203 | if (dwStyle & (TBS_BOTH | TBS_LEFT)) |
204 | thumb->left = 10; | |
205 | else | |
206 | thumb-> left =2; | |
207 | thumb->right = thumb -> left + infoPtr->uThumbLen; | |
208 | thumb->top = infoPtr->rcChannel.top + | |
a1c683e9 AS |
209 | (width*(infoPtr->nPos - infoPtr->nRangeMin))/range - |
210 | thumbdepth/2; | |
f64a59f2 AS |
211 | thumb->bottom = thumb->top + thumbdepth; |
212 | } | |
213 | else | |
214 | { | |
506115b8 | 215 | width=infoPtr->rcChannel.right - infoPtr->rcChannel.left; |
f64a59f2 AS |
216 | |
217 | thumb->left = infoPtr->rcChannel.left + | |
a1c683e9 AS |
218 | (width*(infoPtr->nPos - infoPtr->nRangeMin))/range - |
219 | thumbdepth/2; | |
f64a59f2 AS |
220 | thumb->right = thumb->left + thumbdepth; |
221 | if (dwStyle & (TBS_BOTH | TBS_TOP)) | |
222 | thumb->top = 10; | |
223 | else | |
224 | thumb->top = 2; | |
225 | thumb->bottom = thumb -> top + infoPtr->uThumbLen; | |
3d35e989 | 226 | } |
d30dfd24 AJ |
227 | } |
228 | ||
229 | static VOID | |
cad17ff7 | 230 | TRACKBAR_CalcSelection (HWND hwnd, TRACKBAR_INFO *infoPtr) |
d30dfd24 | 231 | { |
3d35e989 LT |
232 | RECT *selection; |
233 | int range, width; | |
d30dfd24 | 234 | |
3d35e989 LT |
235 | selection= & infoPtr->rcSelection; |
236 | range=infoPtr->nRangeMax - infoPtr->nRangeMin; | |
237 | width=infoPtr->rcChannel.right - infoPtr->rcChannel.left; | |
238 | ||
239 | if (range <= 0) | |
240 | SetRectEmpty (selection); | |
241 | else | |
242 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_VERT) { | |
243 | selection->left = infoPtr->rcChannel.left + | |
244 | (width*infoPtr->nSelMin)/range; | |
245 | selection->right = infoPtr->rcChannel.left + | |
246 | (width*infoPtr->nSelMax)/range; | |
247 | selection->top = infoPtr->rcChannel.top + 2; | |
248 | selection->bottom = infoPtr->rcChannel.bottom - 2; | |
249 | } else { | |
250 | selection->top = infoPtr->rcChannel.top + | |
251 | (width*infoPtr->nSelMin)/range; | |
252 | selection->bottom = infoPtr->rcChannel.top + | |
253 | (width*infoPtr->nSelMax)/range; | |
254 | selection->left = infoPtr->rcChannel.left + 2; | |
255 | selection->right = infoPtr->rcChannel.right - 2; | |
256 | } | |
d30dfd24 AJ |
257 | } |
258 | ||
506115b8 AP |
259 | /* Trackbar drawing code. I like my spaghetti done milanese. */ |
260 | ||
261 | /* ticPos is in tic-units, not in pixels */ | |
262 | ||
263 | static VOID | |
a3960292 | 264 | TRACKBAR_DrawHorizTic (TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos, |
3d35e989 | 265 | int flags, COLORREF clrTic) |
506115b8 | 266 | { |
3d35e989 LT |
267 | RECT rcChannel=infoPtr->rcChannel; |
268 | int x,y,width,range,side; | |
506115b8 | 269 | |
3d35e989 LT |
270 | range=infoPtr->nRangeMax - infoPtr->nRangeMin; |
271 | width=rcChannel.right - rcChannel.left; | |
506115b8 | 272 | |
3d35e989 | 273 | if (flags & TBS_TOP) { |
506115b8 AP |
274 | y=rcChannel.top-2; |
275 | side=-1; | |
3d35e989 | 276 | } else { |
506115b8 AP |
277 | y=rcChannel.bottom+2; |
278 | side=1; | |
3d35e989 | 279 | } |
506115b8 | 280 | |
3d35e989 | 281 | if (flags & TIC_SELECTIONMARK) { |
506115b8 | 282 | if (flags & TIC_SELECTIONMARKMIN) |
a1c683e9 | 283 | x=rcChannel.left + (width*(ticPos - infoPtr->nRangeMin))/range - 1; |
506115b8 | 284 | else |
a1c683e9 | 285 | x=rcChannel.left + (width*(ticPos - infoPtr->nRangeMin))/range + 1; |
506115b8 | 286 | |
a3960292 AJ |
287 | SetPixel (hdc, x,y+6*side, clrTic); |
288 | SetPixel (hdc, x,y+7*side, clrTic); | |
506115b8 | 289 | return; |
3d35e989 | 290 | } |
506115b8 | 291 | |
3d35e989 | 292 | if ((ticPos>infoPtr->nRangeMin) && (ticPos<infoPtr->nRangeMax)) { |
a1c683e9 | 293 | x=rcChannel.left + (width*(ticPos - infoPtr->nRangeMin))/range; |
a3960292 AJ |
294 | SetPixel (hdc, x,y+5*side, clrTic); |
295 | SetPixel (hdc, x,y+6*side, clrTic); | |
296 | SetPixel (hdc, x,y+7*side, clrTic); | |
3d35e989 | 297 | } |
506115b8 | 298 | |
3d35e989 | 299 | if (flags & TIC_EDGE) { |
506115b8 | 300 | if (flags & TIC_LEFTEDGE) |
3d35e989 | 301 | x=rcChannel.left; |
506115b8 | 302 | else |
3d35e989 | 303 | x=rcChannel.right; |
506115b8 | 304 | |
a3960292 AJ |
305 | SetPixel (hdc, x,y+5*side, clrTic); |
306 | SetPixel (hdc, x,y+6*side, clrTic); | |
307 | SetPixel (hdc, x,y+7*side, clrTic); | |
308 | SetPixel (hdc, x,y+8*side, clrTic); | |
3d35e989 | 309 | } |
506115b8 AP |
310 | |
311 | } | |
312 | ||
313 | static VOID | |
a3960292 | 314 | TRACKBAR_DrawVertTic (TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos, |
3d35e989 | 315 | int flags, COLORREF clrTic) |
506115b8 | 316 | { |
3d35e989 LT |
317 | RECT rcChannel=infoPtr->rcChannel; |
318 | int x,y,width,range,side; | |
506115b8 | 319 | |
3d35e989 LT |
320 | range=infoPtr->nRangeMax - infoPtr->nRangeMin; |
321 | width=rcChannel.bottom - rcChannel.top; | |
506115b8 | 322 | |
3d35e989 | 323 | if (flags & TBS_TOP) { |
f64a59f2 | 324 | x=rcChannel.left-2; |
506115b8 | 325 | side=-1; |
3d35e989 | 326 | } else { |
f64a59f2 | 327 | x=rcChannel.right+2; |
506115b8 | 328 | side=1; |
3d35e989 | 329 | } |
506115b8 AP |
330 | |
331 | ||
3d35e989 | 332 | if (flags & TIC_SELECTIONMARK) { |
506115b8 | 333 | if (flags & TIC_SELECTIONMARKMIN) |
a1c683e9 | 334 | y=rcChannel.top + (width*(ticPos - infoPtr->nRangeMin))/range - 1; |
506115b8 | 335 | else |
a1c683e9 | 336 | y=rcChannel.top + (width*(ticPos - infoPtr->nRangeMin))/range + 1; |
506115b8 | 337 | |
a3960292 AJ |
338 | SetPixel (hdc, x+6*side, y, clrTic); |
339 | SetPixel (hdc, x+7*side, y, clrTic); | |
506115b8 | 340 | return; |
3d35e989 | 341 | } |
506115b8 | 342 | |
3d35e989 | 343 | if ((ticPos>infoPtr->nRangeMin) && (ticPos<infoPtr->nRangeMax)) { |
a1c683e9 | 344 | y=rcChannel.top + (width*(ticPos - infoPtr->nRangeMin))/range; |
a3960292 AJ |
345 | SetPixel (hdc, x+5*side, y, clrTic); |
346 | SetPixel (hdc, x+6*side, y, clrTic); | |
347 | SetPixel (hdc, x+7*side, y, clrTic); | |
3d35e989 | 348 | } |
506115b8 | 349 | |
3d35e989 | 350 | if (flags & TIC_EDGE) { |
506115b8 | 351 | if (flags & TIC_LEFTEDGE) |
3d35e989 | 352 | y=rcChannel.top; |
506115b8 | 353 | else |
3d35e989 | 354 | y=rcChannel.bottom; |
506115b8 | 355 | |
a3960292 AJ |
356 | SetPixel (hdc, x+5*side, y, clrTic); |
357 | SetPixel (hdc, x+6*side, y, clrTic); | |
358 | SetPixel (hdc, x+7*side, y, clrTic); | |
359 | SetPixel (hdc, x+8*side, y, clrTic); | |
3d35e989 | 360 | } |
506115b8 AP |
361 | |
362 | } | |
363 | ||
364 | ||
365 | static VOID | |
a3960292 | 366 | TRACKBAR_DrawTics (TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos, |
3d35e989 | 367 | int flags, COLORREF clrTic) |
506115b8 AP |
368 | { |
369 | ||
3d35e989 LT |
370 | if (flags & TBS_VERT) { |
371 | if ((flags & TBS_TOP) || (flags & TBS_BOTH)) | |
372 | TRACKBAR_DrawVertTic (infoPtr, hdc, ticPos, | |
373 | flags | TBS_TOP , clrTic); | |
374 | if (!(flags & TBS_TOP) || (flags & TBS_BOTH)) | |
375 | TRACKBAR_DrawVertTic (infoPtr, hdc, ticPos, flags, clrTic); | |
376 | return; | |
377 | } | |
506115b8 | 378 | |
3d35e989 LT |
379 | if ((flags & TBS_TOP) || (flags & TBS_BOTH)) |
380 | TRACKBAR_DrawHorizTic (infoPtr, hdc, ticPos, flags | TBS_TOP , clrTic); | |
506115b8 | 381 | |
3d35e989 LT |
382 | if (!(flags & TBS_TOP) || (flags & TBS_BOTH)) |
383 | TRACKBAR_DrawHorizTic (infoPtr, hdc, ticPos, flags, clrTic); | |
506115b8 AP |
384 | |
385 | } | |
386 | ||
f64a59f2 AS |
387 | static VOID |
388 | TRACKBAR_DrawThumb(TRACKBAR_INFO *infoPtr, HDC hdc, DWORD dwStyle) | |
389 | { | |
390 | HBRUSH oldbr,hbr = GetSysColorBrush(COLOR_BTNFACE); | |
391 | HPEN oldpen=(HPEN)NULL,hpn; | |
392 | RECT thumb = infoPtr->rcThumb; | |
393 | int BlackUntil=3; | |
394 | int PointCount=6; | |
395 | POINT points[6]; | |
396 | ||
397 | static INT PointDepth = 4; | |
398 | ||
399 | oldbr = SelectObject (hdc, hbr); | |
400 | SetPolyFillMode (hdc,WINDING); | |
401 | ||
402 | if (dwStyle & TBS_BOTH) | |
403 | { | |
404 | points[0].x=thumb.right; | |
405 | points[0].y=thumb.top; | |
406 | points[1].x=thumb.right; | |
407 | points[1].y=thumb.bottom; | |
408 | points[2].x=thumb.left; | |
409 | points[2].y=thumb.bottom; | |
410 | points[3].x=thumb.left; | |
411 | points[3].y=thumb.top; | |
412 | points[4].x=points[0].x; | |
413 | points[4].y=points[0].y; | |
414 | PointCount = 5; | |
415 | BlackUntil = 3; | |
416 | } | |
417 | else | |
418 | { | |
419 | if (dwStyle & TBS_VERT) | |
420 | { | |
421 | if (dwStyle & TBS_LEFT) | |
422 | { | |
423 | points[0].x=thumb.right; | |
424 | points[0].y=thumb.top; | |
425 | points[1].x=thumb.right; | |
426 | points[1].y=thumb.bottom; | |
427 | points[2].x=thumb.left + PointDepth; | |
428 | points[2].y=thumb.bottom; | |
429 | points[3].x=thumb.left; | |
430 | points[3].y=(thumb.bottom - thumb.top) / 2 + thumb.top; | |
431 | points[4].x=thumb.left + PointDepth; | |
432 | points[4].y=thumb.top; | |
433 | points[5].x=points[0].x; | |
434 | points[5].y=points[0].y; | |
435 | BlackUntil = 4; | |
436 | } | |
437 | else | |
438 | { | |
439 | points[0].x=thumb.right; | |
440 | points[0].y=(thumb.bottom - thumb.top) / 2 + thumb.top; | |
441 | points[1].x=thumb.right - PointDepth; | |
442 | points[1].y=thumb.bottom; | |
443 | points[2].x=thumb.left; | |
444 | points[2].y=thumb.bottom; | |
445 | points[3].x=thumb.left; | |
446 | points[3].y=thumb.top; | |
447 | points[4].x=thumb.right - PointDepth; | |
448 | points[4].y=thumb.top; | |
449 | points[5].x=points[0].x; | |
450 | points[5].y=points[0].y; | |
451 | } | |
452 | } | |
453 | else | |
454 | { | |
455 | if (dwStyle & TBS_TOP) | |
456 | { | |
457 | points[0].x=(thumb.right - thumb.left) / 2 + thumb.left ; | |
458 | points[0].y=thumb.top; | |
459 | points[1].x=thumb.right; | |
460 | points[1].y=thumb.top + PointDepth; | |
461 | points[2].x=thumb.right; | |
462 | points[2].y=thumb.bottom; | |
463 | points[3].x=thumb.left; | |
464 | points[3].y=thumb.bottom; | |
465 | points[4].x=thumb.left; | |
466 | points[4].y=thumb.top + PointDepth; | |
467 | points[5].x=points[0].x; | |
468 | points[5].y=points[0].y; | |
469 | BlackUntil = 4; | |
470 | } | |
471 | else | |
472 | { | |
473 | points[0].x=thumb.right; | |
474 | points[0].y=thumb.top; | |
475 | points[1].x=thumb.right; | |
476 | points[1].y=thumb.bottom - PointDepth; | |
477 | points[2].x=(thumb.right - thumb.left) / 2 + thumb.left ; | |
478 | points[2].y=thumb.bottom; | |
479 | points[3].x=thumb.left; | |
480 | points[3].y=thumb.bottom - PointDepth; | |
481 | points[4].x=thumb.left; | |
482 | points[4].y=thumb.top; | |
483 | points[5].x=points[0].x; | |
484 | points[5].y=points[0].y; | |
485 | } | |
486 | } | |
487 | ||
488 | } | |
489 | ||
490 | /* | |
491 | * Fill the shape | |
492 | */ | |
493 | Polygon (hdc, points, PointCount); | |
494 | ||
495 | /* | |
496 | * Draw the edge | |
497 | */ | |
498 | hpn = GetStockObject(BLACK_PEN); | |
499 | oldpen = SelectObject(hdc,hpn); | |
500 | ||
501 | /* | |
502 | * Black part | |
503 | */ | |
504 | Polyline(hdc,points,BlackUntil); | |
505 | ||
506 | SelectObject(hdc,oldpen); | |
507 | hpn = GetStockObject(WHITE_PEN); | |
508 | SelectObject(hdc,hpn); | |
509 | ||
510 | /* | |
511 | * White Part | |
512 | */ | |
513 | Polyline(hdc,&points[BlackUntil-1],PointCount+1-BlackUntil); | |
514 | ||
515 | /* | |
516 | * restore the brush and pen | |
517 | */ | |
518 | SelectObject(hdc,oldbr); | |
519 | if (oldpen) | |
520 | SelectObject(hdc,oldpen); | |
521 | } | |
506115b8 | 522 | |
d30dfd24 | 523 | static VOID |
cad17ff7 | 524 | TRACKBAR_Refresh (HWND hwnd, HDC hdc) |
d30dfd24 | 525 | { |
3d35e989 LT |
526 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
527 | DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); | |
528 | RECT rcClient, rcChannel, rcSelection; | |
c5af7969 | 529 | HBRUSH hBrush; |
3d35e989 | 530 | int i; |
d30dfd24 | 531 | |
cad17ff7 | 532 | GetClientRect (hwnd, &rcClient); |
3d35e989 LT |
533 | hBrush = CreateSolidBrush (infoPtr->clrBk); |
534 | FillRect (hdc, &rcClient, hBrush); | |
a3960292 | 535 | DeleteObject (hBrush); |
d30dfd24 | 536 | |
3d35e989 LT |
537 | if (infoPtr->flags & TB_DRAGPOSVALID) { |
538 | infoPtr->nPos=infoPtr->dragPos; | |
539 | infoPtr->flags |= TB_THUMBPOSCHANGED; | |
506115b8 | 540 | } |
d30dfd24 | 541 | |
3d35e989 LT |
542 | if (infoPtr->flags & TB_THUMBCHANGED) { |
543 | TRACKBAR_CalcThumb (hwnd, infoPtr); | |
544 | if (infoPtr->flags & TB_THUMBSIZECHANGED) | |
545 | TRACKBAR_CalcChannel (hwnd, infoPtr); | |
546 | } | |
547 | if (infoPtr->flags & TB_SELECTIONCHANGED) | |
548 | TRACKBAR_CalcSelection (hwnd, infoPtr); | |
549 | infoPtr->flags &= ~ (TB_THUMBCHANGED | TB_SELECTIONCHANGED | | |
550 | TB_DRAGPOSVALID); | |
d30dfd24 AJ |
551 | |
552 | /* draw channel */ | |
553 | ||
554 | rcChannel = infoPtr->rcChannel; | |
555 | rcSelection= infoPtr->rcSelection; | |
a3960292 | 556 | DrawEdge (hdc, &rcChannel, EDGE_SUNKEN, BF_RECT | BF_ADJUST); |
d30dfd24 | 557 | |
cad17ff7 | 558 | if (dwStyle & TBS_ENABLESELRANGE) { /* fill the channel */ |
3d35e989 LT |
559 | HBRUSH hbr = CreateSolidBrush (RGB(255,255,255)); |
560 | FillRect (hdc, &rcChannel, hbr); | |
561 | if (((dwStyle & TBS_VERT) && | |
562 | (rcSelection.left!=rcSelection.right)) || | |
563 | ((!(dwStyle & TBS_VERT)) && | |
564 | (rcSelection.left!=rcSelection.right))) { | |
565 | hbr=CreateSolidBrush (COLOR_HIGHLIGHT); | |
566 | FillRect (hdc, &rcSelection, hbr); | |
567 | } | |
568 | DeleteObject (hbr); | |
a0d77315 | 569 | } |
a0d77315 | 570 | |
d30dfd24 AJ |
571 | |
572 | /* draw tics */ | |
573 | ||
cad17ff7 | 574 | if (!(dwStyle & TBS_NOTICKS)) { |
3d35e989 LT |
575 | int ticFlags = dwStyle & 0x0f; |
576 | COLORREF clrTic=GetSysColor (COLOR_3DDKSHADOW); | |
d30dfd24 | 577 | |
506115b8 | 578 | for (i=0; i<infoPtr->uNumTics; i++) |
3d35e989 LT |
579 | TRACKBAR_DrawTics (infoPtr, hdc, infoPtr->tics[i], |
580 | ticFlags, clrTic); | |
506115b8 AP |
581 | |
582 | TRACKBAR_DrawTics (infoPtr, hdc, 0, ticFlags | TIC_LEFTEDGE, clrTic); | |
583 | TRACKBAR_DrawTics (infoPtr, hdc, 0, ticFlags | TIC_RIGHTEDGE, clrTic); | |
584 | ||
3d35e989 LT |
585 | if ((dwStyle & TBS_ENABLESELRANGE) && |
586 | (rcSelection.left!=rcSelection.right)) { | |
587 | TRACKBAR_DrawTics (infoPtr, hdc, infoPtr->nSelMin, | |
588 | ticFlags | TIC_SELECTIONMARKMIN, clrTic); | |
589 | TRACKBAR_DrawTics (infoPtr, hdc, infoPtr->nSelMax, | |
590 | ticFlags | TIC_SELECTIONMARKMAX, clrTic); | |
591 | } | |
a0d77315 | 592 | } |
d30dfd24 | 593 | |
3d35e989 | 594 | /* draw thumb */ |
d30dfd24 | 595 | |
f64a59f2 AS |
596 | if (!(dwStyle & TBS_NOTHUMB)) |
597 | { | |
598 | TRACKBAR_DrawThumb(infoPtr,hdc,dwStyle); | |
3d35e989 | 599 | } |
d30dfd24 AJ |
600 | |
601 | if (infoPtr->bFocus) | |
3d35e989 | 602 | DrawFocusRect (hdc, &rcClient); |
a0d77315 AJ |
603 | } |
604 | ||
605 | ||
606 | static VOID | |
cad17ff7 | 607 | TRACKBAR_AlignBuddies (HWND hwnd, TRACKBAR_INFO *infoPtr) |
a0d77315 | 608 | { |
cad17ff7 EK |
609 | DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); |
610 | HWND hwndParent = GetParent (hwnd); | |
a3960292 AJ |
611 | RECT rcSelf, rcBuddy; |
612 | INT x, y; | |
a0d77315 | 613 | |
cad17ff7 | 614 | GetWindowRect (hwnd, &rcSelf); |
a3960292 | 615 | MapWindowPoints (HWND_DESKTOP, hwndParent, (LPPOINT)&rcSelf, 2); |
a0d77315 AJ |
616 | |
617 | /* align buddy left or above */ | |
618 | if (infoPtr->hwndBuddyLA) { | |
a3960292 AJ |
619 | GetWindowRect (infoPtr->hwndBuddyLA, &rcBuddy); |
620 | MapWindowPoints (HWND_DESKTOP, hwndParent, (LPPOINT)&rcBuddy, 2); | |
a0d77315 | 621 | |
cad17ff7 | 622 | if (dwStyle & TBS_VERT) { |
a0d77315 AJ |
623 | x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 - |
624 | (rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left; | |
625 | y = rcSelf.top - (rcBuddy.bottom - rcBuddy.top); | |
626 | } | |
627 | else { | |
628 | x = rcSelf.left - (rcBuddy.right - rcBuddy.left); | |
629 | y = (infoPtr->rcChannel.bottom + infoPtr->rcChannel.top) / 2 - | |
630 | (rcBuddy.bottom - rcBuddy.top) / 2 + rcSelf.top; | |
631 | } | |
632 | ||
a3960292 | 633 | SetWindowPos (infoPtr->hwndBuddyLA, 0, x, y, 0, 0, |
3d35e989 | 634 | SWP_NOZORDER | SWP_NOSIZE); |
a0d77315 AJ |
635 | } |
636 | ||
637 | ||
638 | /* align buddy right or below */ | |
639 | if (infoPtr->hwndBuddyRB) { | |
a3960292 AJ |
640 | GetWindowRect (infoPtr->hwndBuddyRB, &rcBuddy); |
641 | MapWindowPoints (HWND_DESKTOP, hwndParent, (LPPOINT)&rcBuddy, 2); | |
a0d77315 | 642 | |
cad17ff7 | 643 | if (dwStyle & TBS_VERT) { |
a0d77315 AJ |
644 | x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 - |
645 | (rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left; | |
646 | y = rcSelf.bottom; | |
647 | } | |
648 | else { | |
649 | x = rcSelf.right; | |
650 | y = (infoPtr->rcChannel.bottom + infoPtr->rcChannel.top) / 2 - | |
651 | (rcBuddy.bottom - rcBuddy.top) / 2 + rcSelf.top; | |
652 | } | |
a3960292 | 653 | SetWindowPos (infoPtr->hwndBuddyRB, 0, x, y, 0, 0, |
3d35e989 | 654 | SWP_NOZORDER | SWP_NOSIZE); |
a0d77315 AJ |
655 | } |
656 | } | |
657 | ||
658 | ||
659 | static LRESULT | |
cad17ff7 | 660 | TRACKBAR_ClearSel (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 661 | { |
cad17ff7 | 662 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
663 | |
664 | infoPtr->nSelMin = 0; | |
665 | infoPtr->nSelMax = 0; | |
3d35e989 | 666 | infoPtr->flags |= TB_SELECTIONCHANGED; |
a0d77315 | 667 | |
3d35e989 LT |
668 | if ((BOOL)wParam) |
669 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
670 | |
671 | return 0; | |
672 | } | |
673 | ||
674 | ||
675 | static LRESULT | |
cad17ff7 | 676 | TRACKBAR_ClearTics (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 677 | { |
cad17ff7 | 678 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
679 | |
680 | if (infoPtr->tics) { | |
3d35e989 LT |
681 | COMCTL32_Free (infoPtr->tics); |
682 | infoPtr->tics = NULL; | |
683 | infoPtr->uNumTics = 0; | |
a0d77315 AJ |
684 | } |
685 | ||
3d35e989 LT |
686 | if (wParam) |
687 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
688 | |
689 | return 0; | |
690 | } | |
691 | ||
692 | ||
693 | static LRESULT | |
cad17ff7 | 694 | TRACKBAR_GetBuddy (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 695 | { |
cad17ff7 | 696 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 697 | |
3d35e989 LT |
698 | if (wParam) /* buddy is left or above */ |
699 | return (LRESULT)infoPtr->hwndBuddyLA; | |
a0d77315 AJ |
700 | |
701 | /* buddy is right or below */ | |
702 | return (LRESULT) infoPtr->hwndBuddyRB; | |
703 | } | |
704 | ||
705 | ||
706 | static LRESULT | |
cad17ff7 | 707 | TRACKBAR_GetChannelRect (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 708 | { |
cad17ff7 | 709 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 710 | LPRECT lprc = (LPRECT)lParam; |
a0d77315 AJ |
711 | |
712 | if (lprc == NULL) | |
3d35e989 | 713 | return 0; |
a0d77315 AJ |
714 | |
715 | lprc->left = infoPtr->rcChannel.left; | |
716 | lprc->right = infoPtr->rcChannel.right; | |
717 | lprc->bottom = infoPtr->rcChannel.bottom; | |
718 | lprc->top = infoPtr->rcChannel.top; | |
719 | ||
720 | return 0; | |
721 | } | |
722 | ||
723 | ||
724 | static LRESULT | |
cad17ff7 | 725 | TRACKBAR_GetLineSize (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 726 | { |
cad17ff7 | 727 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
728 | |
729 | return infoPtr->nLineSize; | |
730 | } | |
731 | ||
732 | ||
733 | static LRESULT | |
cad17ff7 | 734 | TRACKBAR_GetNumTics (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 735 | { |
cad17ff7 | 736 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 737 | |
cad17ff7 | 738 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_NOTICKS) |
3d35e989 | 739 | return 0; |
a0d77315 | 740 | |
d30dfd24 | 741 | return infoPtr->uNumTics+2; |
a0d77315 AJ |
742 | } |
743 | ||
744 | ||
745 | static LRESULT | |
cad17ff7 | 746 | TRACKBAR_GetPageSize (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 747 | { |
cad17ff7 | 748 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
749 | |
750 | return infoPtr->nPageSize; | |
751 | } | |
752 | ||
753 | ||
754 | static LRESULT | |
cad17ff7 | 755 | TRACKBAR_GetPos (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 756 | { |
cad17ff7 | 757 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
758 | |
759 | return infoPtr->nPos; | |
760 | } | |
761 | ||
762 | ||
a0d77315 | 763 | static LRESULT |
cad17ff7 | 764 | TRACKBAR_GetRangeMax (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 765 | { |
cad17ff7 | 766 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
767 | |
768 | return infoPtr->nRangeMax; | |
769 | } | |
770 | ||
771 | ||
772 | static LRESULT | |
cad17ff7 | 773 | TRACKBAR_GetRangeMin (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 774 | { |
cad17ff7 | 775 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
776 | |
777 | return infoPtr->nRangeMin; | |
778 | } | |
779 | ||
780 | ||
781 | static LRESULT | |
cad17ff7 | 782 | TRACKBAR_GetSelEnd (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 783 | { |
cad17ff7 | 784 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
785 | |
786 | return infoPtr->nSelMax; | |
787 | } | |
788 | ||
789 | ||
790 | static LRESULT | |
cad17ff7 | 791 | TRACKBAR_GetSelStart (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 792 | { |
cad17ff7 | 793 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
794 | |
795 | return infoPtr->nSelMin; | |
796 | } | |
797 | ||
798 | ||
799 | static LRESULT | |
cad17ff7 | 800 | TRACKBAR_GetThumbLength (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 801 | { |
cad17ff7 | 802 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 AJ |
803 | |
804 | return infoPtr->uThumbLen; | |
805 | } | |
806 | ||
d30dfd24 | 807 | static LRESULT |
cad17ff7 | 808 | TRACKBAR_GetPTics (HWND hwnd) |
d30dfd24 | 809 | { |
cad17ff7 | 810 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
d30dfd24 | 811 | |
3d35e989 | 812 | return (LRESULT) infoPtr->tics; |
d30dfd24 AJ |
813 | } |
814 | ||
815 | static LRESULT | |
cad17ff7 | 816 | TRACKBAR_GetThumbRect (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 817 | { |
cad17ff7 | 818 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 819 | LPRECT lprc = (LPRECT)lParam; |
d30dfd24 AJ |
820 | |
821 | if (lprc == NULL) | |
3d35e989 | 822 | return 0; |
d30dfd24 AJ |
823 | |
824 | lprc->left = infoPtr->rcThumb.left; | |
825 | lprc->right = infoPtr->rcThumb.right; | |
826 | lprc->bottom = infoPtr->rcThumb.bottom; | |
827 | lprc->top = infoPtr->rcThumb.top; | |
828 | ||
829 | return 0; | |
830 | } | |
831 | ||
a0d77315 | 832 | |
d30dfd24 | 833 | static LRESULT |
cad17ff7 | 834 | TRACKBAR_GetTic (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 835 | { |
3d35e989 LT |
836 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
837 | INT iTic; | |
d30dfd24 | 838 | |
3d35e989 LT |
839 | iTic=(INT) wParam; |
840 | if ((iTic<0) || (iTic>infoPtr->uNumTics)) | |
d30dfd24 AJ |
841 | return -1; |
842 | ||
3d35e989 | 843 | return (LRESULT) infoPtr->tics[iTic]; |
d30dfd24 AJ |
844 | |
845 | } | |
846 | ||
847 | ||
848 | static LRESULT | |
cad17ff7 | 849 | TRACKBAR_GetTicPos (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 850 | { |
3d35e989 LT |
851 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
852 | INT iTic, range, width, pos; | |
d30dfd24 AJ |
853 | |
854 | ||
3d35e989 LT |
855 | iTic=(INT ) wParam; |
856 | if ((iTic<0) || (iTic>infoPtr->uNumTics)) | |
d30dfd24 AJ |
857 | return -1; |
858 | ||
3d35e989 LT |
859 | range=infoPtr->nRangeMax - infoPtr->nRangeMin; |
860 | width=infoPtr->rcChannel.right - infoPtr->rcChannel.left; | |
861 | pos=infoPtr->rcChannel.left + (width * infoPtr->tics[iTic]) / range; | |
d30dfd24 AJ |
862 | |
863 | ||
3d35e989 | 864 | return (LRESULT) pos; |
d30dfd24 AJ |
865 | } |
866 | ||
3d35e989 | 867 | |
a0d77315 | 868 | static LRESULT |
cad17ff7 | 869 | TRACKBAR_GetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 870 | { |
cad17ff7 | 871 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 872 | |
cad17ff7 | 873 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_TOOLTIPS) |
3d35e989 | 874 | return (LRESULT)infoPtr->hwndToolTip; |
a0d77315 AJ |
875 | return 0; |
876 | } | |
877 | ||
878 | ||
73458b03 | 879 | /* case TBM_GETUNICODEFORMAT: */ |
a0d77315 AJ |
880 | |
881 | ||
882 | static LRESULT | |
cad17ff7 | 883 | TRACKBAR_SetBuddy (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 884 | { |
cad17ff7 | 885 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 886 | HWND hwndTemp; |
a0d77315 AJ |
887 | |
888 | if (wParam) { | |
889 | /* buddy is left or above */ | |
890 | hwndTemp = infoPtr->hwndBuddyLA; | |
a3960292 | 891 | infoPtr->hwndBuddyLA = (HWND)lParam; |
a0d77315 | 892 | |
a099a555 | 893 | FIXME("move buddy!\n"); |
a0d77315 AJ |
894 | } |
895 | else { | |
3d35e989 LT |
896 | /* buddy is right or below */ |
897 | hwndTemp = infoPtr->hwndBuddyRB; | |
898 | infoPtr->hwndBuddyRB = (HWND)lParam; | |
a0d77315 | 899 | |
a099a555 | 900 | FIXME("move buddy!\n"); |
a0d77315 AJ |
901 | } |
902 | ||
cad17ff7 | 903 | TRACKBAR_AlignBuddies (hwnd, infoPtr); |
a0d77315 AJ |
904 | |
905 | return (LRESULT)hwndTemp; | |
906 | } | |
907 | ||
908 | ||
909 | static LRESULT | |
cad17ff7 | 910 | TRACKBAR_SetLineSize (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 911 | { |
cad17ff7 | 912 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 913 | INT nTemp = infoPtr->nLineSize; |
a0d77315 | 914 | |
a3960292 | 915 | infoPtr->nLineSize = (INT)lParam; |
a0d77315 AJ |
916 | |
917 | return nTemp; | |
918 | } | |
919 | ||
920 | ||
921 | static LRESULT | |
cad17ff7 | 922 | TRACKBAR_SetPageSize (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 923 | { |
cad17ff7 | 924 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 925 | INT nTemp = infoPtr->nPageSize; |
a0d77315 | 926 | |
a3960292 | 927 | infoPtr->nPageSize = (INT)lParam; |
a0d77315 AJ |
928 | |
929 | return nTemp; | |
930 | } | |
931 | ||
932 | ||
933 | static LRESULT | |
cad17ff7 | 934 | TRACKBAR_SetPos (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 935 | { |
cad17ff7 | 936 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 937 | |
051cccee | 938 | infoPtr->nPos = (INT)lParam; |
a0d77315 AJ |
939 | |
940 | if (infoPtr->nPos < infoPtr->nRangeMin) | |
941 | infoPtr->nPos = infoPtr->nRangeMin; | |
942 | ||
943 | if (infoPtr->nPos > infoPtr->nRangeMax) | |
944 | infoPtr->nPos = infoPtr->nRangeMax; | |
3d35e989 | 945 | infoPtr->flags |= TB_THUMBPOSCHANGED; |
a0d77315 | 946 | |
3d35e989 LT |
947 | if (wParam) |
948 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
949 | |
950 | return 0; | |
951 | } | |
952 | ||
953 | ||
954 | static LRESULT | |
cad17ff7 | 955 | TRACKBAR_SetRange (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 956 | { |
cad17ff7 | 957 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 AJ |
958 | infoPtr->nRangeMin = (INT)LOWORD(lParam); |
959 | infoPtr->nRangeMax = (INT)HIWORD(lParam); | |
a0d77315 | 960 | |
d30dfd24 | 961 | if (infoPtr->nPos < infoPtr->nRangeMin) { |
3d35e989 LT |
962 | infoPtr->nPos = infoPtr->nRangeMin; |
963 | infoPtr->flags |=TB_THUMBPOSCHANGED; | |
964 | } | |
a0d77315 | 965 | |
d30dfd24 | 966 | if (infoPtr->nPos > infoPtr->nRangeMax) { |
3d35e989 LT |
967 | infoPtr->nPos = infoPtr->nRangeMax; |
968 | infoPtr->flags |=TB_THUMBPOSCHANGED; | |
969 | } | |
d30dfd24 | 970 | |
3d35e989 LT |
971 | infoPtr->nPageSize=(infoPtr->nRangeMax - infoPtr->nRangeMin)/5; |
972 | if (infoPtr->nPageSize == 0) | |
973 | infoPtr->nPageSize = 1; | |
974 | TRACKBAR_RecalculateTics (infoPtr); | |
a0d77315 | 975 | |
3d35e989 LT |
976 | if (wParam) |
977 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
978 | |
979 | return 0; | |
980 | } | |
981 | ||
982 | ||
983 | static LRESULT | |
cad17ff7 | 984 | TRACKBAR_SetRangeMax (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 985 | { |
cad17ff7 | 986 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 987 | |
a3960292 | 988 | infoPtr->nRangeMax = (INT)lParam; |
d30dfd24 | 989 | if (infoPtr->nPos > infoPtr->nRangeMax) { |
3d35e989 LT |
990 | infoPtr->nPos = infoPtr->nRangeMax; |
991 | infoPtr->flags |=TB_THUMBPOSCHANGED; | |
992 | } | |
d30dfd24 | 993 | |
3d35e989 LT |
994 | infoPtr->nPageSize=(infoPtr->nRangeMax - infoPtr->nRangeMin)/5; |
995 | if (infoPtr->nPageSize == 0) | |
996 | infoPtr->nPageSize = 1; | |
997 | TRACKBAR_RecalculateTics (infoPtr); | |
a0d77315 | 998 | |
3d35e989 LT |
999 | if (wParam) |
1000 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
1001 | |
1002 | return 0; | |
1003 | } | |
1004 | ||
1005 | ||
1006 | static LRESULT | |
cad17ff7 | 1007 | TRACKBAR_SetRangeMin (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1008 | { |
cad17ff7 | 1009 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1010 | |
a3960292 | 1011 | infoPtr->nRangeMin = (INT)lParam; |
d30dfd24 | 1012 | if (infoPtr->nPos < infoPtr->nRangeMin) { |
3d35e989 LT |
1013 | infoPtr->nPos = infoPtr->nRangeMin; |
1014 | infoPtr->flags |=TB_THUMBPOSCHANGED; | |
1015 | } | |
d30dfd24 | 1016 | |
3d35e989 LT |
1017 | infoPtr->nPageSize=(infoPtr->nRangeMax - infoPtr->nRangeMin)/5; |
1018 | if (infoPtr->nPageSize == 0) | |
1019 | infoPtr->nPageSize = 1; | |
1020 | TRACKBAR_RecalculateTics (infoPtr); | |
a0d77315 | 1021 | |
3d35e989 LT |
1022 | if (wParam) |
1023 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
1024 | |
1025 | return 0; | |
1026 | } | |
1027 | ||
3d35e989 | 1028 | |
d30dfd24 | 1029 | static LRESULT |
cad17ff7 | 1030 | TRACKBAR_SetTicFreq (HWND hwnd, WPARAM wParam) |
d30dfd24 | 1031 | { |
cad17ff7 | 1032 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
d30dfd24 | 1033 | |
cad17ff7 | 1034 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_AUTOTICKS) |
3d35e989 | 1035 | infoPtr->uTicFreq=(UINT) wParam; |
d30dfd24 | 1036 | |
3d35e989 | 1037 | TRACKBAR_RecalculateTics (infoPtr); |
d30dfd24 | 1038 | |
3d35e989 | 1039 | InvalidateRect (hwnd, NULL, FALSE); |
cad17ff7 | 1040 | |
3d35e989 | 1041 | return 0; |
d30dfd24 AJ |
1042 | } |
1043 | ||
a0d77315 AJ |
1044 | |
1045 | static LRESULT | |
cad17ff7 | 1046 | TRACKBAR_SetSel (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1047 | { |
cad17ff7 | 1048 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1049 | |
a3960292 AJ |
1050 | infoPtr->nSelMin = (INT)LOWORD(lParam); |
1051 | infoPtr->nSelMax = (INT)HIWORD(lParam); | |
3d35e989 | 1052 | infoPtr->flags |=TB_SELECTIONCHANGED; |
d30dfd24 | 1053 | |
cad17ff7 | 1054 | if (!GetWindowLongA (hwnd, GWL_STYLE) & TBS_ENABLESELRANGE) |
3d35e989 | 1055 | return 0; |
a0d77315 AJ |
1056 | |
1057 | if (infoPtr->nSelMin < infoPtr->nRangeMin) | |
3d35e989 | 1058 | infoPtr->nSelMin = infoPtr->nRangeMin; |
a0d77315 | 1059 | if (infoPtr->nSelMax > infoPtr->nRangeMax) |
3d35e989 LT |
1060 | infoPtr->nSelMax = infoPtr->nRangeMax; |
1061 | ||
1062 | if (wParam) | |
1063 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 | 1064 | |
a0d77315 AJ |
1065 | |
1066 | return 0; | |
1067 | } | |
1068 | ||
1069 | ||
1070 | static LRESULT | |
cad17ff7 | 1071 | TRACKBAR_SetSelEnd (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1072 | { |
cad17ff7 | 1073 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1074 | |
cad17ff7 | 1075 | if (!GetWindowLongA (hwnd, GWL_STYLE) & TBS_ENABLESELRANGE) |
a0d77315 AJ |
1076 | return 0; |
1077 | ||
a3960292 | 1078 | infoPtr->nSelMax = (INT)lParam; |
3d35e989 | 1079 | infoPtr->flags |= TB_SELECTIONCHANGED; |
d30dfd24 | 1080 | |
a0d77315 | 1081 | if (infoPtr->nSelMax > infoPtr->nRangeMax) |
3d35e989 | 1082 | infoPtr->nSelMax = infoPtr->nRangeMax; |
a0d77315 | 1083 | |
3d35e989 LT |
1084 | if (wParam) |
1085 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
1086 | |
1087 | return 0; | |
1088 | } | |
1089 | ||
1090 | ||
1091 | static LRESULT | |
cad17ff7 | 1092 | TRACKBAR_SetSelStart (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1093 | { |
cad17ff7 | 1094 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1095 | |
cad17ff7 | 1096 | if (!GetWindowLongA (hwnd, GWL_STYLE) & TBS_ENABLESELRANGE) |
a0d77315 AJ |
1097 | return 0; |
1098 | ||
a3960292 | 1099 | infoPtr->nSelMin = (INT)lParam; |
3d35e989 | 1100 | infoPtr->flags |=TB_SELECTIONCHANGED; |
cad17ff7 | 1101 | |
a0d77315 | 1102 | if (infoPtr->nSelMin < infoPtr->nRangeMin) |
3d35e989 | 1103 | infoPtr->nSelMin = infoPtr->nRangeMin; |
a0d77315 | 1104 | |
3d35e989 LT |
1105 | if (wParam) |
1106 | InvalidateRect (hwnd, NULL, FALSE); | |
a0d77315 AJ |
1107 | |
1108 | return 0; | |
1109 | } | |
1110 | ||
1111 | ||
1112 | static LRESULT | |
cad17ff7 | 1113 | TRACKBAR_SetThumbLength (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1114 | { |
cad17ff7 | 1115 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1116 | |
cad17ff7 | 1117 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_FIXEDLENGTH) |
3d35e989 | 1118 | infoPtr->uThumbLen = (UINT)wParam; |
a0d77315 | 1119 | |
3d35e989 LT |
1120 | infoPtr->flags |= TB_THUMBSIZECHANGED; |
1121 | ||
1122 | InvalidateRect (hwnd, NULL, FALSE); | |
cad17ff7 | 1123 | |
a0d77315 AJ |
1124 | return 0; |
1125 | } | |
1126 | ||
1127 | ||
1128 | static LRESULT | |
cad17ff7 | 1129 | TRACKBAR_SetTic (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1130 | { |
cad17ff7 | 1131 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 1132 | INT nPos = (INT)lParam; |
d30dfd24 AJ |
1133 | |
1134 | if ((nPos < infoPtr->nRangeMin) || (nPos> infoPtr->nRangeMax)) | |
3d35e989 | 1135 | return FALSE; |
a0d77315 | 1136 | |
3d35e989 | 1137 | infoPtr->uNumTics++; |
506115b8 | 1138 | infoPtr->tics=COMCTL32_ReAlloc( infoPtr->tics, |
3d35e989 | 1139 | (infoPtr->uNumTics)*sizeof (DWORD)); |
d30dfd24 | 1140 | infoPtr->tics[infoPtr->uNumTics-1]=nPos; |
a0d77315 | 1141 | |
3d35e989 | 1142 | InvalidateRect (hwnd, NULL, FALSE); |
a0d77315 AJ |
1143 | |
1144 | return TRUE; | |
1145 | } | |
1146 | ||
1147 | ||
a0d77315 | 1148 | static LRESULT |
cad17ff7 | 1149 | TRACKBAR_SetTipSide (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1150 | { |
cad17ff7 | 1151 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a3960292 | 1152 | INT fTemp = infoPtr->fLocation; |
a0d77315 | 1153 | |
a3960292 | 1154 | infoPtr->fLocation = (INT)wParam; |
d30dfd24 | 1155 | |
a0d77315 AJ |
1156 | return fTemp; |
1157 | } | |
1158 | ||
1159 | ||
1160 | static LRESULT | |
cad17ff7 | 1161 | TRACKBAR_SetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1162 | { |
cad17ff7 | 1163 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1164 | |
a3960292 | 1165 | infoPtr->hwndToolTip = (HWND)wParam; |
a0d77315 AJ |
1166 | |
1167 | return 0; | |
1168 | } | |
1169 | ||
1170 | ||
73458b03 | 1171 | /* case TBM_SETUNICODEFORMAT: */ |
a0d77315 AJ |
1172 | |
1173 | ||
d30dfd24 | 1174 | static LRESULT |
cad17ff7 | 1175 | TRACKBAR_InitializeThumb (HWND hwnd) |
d30dfd24 | 1176 | { |
cad17ff7 | 1177 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
d30dfd24 AJ |
1178 | |
1179 | infoPtr->uThumbLen = 23; /* initial thumb length */ | |
1180 | ||
3d35e989 LT |
1181 | TRACKBAR_CalcChannel (hwnd,infoPtr); |
1182 | TRACKBAR_CalcThumb (hwnd, infoPtr); | |
1183 | infoPtr->flags &= ~TB_SELECTIONCHANGED; | |
d30dfd24 | 1184 | |
3d35e989 | 1185 | return 0; |
d30dfd24 | 1186 | } |
a0d77315 AJ |
1187 | |
1188 | ||
1189 | static LRESULT | |
cad17ff7 | 1190 | TRACKBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 AJ |
1191 | { |
1192 | TRACKBAR_INFO *infoPtr; | |
1193 | ||
506115b8 | 1194 | infoPtr = (TRACKBAR_INFO *)COMCTL32_Alloc (sizeof(TRACKBAR_INFO)); |
cad17ff7 | 1195 | SetWindowLongA (hwnd, 0, (DWORD)infoPtr); |
a0d77315 | 1196 | |
cad17ff7 EK |
1197 | /* set default values */ |
1198 | infoPtr->nRangeMin = 0; | |
a0d77315 AJ |
1199 | infoPtr->nRangeMax = 100; |
1200 | infoPtr->nLineSize = 1; | |
1201 | infoPtr->nPageSize = 20; | |
1202 | infoPtr->nSelMin = 0; | |
1203 | infoPtr->nSelMax = 0; | |
1204 | infoPtr->nPos = 0; | |
a0d77315 | 1205 | |
d30dfd24 | 1206 | infoPtr->uNumTics = 0; /* start and end tic are not included in count*/ |
3d35e989 LT |
1207 | infoPtr->uTicFreq = 1; |
1208 | infoPtr->tics = NULL; | |
c5af7969 | 1209 | infoPtr->clrBk = GetSysColor (COLOR_BTNFACE); |
cad17ff7 | 1210 | infoPtr->hwndNotify = GetParent (hwnd); |
a0d77315 | 1211 | |
cad17ff7 | 1212 | TRACKBAR_InitializeThumb (hwnd); |
506115b8 | 1213 | |
cad17ff7 EK |
1214 | /* Create tooltip control */ |
1215 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_TOOLTIPS) { | |
3d35e989 | 1216 | TTTOOLINFOA ti; |
506115b8 AP |
1217 | |
1218 | infoPtr->hwndToolTip = | |
3d35e989 LT |
1219 | CreateWindowExA (0, TOOLTIPS_CLASSA, NULL, 0, |
1220 | CW_USEDEFAULT, CW_USEDEFAULT, | |
1221 | CW_USEDEFAULT, CW_USEDEFAULT, | |
1222 | hwnd, 0, 0, 0); | |
506115b8 | 1223 | |
3d35e989 | 1224 | /* Send NM_TOOLTIPSCREATED notification */ |
506115b8 | 1225 | if (infoPtr->hwndToolTip) { |
3d35e989 | 1226 | NMTOOLTIPSCREATED nmttc; |
506115b8 | 1227 | |
3d35e989 LT |
1228 | nmttc.hdr.hwndFrom = hwnd; |
1229 | nmttc.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID); | |
1230 | nmttc.hdr.code = NM_TOOLTIPSCREATED; | |
1231 | nmttc.hwndToolTips = infoPtr->hwndToolTip; | |
506115b8 | 1232 | |
3d35e989 LT |
1233 | SendMessageA (GetParent (hwnd), WM_NOTIFY, |
1234 | (WPARAM)nmttc.hdr.idFrom, (LPARAM)&nmttc); | |
506115b8 AP |
1235 | } |
1236 | ||
3d35e989 LT |
1237 | ZeroMemory (&ti, sizeof(TTTOOLINFOA)); |
1238 | ti.cbSize = sizeof(TTTOOLINFOA); | |
506115b8 | 1239 | ti.uFlags = TTF_IDISHWND | TTF_TRACK; |
cad17ff7 | 1240 | ti.hwnd = hwnd; |
506115b8 | 1241 | ti.uId = 0; |
73458b03 | 1242 | ti.lpszText = "Test"; /* LPSTR_TEXTCALLBACK */ |
a3960292 | 1243 | SetRectEmpty (&ti.rect); |
506115b8 | 1244 | |
a3960292 | 1245 | SendMessageA (infoPtr->hwndToolTip, TTM_ADDTOOLA, 0, (LPARAM)&ti); |
3d35e989 | 1246 | } |
cad17ff7 | 1247 | |
a0d77315 AJ |
1248 | return 0; |
1249 | } | |
1250 | ||
1251 | ||
1252 | static LRESULT | |
cad17ff7 | 1253 | TRACKBAR_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1254 | { |
cad17ff7 | 1255 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1256 | |
3d35e989 | 1257 | /* delete tooltip control */ |
506115b8 | 1258 | if (infoPtr->hwndToolTip) |
a3960292 | 1259 | DestroyWindow (infoPtr->hwndToolTip); |
506115b8 AP |
1260 | |
1261 | COMCTL32_Free (infoPtr); | |
a1b2fc2a | 1262 | SetWindowLongA (hwnd, 0, 0); |
a0d77315 AJ |
1263 | return 0; |
1264 | } | |
1265 | ||
1266 | ||
1267 | static LRESULT | |
cad17ff7 | 1268 | TRACKBAR_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1269 | { |
cad17ff7 | 1270 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1271 | |
a099a555 | 1272 | TRACE("\n"); |
ba211eeb | 1273 | |
a0d77315 | 1274 | infoPtr->bFocus = FALSE; |
3d35e989 | 1275 | infoPtr->flags &= ~TB_DRAG_MODE; |
cad17ff7 | 1276 | |
3d35e989 | 1277 | InvalidateRect (hwnd, NULL, FALSE); |
a0d77315 AJ |
1278 | |
1279 | return 0; | |
1280 | } | |
1281 | ||
1282 | ||
1283 | static LRESULT | |
cad17ff7 | 1284 | TRACKBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1285 | { |
cad17ff7 EK |
1286 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
1287 | DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); | |
f64a59f2 | 1288 | POINT clickPoint; |
3d35e989 | 1289 | |
cad17ff7 | 1290 | SetFocus (hwnd); |
a0d77315 | 1291 | |
f64a59f2 AS |
1292 | clickPoint.y = HIWORD(lParam); |
1293 | clickPoint.x = LOWORD(lParam); | |
1294 | ||
1295 | if (PtInRect(&(infoPtr->rcThumb),clickPoint)) | |
1296 | { | |
3d35e989 LT |
1297 | infoPtr->flags |= TB_DRAG_MODE; |
1298 | if (dwStyle & TBS_TOOLTIPS) { /* enable tooltip */ | |
1299 | TTTOOLINFOA ti; | |
1300 | POINT pt; | |
1301 | ||
1302 | GetCursorPos (&pt); | |
1303 | SendMessageA (infoPtr->hwndToolTip, TTM_TRACKPOSITION, 0, | |
1304 | (LPARAM)MAKELPARAM(pt.x, pt.y)); | |
1305 | ||
1306 | ti.cbSize = sizeof(TTTOOLINFOA); | |
1307 | ti.uId = 0; | |
1308 | ti.hwnd = (UINT)hwnd; | |
1309 | ||
1310 | infoPtr->flags |= TB_SHOW_TOOLTIP; | |
1311 | SetCapture (hwnd); | |
1312 | SendMessageA (infoPtr->hwndToolTip, TTM_TRACKACTIVATE, | |
1313 | (WPARAM)TRUE, (LPARAM)&ti); | |
1314 | } | |
1315 | return 0; | |
1316 | } | |
f64a59f2 AS |
1317 | else if (PtInRect(&(infoPtr->rcChannel),clickPoint)) |
1318 | { | |
1319 | int clickPlace,prevPos,vertical; | |
1320 | DOUBLE clickPos; | |
1321 | ||
1322 | vertical = (dwStyle & TBS_VERT) ? 1 : 0; | |
1323 | if (vertical) | |
1324 | clickPlace=(INT)HIWORD(lParam); | |
1325 | else | |
1326 | clickPlace=(INT)LOWORD(lParam); | |
1327 | ||
1328 | clickPos = TRACKBAR_ConvertPlaceToPosition(infoPtr, clickPlace, | |
1329 | vertical); | |
1330 | prevPos = infoPtr->nPos; | |
1331 | if (clickPos > (int)prevPos) | |
1332 | { /* similar to VK_NEXT */ | |
1333 | infoPtr->nPos += infoPtr->nPageSize; | |
1334 | if (infoPtr->nPos > infoPtr->nRangeMax) | |
1335 | infoPtr->nPos = infoPtr->nRangeMax; | |
1336 | TRACKBAR_SendNotify (hwnd, TB_PAGEUP); | |
1337 | } | |
1338 | else | |
1339 | { | |
1340 | infoPtr->nPos -= infoPtr->nPageSize; /* similar to VK_PRIOR */ | |
1341 | if (infoPtr->nPos < infoPtr->nRangeMin) | |
1342 | infoPtr->nPos = infoPtr->nRangeMin; | |
1343 | TRACKBAR_SendNotify (hwnd, TB_PAGEDOWN); | |
1344 | } | |
506115b8 | 1345 | |
f64a59f2 AS |
1346 | if (prevPos!=infoPtr->nPos) { |
1347 | infoPtr->flags |= TB_THUMBPOSCHANGED; | |
1348 | InvalidateRect (hwnd, NULL, FALSE); | |
1349 | } | |
3d35e989 | 1350 | } |
ba211eeb | 1351 | |
d30dfd24 AJ |
1352 | return 0; |
1353 | } | |
1354 | ||
3d35e989 | 1355 | |
d30dfd24 | 1356 | static LRESULT |
cad17ff7 | 1357 | TRACKBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 1358 | { |
cad17ff7 | 1359 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
d30dfd24 | 1360 | |
3d35e989 | 1361 | TRACKBAR_SendNotify (hwnd, TB_ENDTRACK); |
d30dfd24 | 1362 | |
3d35e989 LT |
1363 | if (infoPtr->flags & TB_DRAG_MODE) |
1364 | { | |
1365 | infoPtr->flags &= ~TB_DRAG_MODE; | |
1366 | ReleaseCapture (); | |
1367 | } | |
506115b8 | 1368 | |
cad17ff7 | 1369 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_TOOLTIPS) { /* disable tooltip */ |
a3960292 | 1370 | TTTOOLINFOA ti; |
506115b8 | 1371 | |
a3960292 | 1372 | ti.cbSize = sizeof(TTTOOLINFOA); |
506115b8 | 1373 | ti.uId = 0; |
cad17ff7 | 1374 | ti.hwnd = (UINT)hwnd; |
506115b8 AP |
1375 | |
1376 | infoPtr->flags &= ~TB_SHOW_TOOLTIP; | |
a3960292 | 1377 | SendMessageA (infoPtr->hwndToolTip, TTM_TRACKACTIVATE, |
3d35e989 LT |
1378 | (WPARAM)FALSE, (LPARAM)&ti); |
1379 | } | |
1380 | ||
1381 | InvalidateRect (hwnd, NULL, FALSE); | |
506115b8 | 1382 | |
a0d77315 AJ |
1383 | return 0; |
1384 | } | |
1385 | ||
3d35e989 | 1386 | |
d30dfd24 | 1387 | static LRESULT |
cad17ff7 | 1388 | TRACKBAR_CaptureChanged (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 1389 | { |
cad17ff7 | 1390 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
ba211eeb | 1391 | |
3d35e989 LT |
1392 | if (infoPtr->flags & TB_DRAGPOSVALID) { |
1393 | infoPtr->nPos=infoPtr->dragPos; | |
1394 | InvalidateRect (hwnd, NULL, FALSE); | |
1395 | } | |
506115b8 | 1396 | |
3d35e989 | 1397 | infoPtr->flags &= ~ TB_DRAGPOSVALID; |
d30dfd24 | 1398 | |
3d35e989 LT |
1399 | TRACKBAR_SendNotify (hwnd, TB_ENDTRACK); |
1400 | return 0; | |
d30dfd24 | 1401 | } |
a0d77315 | 1402 | |
3d35e989 | 1403 | |
a0d77315 | 1404 | static LRESULT |
cad17ff7 | 1405 | TRACKBAR_Paint (HWND hwnd, WPARAM wParam) |
a0d77315 | 1406 | { |
a3960292 AJ |
1407 | HDC hdc; |
1408 | PAINTSTRUCT ps; | |
a0d77315 | 1409 | |
cad17ff7 EK |
1410 | hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam; |
1411 | TRACKBAR_Refresh (hwnd, hdc); | |
a0d77315 | 1412 | if(!wParam) |
cad17ff7 | 1413 | EndPaint (hwnd, &ps); |
a0d77315 AJ |
1414 | return 0; |
1415 | } | |
1416 | ||
1417 | ||
1418 | static LRESULT | |
cad17ff7 | 1419 | TRACKBAR_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1420 | { |
cad17ff7 | 1421 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1422 | |
a099a555 | 1423 | TRACE("\n"); |
a0d77315 AJ |
1424 | infoPtr->bFocus = TRUE; |
1425 | ||
3d35e989 | 1426 | InvalidateRect (hwnd, NULL, FALSE); |
a0d77315 AJ |
1427 | |
1428 | return 0; | |
1429 | } | |
1430 | ||
1431 | ||
1432 | static LRESULT | |
cad17ff7 | 1433 | TRACKBAR_Size (HWND hwnd, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1434 | { |
cad17ff7 | 1435 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
a0d77315 | 1436 | |
cad17ff7 EK |
1437 | TRACKBAR_CalcChannel (hwnd, infoPtr); |
1438 | TRACKBAR_AlignBuddies (hwnd, infoPtr); | |
a0d77315 AJ |
1439 | |
1440 | return 0; | |
1441 | } | |
1442 | ||
1443 | ||
a3960292 | 1444 | static BOOL |
cad17ff7 | 1445 | TRACKBAR_SendNotify (HWND hwnd, UINT code) |
d30dfd24 | 1446 | { |
a099a555 | 1447 | TRACE("%x\n",code); |
d30dfd24 | 1448 | |
cad17ff7 EK |
1449 | if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_VERT) |
1450 | return (BOOL) SendMessageA (GetParent (hwnd), | |
3d35e989 | 1451 | WM_VSCROLL, (WPARAM)code, (LPARAM)hwnd); |
cad17ff7 EK |
1452 | |
1453 | return (BOOL) SendMessageA (GetParent (hwnd), | |
3d35e989 | 1454 | WM_HSCROLL, (WPARAM)code, (LPARAM)hwnd); |
d30dfd24 AJ |
1455 | } |
1456 | ||
3d35e989 | 1457 | |
d30dfd24 | 1458 | static LRESULT |
cad17ff7 | 1459 | TRACKBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 1460 | { |
cad17ff7 EK |
1461 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
1462 | DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); | |
3d35e989 LT |
1463 | SHORT clickPlace; |
1464 | DOUBLE dragPos; | |
1465 | char buf[80]; | |
d30dfd24 | 1466 | |
a099a555 | 1467 | TRACE("%x\n",wParam); |
506115b8 | 1468 | |
cad17ff7 | 1469 | if (dwStyle & TBS_VERT) |
3d35e989 LT |
1470 | clickPlace=(SHORT)HIWORD(lParam); |
1471 | else | |
1472 | clickPlace=(SHORT)LOWORD(lParam); | |
506115b8 | 1473 | |
cad17ff7 EK |
1474 | if (!(infoPtr->flags & TB_DRAG_MODE)) |
1475 | return TRUE; | |
ba211eeb | 1476 | |
3d35e989 LT |
1477 | SetCapture (hwnd); |
1478 | dragPos = TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace, | |
1479 | dwStyle & TBS_VERT); | |
1480 | if (dragPos > ((INT)dragPos) + 0.5) | |
1481 | infoPtr->dragPos = dragPos + 1; | |
1482 | else | |
1483 | infoPtr->dragPos = dragPos; | |
1484 | ||
1485 | infoPtr->flags |= TB_DRAGPOSVALID; | |
d37c1bb5 | 1486 | TRACKBAR_SendNotify (hwnd, TB_THUMBTRACK | (infoPtr->nPos<<16)); |
506115b8 AP |
1487 | |
1488 | if (infoPtr->flags & TB_SHOW_TOOLTIP) { | |
3d35e989 | 1489 | POINT pt; |
a3960292 | 1490 | TTTOOLINFOA ti; |
506115b8 | 1491 | |
a3960292 | 1492 | ti.cbSize = sizeof(TTTOOLINFOA); |
cad17ff7 | 1493 | ti.hwnd = hwnd; |
506115b8 | 1494 | ti.uId = 0; |
3d35e989 LT |
1495 | ti.hinst=0; |
1496 | sprintf (buf,"%d",infoPtr->nPos); | |
506115b8 | 1497 | ti.lpszText = (LPSTR) buf; |
3d35e989 | 1498 | GetCursorPos (&pt); |
506115b8 | 1499 | |
cad17ff7 | 1500 | if (dwStyle & TBS_VERT) { |
3d35e989 LT |
1501 | SendMessageA (infoPtr->hwndToolTip, TTM_TRACKPOSITION, |
1502 | 0, (LPARAM)MAKELPARAM(pt.x+5, pt.y+15)); | |
1503 | } else { | |
1504 | SendMessageA (infoPtr->hwndToolTip, TTM_TRACKPOSITION, | |
1505 | 0, (LPARAM)MAKELPARAM(pt.x+15, pt.y+5)); | |
1506 | } | |
a3960292 | 1507 | SendMessageA (infoPtr->hwndToolTip, TTM_UPDATETIPTEXTA, |
3d35e989 LT |
1508 | 0, (LPARAM)&ti); |
1509 | } | |
506115b8 | 1510 | |
3d35e989 LT |
1511 | InvalidateRect (hwnd, NULL, FALSE); |
1512 | UpdateWindow (hwnd); | |
ba211eeb | 1513 | |
3d35e989 | 1514 | return TRUE; |
d30dfd24 AJ |
1515 | } |
1516 | ||
1517 | ||
1518 | static LRESULT | |
cad17ff7 | 1519 | TRACKBAR_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam) |
d30dfd24 | 1520 | { |
cad17ff7 | 1521 | TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd); |
3d35e989 | 1522 | INT pos; |
d30dfd24 | 1523 | |
a099a555 | 1524 | TRACE("%x\n",wParam); |
d30dfd24 | 1525 | |
3d35e989 LT |
1526 | pos=infoPtr->nPos; |
1527 | switch (wParam) { | |
1528 | case VK_LEFT: | |
1529 | case VK_UP: | |
1530 | if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE; | |
1531 | infoPtr->nPos -= infoPtr->nLineSize; | |
1532 | if (infoPtr->nPos < infoPtr->nRangeMin) | |
1533 | infoPtr->nPos = infoPtr->nRangeMin; | |
1534 | TRACKBAR_SendNotify (hwnd, TB_LINEUP); | |
1535 | break; | |
1536 | case VK_RIGHT: | |
1537 | case VK_DOWN: | |
1538 | if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE; | |
1539 | infoPtr->nPos += infoPtr->nLineSize; | |
1540 | if (infoPtr->nPos > infoPtr->nRangeMax) | |
1541 | infoPtr->nPos = infoPtr->nRangeMax; | |
1542 | TRACKBAR_SendNotify (hwnd, TB_LINEDOWN); | |
1543 | break; | |
1544 | case VK_NEXT: | |
1545 | if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE; | |
1546 | infoPtr->nPos += infoPtr->nPageSize; | |
1547 | if (infoPtr->nPos > infoPtr->nRangeMax) | |
1548 | infoPtr->nPos = infoPtr->nRangeMax; | |
1549 | TRACKBAR_SendNotify (hwnd, TB_PAGEUP); | |
1550 | break; | |
1551 | case VK_PRIOR: | |
1552 | if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE; | |
1553 | infoPtr->nPos -= infoPtr->nPageSize; | |
1554 | if (infoPtr->nPos < infoPtr->nRangeMin) | |
1555 | infoPtr->nPos = infoPtr->nRangeMin; | |
1556 | TRACKBAR_SendNotify (hwnd, TB_PAGEDOWN); | |
1557 | break; | |
1558 | case VK_HOME: | |
1559 | if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE; | |
1560 | infoPtr->nPos = infoPtr->nRangeMin; | |
1561 | TRACKBAR_SendNotify (hwnd, TB_TOP); | |
1562 | break; | |
1563 | case VK_END: | |
1564 | if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE; | |
1565 | infoPtr->nPos = infoPtr->nRangeMax; | |
1566 | TRACKBAR_SendNotify (hwnd, TB_BOTTOM); | |
1567 | break; | |
1568 | } | |
d30dfd24 | 1569 | |
3d35e989 | 1570 | if (pos!=infoPtr->nPos) { |
ba211eeb | 1571 | infoPtr->flags |=TB_THUMBPOSCHANGED; |
3d35e989 LT |
1572 | InvalidateRect (hwnd, NULL, FALSE); |
1573 | } | |
d30dfd24 | 1574 | |
3d35e989 | 1575 | return TRUE; |
d30dfd24 AJ |
1576 | } |
1577 | ||
3d35e989 | 1578 | |
d30dfd24 | 1579 | static LRESULT |
cad17ff7 | 1580 | TRACKBAR_KeyUp (HWND hwnd, WPARAM wParam) |
d30dfd24 | 1581 | { |
3d35e989 LT |
1582 | switch (wParam) { |
1583 | case VK_LEFT: | |
1584 | case VK_UP: | |
1585 | case VK_RIGHT: | |
1586 | case VK_DOWN: | |
1587 | case VK_NEXT: | |
1588 | case VK_PRIOR: | |
1589 | case VK_HOME: | |
1590 | case VK_END: | |
1591 | TRACKBAR_SendNotify (hwnd, TB_ENDTRACK); | |
1592 | } | |
1593 | return TRUE; | |
ba211eeb AP |
1594 | } |
1595 | ||
1596 | ||
26ffb3cd | 1597 | static LRESULT WINAPI |
a3960292 | 1598 | TRACKBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
a0d77315 | 1599 | { |
a1b2fc2a GP |
1600 | TRACE("hwnd=%x msg=%x wparam=%x lparam=%lx\n", hwnd, uMsg, wParam, lParam); |
1601 | if (!TRACKBAR_GetInfoPtr (hwnd) && (uMsg != WM_CREATE)) | |
1602 | return DefWindowProcA (hwnd, uMsg, wParam, lParam); | |
a0d77315 AJ |
1603 | switch (uMsg) |
1604 | { | |
3d35e989 LT |
1605 | case TBM_CLEARSEL: |
1606 | return TRACKBAR_ClearSel (hwnd, wParam, lParam); | |
a0d77315 | 1607 | |
3d35e989 LT |
1608 | case TBM_CLEARTICS: |
1609 | return TRACKBAR_ClearTics (hwnd, wParam, lParam); | |
a0d77315 | 1610 | |
3d35e989 LT |
1611 | case TBM_GETBUDDY: |
1612 | return TRACKBAR_GetBuddy (hwnd, wParam, lParam); | |
a0d77315 | 1613 | |
3d35e989 LT |
1614 | case TBM_GETCHANNELRECT: |
1615 | return TRACKBAR_GetChannelRect (hwnd, wParam, lParam); | |
a0d77315 | 1616 | |
3d35e989 LT |
1617 | case TBM_GETLINESIZE: |
1618 | return TRACKBAR_GetLineSize (hwnd, wParam, lParam); | |
a0d77315 | 1619 | |
3d35e989 LT |
1620 | case TBM_GETNUMTICS: |
1621 | return TRACKBAR_GetNumTics (hwnd, wParam, lParam); | |
a0d77315 | 1622 | |
3d35e989 LT |
1623 | case TBM_GETPAGESIZE: |
1624 | return TRACKBAR_GetPageSize (hwnd, wParam, lParam); | |
a0d77315 | 1625 | |
3d35e989 LT |
1626 | case TBM_GETPOS: |
1627 | return TRACKBAR_GetPos (hwnd, wParam, lParam); | |
a0d77315 | 1628 | |
3d35e989 LT |
1629 | case TBM_GETPTICS: |
1630 | return TRACKBAR_GetPTics (hwnd); | |
a0d77315 | 1631 | |
3d35e989 LT |
1632 | case TBM_GETRANGEMAX: |
1633 | return TRACKBAR_GetRangeMax (hwnd, wParam, lParam); | |
a0d77315 | 1634 | |
3d35e989 LT |
1635 | case TBM_GETRANGEMIN: |
1636 | return TRACKBAR_GetRangeMin (hwnd, wParam, lParam); | |
a0d77315 | 1637 | |
3d35e989 LT |
1638 | case TBM_GETSELEND: |
1639 | return TRACKBAR_GetSelEnd (hwnd, wParam, lParam); | |
a0d77315 | 1640 | |
3d35e989 LT |
1641 | case TBM_GETSELSTART: |
1642 | return TRACKBAR_GetSelStart (hwnd, wParam, lParam); | |
a0d77315 | 1643 | |
3d35e989 LT |
1644 | case TBM_GETTHUMBLENGTH: |
1645 | return TRACKBAR_GetThumbLength (hwnd, wParam, lParam); | |
a0d77315 | 1646 | |
3d35e989 LT |
1647 | case TBM_GETTHUMBRECT: |
1648 | return TRACKBAR_GetThumbRect (hwnd, wParam, lParam); | |
a0d77315 | 1649 | |
d30dfd24 | 1650 | case TBM_GETTIC: |
3d35e989 | 1651 | return TRACKBAR_GetTic (hwnd, wParam, lParam); |
d30dfd24 AJ |
1652 | |
1653 | case TBM_GETTICPOS: | |
3d35e989 | 1654 | return TRACKBAR_GetTicPos (hwnd, wParam, lParam); |
d30dfd24 | 1655 | |
3d35e989 LT |
1656 | case TBM_GETTOOLTIPS: |
1657 | return TRACKBAR_GetToolTips (hwnd, wParam, lParam); | |
a0d77315 | 1658 | |
73458b03 | 1659 | /* case TBM_GETUNICODEFORMAT: */ |
a0d77315 | 1660 | |
3d35e989 LT |
1661 | case TBM_SETBUDDY: |
1662 | return TRACKBAR_SetBuddy (hwnd, wParam, lParam); | |
a0d77315 | 1663 | |
3d35e989 LT |
1664 | case TBM_SETLINESIZE: |
1665 | return TRACKBAR_SetLineSize (hwnd, wParam, lParam); | |
a0d77315 | 1666 | |
3d35e989 LT |
1667 | case TBM_SETPAGESIZE: |
1668 | return TRACKBAR_SetPageSize (hwnd, wParam, lParam); | |
a0d77315 | 1669 | |
3d35e989 LT |
1670 | case TBM_SETPOS: |
1671 | return TRACKBAR_SetPos (hwnd, wParam, lParam); | |
a0d77315 | 1672 | |
3d35e989 LT |
1673 | case TBM_SETRANGE: |
1674 | return TRACKBAR_SetRange (hwnd, wParam, lParam); | |
a0d77315 | 1675 | |
3d35e989 LT |
1676 | case TBM_SETRANGEMAX: |
1677 | return TRACKBAR_SetRangeMax (hwnd, wParam, lParam); | |
a0d77315 | 1678 | |
3d35e989 LT |
1679 | case TBM_SETRANGEMIN: |
1680 | return TRACKBAR_SetRangeMin (hwnd, wParam, lParam); | |
a0d77315 | 1681 | |
3d35e989 LT |
1682 | case TBM_SETSEL: |
1683 | return TRACKBAR_SetSel (hwnd, wParam, lParam); | |
a0d77315 | 1684 | |
3d35e989 LT |
1685 | case TBM_SETSELEND: |
1686 | return TRACKBAR_SetSelEnd (hwnd, wParam, lParam); | |
a0d77315 | 1687 | |
3d35e989 LT |
1688 | case TBM_SETSELSTART: |
1689 | return TRACKBAR_SetSelStart (hwnd, wParam, lParam); | |
a0d77315 | 1690 | |
3d35e989 LT |
1691 | case TBM_SETTHUMBLENGTH: |
1692 | return TRACKBAR_SetThumbLength (hwnd, wParam, lParam); | |
a0d77315 | 1693 | |
3d35e989 LT |
1694 | case TBM_SETTIC: |
1695 | return TRACKBAR_SetTic (hwnd, wParam, lParam); | |
a0d77315 | 1696 | |
d30dfd24 | 1697 | case TBM_SETTICFREQ: |
3d35e989 | 1698 | return TRACKBAR_SetTicFreq (hwnd, wParam); |
a0d77315 | 1699 | |
3d35e989 LT |
1700 | case TBM_SETTIPSIDE: |
1701 | return TRACKBAR_SetTipSide (hwnd, wParam, lParam); | |
a0d77315 | 1702 | |
3d35e989 LT |
1703 | case TBM_SETTOOLTIPS: |
1704 | return TRACKBAR_SetToolTips (hwnd, wParam, lParam); | |
a0d77315 | 1705 | |
73458b03 | 1706 | /* case TBM_SETUNICODEFORMAT: */ |
a0d77315 AJ |
1707 | |
1708 | ||
3d35e989 LT |
1709 | case WM_CAPTURECHANGED: |
1710 | return TRACKBAR_CaptureChanged (hwnd, wParam, lParam); | |
a0d77315 | 1711 | |
3d35e989 LT |
1712 | case WM_CREATE: |
1713 | return TRACKBAR_Create (hwnd, wParam, lParam); | |
a0d77315 | 1714 | |
3d35e989 LT |
1715 | case WM_DESTROY: |
1716 | return TRACKBAR_Destroy (hwnd, wParam, lParam); | |
a0d77315 | 1717 | |
73458b03 | 1718 | /* case WM_ENABLE: */ |
a0d77315 | 1719 | |
73458b03 MM |
1720 | /* case WM_ERASEBKGND: */ |
1721 | /* return 0; */ | |
a0d77315 | 1722 | |
3d35e989 LT |
1723 | case WM_GETDLGCODE: |
1724 | return DLGC_WANTARROWS; | |
a0d77315 | 1725 | |
3d35e989 LT |
1726 | case WM_KEYDOWN: |
1727 | return TRACKBAR_KeyDown (hwnd, wParam, lParam); | |
d30dfd24 | 1728 | |
3d35e989 LT |
1729 | case WM_KEYUP: |
1730 | return TRACKBAR_KeyUp (hwnd, wParam); | |
a0d77315 | 1731 | |
3d35e989 LT |
1732 | case WM_KILLFOCUS: |
1733 | return TRACKBAR_KillFocus (hwnd, wParam, lParam); | |
a0d77315 | 1734 | |
3d35e989 LT |
1735 | case WM_LBUTTONDOWN: |
1736 | return TRACKBAR_LButtonDown (hwnd, wParam, lParam); | |
a0d77315 | 1737 | |
3d35e989 LT |
1738 | case WM_LBUTTONUP: |
1739 | return TRACKBAR_LButtonUp (hwnd, wParam, lParam); | |
a0d77315 | 1740 | |
3d35e989 LT |
1741 | case WM_MOUSEMOVE: |
1742 | return TRACKBAR_MouseMove (hwnd, wParam, lParam); | |
a0d77315 | 1743 | |
3d35e989 LT |
1744 | case WM_PAINT: |
1745 | return TRACKBAR_Paint (hwnd, wParam); | |
a0d77315 | 1746 | |
3d35e989 LT |
1747 | case WM_SETFOCUS: |
1748 | return TRACKBAR_SetFocus (hwnd, wParam, lParam); | |
a0d77315 | 1749 | |
3d35e989 LT |
1750 | case WM_SIZE: |
1751 | return TRACKBAR_Size (hwnd, wParam, lParam); | |
a0d77315 | 1752 | |
3d35e989 LT |
1753 | case WM_WININICHANGE: |
1754 | return TRACKBAR_InitializeThumb (hwnd); | |
a0d77315 | 1755 | |
3d35e989 LT |
1756 | default: |
1757 | if (uMsg >= WM_USER) | |
a099a555 | 1758 | ERR("unknown msg %04x wp=%08x lp=%08lx\n", |
3d35e989 LT |
1759 | uMsg, wParam, lParam); |
1760 | return DefWindowProcA (hwnd, uMsg, wParam, lParam); | |
a0d77315 AJ |
1761 | } |
1762 | return 0; | |
1763 | } | |
1764 | ||
1765 | ||
9d8e864b | 1766 | VOID |
9e61c1cc | 1767 | TRACKBAR_Register (void) |
a0d77315 | 1768 | { |
a3960292 | 1769 | WNDCLASSA wndClass; |
a0d77315 | 1770 | |
a3960292 | 1771 | ZeroMemory (&wndClass, sizeof(WNDCLASSA)); |
a0d77315 | 1772 | wndClass.style = CS_GLOBALCLASS; |
a3960292 | 1773 | wndClass.lpfnWndProc = (WNDPROC)TRACKBAR_WindowProc; |
a0d77315 AJ |
1774 | wndClass.cbClsExtra = 0; |
1775 | wndClass.cbWndExtra = sizeof(TRACKBAR_INFO *); | |
a3960292 AJ |
1776 | wndClass.hCursor = LoadCursorA (0, IDC_ARROWA); |
1777 | wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); | |
1778 | wndClass.lpszClassName = TRACKBAR_CLASSA; | |
a0d77315 | 1779 | |
a3960292 | 1780 | RegisterClassA (&wndClass); |
a0d77315 | 1781 | } |
9d8e864b EK |
1782 | |
1783 | ||
1784 | VOID | |
9e61c1cc | 1785 | TRACKBAR_Unregister (void) |
9d8e864b | 1786 | { |
d711ad9e | 1787 | UnregisterClassA (TRACKBAR_CLASSA, (HINSTANCE)NULL); |
9d8e864b EK |
1788 | } |
1789 |