Removed some useless wingdi.h includes.
[wine] / dlls / comctl32 / trackbar.c
CommitLineData
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 31DEFAULT_DEBUG_CHANNEL(trackbar);
b4b9fae6 32
70c9e095
AJ
33typedef 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 85static BOOL TRACKBAR_SendNotify (HWND hwnd, UINT code);
a0d77315 86
26ffb3cd 87static 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 116static inline DOUBLE
506115b8 117TRACKBAR_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 141static VOID
cad17ff7 142TRACKBAR_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
186static VOID
cad17ff7 187TRACKBAR_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
229static VOID
cad17ff7 230TRACKBAR_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
263static VOID
a3960292 264TRACKBAR_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
313static VOID
a3960292 314TRACKBAR_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
365static VOID
a3960292 366TRACKBAR_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
387static VOID
388TRACKBAR_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 523static VOID
cad17ff7 524TRACKBAR_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
606static VOID
cad17ff7 607TRACKBAR_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
659static LRESULT
cad17ff7 660TRACKBAR_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
675static LRESULT
cad17ff7 676TRACKBAR_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
693static LRESULT
cad17ff7 694TRACKBAR_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
706static LRESULT
cad17ff7 707TRACKBAR_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
724static LRESULT
cad17ff7 725TRACKBAR_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
733static LRESULT
cad17ff7 734TRACKBAR_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
745static LRESULT
cad17ff7 746TRACKBAR_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
754static LRESULT
cad17ff7 755TRACKBAR_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 763static LRESULT
cad17ff7 764TRACKBAR_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
772static LRESULT
cad17ff7 773TRACKBAR_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
781static LRESULT
cad17ff7 782TRACKBAR_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
790static LRESULT
cad17ff7 791TRACKBAR_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
799static LRESULT
cad17ff7 800TRACKBAR_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 807static LRESULT
cad17ff7 808TRACKBAR_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
815static LRESULT
cad17ff7 816TRACKBAR_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 833static LRESULT
cad17ff7 834TRACKBAR_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
848static LRESULT
cad17ff7 849TRACKBAR_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 868static LRESULT
cad17ff7 869TRACKBAR_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
882static LRESULT
cad17ff7 883TRACKBAR_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
909static LRESULT
cad17ff7 910TRACKBAR_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
921static LRESULT
cad17ff7 922TRACKBAR_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
933static LRESULT
cad17ff7 934TRACKBAR_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
954static LRESULT
cad17ff7 955TRACKBAR_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
983static LRESULT
cad17ff7 984TRACKBAR_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
1006static LRESULT
cad17ff7 1007TRACKBAR_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 1029static LRESULT
cad17ff7 1030TRACKBAR_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
1045static LRESULT
cad17ff7 1046TRACKBAR_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
1070static LRESULT
cad17ff7 1071TRACKBAR_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
1091static LRESULT
cad17ff7 1092TRACKBAR_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
1112static LRESULT
cad17ff7 1113TRACKBAR_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
1128static LRESULT
cad17ff7 1129TRACKBAR_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 1148static LRESULT
cad17ff7 1149TRACKBAR_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
1160static LRESULT
cad17ff7 1161TRACKBAR_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 1174static LRESULT
cad17ff7 1175TRACKBAR_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
1189static LRESULT
cad17ff7 1190TRACKBAR_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
1252static LRESULT
cad17ff7 1253TRACKBAR_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
1267static LRESULT
cad17ff7 1268TRACKBAR_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
1283static LRESULT
cad17ff7 1284TRACKBAR_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 1356static LRESULT
cad17ff7 1357TRACKBAR_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 1387static LRESULT
cad17ff7 1388TRACKBAR_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 1404static LRESULT
cad17ff7 1405TRACKBAR_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
1418static LRESULT
cad17ff7 1419TRACKBAR_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
1432static LRESULT
cad17ff7 1433TRACKBAR_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 1444static BOOL
cad17ff7 1445TRACKBAR_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 1458static LRESULT
cad17ff7 1459TRACKBAR_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
1518static LRESULT
cad17ff7 1519TRACKBAR_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 1579static LRESULT
cad17ff7 1580TRACKBAR_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 1597static LRESULT WINAPI
a3960292 1598TRACKBAR_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 1766VOID
9e61c1cc 1767TRACKBAR_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
1784VOID
9e61c1cc 1785TRACKBAR_Unregister (void)
9d8e864b 1786{
d711ad9e 1787 UnregisterClassA (TRACKBAR_CLASSA, (HINSTANCE)NULL);
9d8e864b
EK
1788}
1789