source: trunk/src/comctl32/trackbar.c@ 912

Last change on this file since 912 was 912, checked in by cbratschi, 26 years ago

set thumb length fix

File size: 68.7 KB
Line 
1/* $Id: trackbar.c,v 1.17 1999-09-12 16:52:46 cbratschi Exp $ */
2/*
3 * Trackbar control
4 *
5 * Copyright 1998, 1999 Eric Kohl <ekohl@abo.rhein-zeitung.de>
6 * Copyright 1998,1999 Alex Priem <alexp@sci.kun.nl>
7 * Copyright 1999 Achim Hasenmueller
8 * Copyright 1999 Christoph Bratschi <cbratschi@datacomm.ch>
9 *
10 *
11 * Status: ready to use
12 * Version: 5.00
13 */
14
15#include "winbase.h"
16#include "commctrl.h"
17#include "trackbar.h"
18#include <stdio.h>
19
20
21#define TRACKBAR_GetInfoPtr(hwnd) ((TRACKBAR_INFO*)GetWindowLongA(hwnd,0))
22
23
24/* Used by TRACKBAR_Draw to find out which parts of the control
25 need to be recalculated */
26
27#define TB_THUMBPOSCHANGED 1
28#define TB_THUMBSIZECHANGED 2
29#define TB_THUMBCHANGED (TB_THUMBPOSCHANGED | TB_THUMBPOSCHANGED)
30#define TB_SELECTIONCHANGED 4
31#define TB_DRAG_MODE 16 /* we're dragging the slider */
32#define TB_DRAGPOSVALID 32 /* current Position is in dragPos */
33#define TB_SCROLL_MODE 64 /* WM_TIMER scroll mode */
34#define TB_SHOW_TOOLTIP 128 /* tooltip-style enabled and tooltip on */
35
36/* helper defines for TRACKBAR_DrawTic */
37#define TIC_LEFTEDGE 0x20
38#define TIC_RIGHTEDGE 0x40
39#define TIC_EDGE (TIC_LEFTEDGE | TIC_RIGHTEDGE)
40#define TIC_SELECTIONMARKMAX 0x80
41#define TIC_SELECTIONMARKMIN 0x100
42#define TIC_SELECTIONMARK (TIC_SELECTIONMARKMAX | TIC_SELECTIONMARKMIN)
43
44/* size calculation */
45
46#define BORDER_SIZE 2
47
48#define SCALE_SIZE 4
49#define SCALE_SPACE 1
50
51#define THUMB_LEN 23
52#define THUMB_MINLEN 4
53
54#define CHANNEL_NOSEL_HEIGHT 4 //min no sel height
55#define CHANNEL_MIN_HEIGHT 6 //min sel height
56#define CHANNEL_THUMB_DIFF 8 //sel thumb, channel difference
57#define CHANNEL_SPACE 8
58#define CHANNEL_SCALE_SPACE SCALE_SIZE+SCALE_SPACE+BORDER_SIZE
59#define CHANNEL_THUMB_SPACE BORDER_SIZE
60
61/* scroll mode */
62
63#define SCROLL_TIME 500 //ms
64#define SCROLL_TIMER_ID 1
65
66/* Tooltips */
67
68#define TOOLTIP_XSPACE 5
69#define TOOLTIP_YSPACE 5
70
71static BOOL TRACKBAR_SendNotify (HWND hwnd, UINT code);
72
73static void TRACKBAR_RecalculateTics (HWND hwnd,TRACKBAR_INFO *infoPtr,BOOL restoreOld)
74{
75 INT i,tic,nrTics;
76 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
77
78 if (dwStyle & TBS_NOTICKS) //no ticks
79 {
80 COMCTL32_Free(infoPtr->tics);
81 infoPtr->tics = NULL;
82
83 infoPtr->uNumTics = 0;
84 return;
85 }
86
87 if (restoreOld && !(dwStyle & TBS_AUTOTICKS) && infoPtr->tics != NULL)
88 { //check old ticks
89 LPLONG oldTics = COMCTL32_Alloc(infoPtr->uNumTics*sizeof(DWORD));
90 INT count = 0;
91
92 for (i = 0;i < infoPtr->uNumTics;i++)
93 {
94 if (infoPtr->tics[i] >= infoPtr->nRangeMin && infoPtr->tics[i] <= infoPtr->nRangeMax)
95 {
96 oldTics[count] = infoPtr->tics[i];
97 count++;
98 }
99 }
100
101 COMCTL32_Free(infoPtr->tics);
102 infoPtr->tics = COMCTL32_ReAlloc(oldTics,count*sizeof(DWORD));
103 infoPtr->uNumTics = count;
104
105 return;
106 }
107
108 if (infoPtr->uTicFreq && infoPtr->nRangeMax > infoPtr->nRangeMin && (dwStyle & TBS_AUTOTICKS))
109 {
110 //Tics without start and end tic
111 nrTics = (infoPtr->nRangeMax-infoPtr->nRangeMin)/infoPtr->uTicFreq-1;
112 if (nrTics <= 0)
113 {
114 COMCTL32_Free(infoPtr->tics);
115 infoPtr->tics = NULL;
116 infoPtr->uNumTics = 0;
117 return;
118 }
119 } else
120 {
121 COMCTL32_Free(infoPtr->tics);
122 infoPtr->tics = NULL;
123 infoPtr->uNumTics = 0;
124 return;
125 }
126
127 if (nrTics != infoPtr->uNumTics)
128 {
129 COMCTL32_Free(infoPtr->tics);
130 infoPtr->tics = COMCTL32_Alloc(nrTics*sizeof(DWORD));
131 infoPtr->uNumTics = nrTics;
132 }
133
134 tic = infoPtr->nRangeMin+infoPtr->uTicFreq; //start not included
135 for (i = 0;i < nrTics;i++)
136 {
137 infoPtr->tics[i] = tic;
138 tic += infoPtr->uTicFreq;
139 }
140}
141
142
143/* converts from physical (mouse) position to logical position
144 (in range of trackbar) */
145
146static DOUBLE
147TRACKBAR_ConvertPlaceToPosition(TRACKBAR_INFO *infoPtr,int place,int vertical)
148{
149 double range,width,pos;
150
151 range = infoPtr->nRangeMax-infoPtr->nRangeMin;
152 if (vertical)
153 {
154 width = infoPtr->rcChannel.bottom-infoPtr->rcChannel.top;
155 pos = infoPtr->nRangeMin+(range*(place-infoPtr->rcChannel.top))/width;
156 } else
157 {
158 width = infoPtr->rcChannel.right-infoPtr->rcChannel.left;
159 pos = infoPtr->nRangeMin+(range*(place-infoPtr->rcChannel.left))/width;
160 }
161
162 if (pos > infoPtr->nRangeMax) pos = infoPtr->nRangeMax;
163 else if (pos < infoPtr->nRangeMin) pos = infoPtr->nRangeMin;
164
165// TRACE (trackbar,"%.2f\n",pos);
166 return pos;
167}
168
169
170static VOID
171TRACKBAR_CalcChannel (HWND hwnd,TRACKBAR_INFO *infoPtr)
172{
173 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
174 INT channelSize;
175 RECT lpRect,*channel = &infoPtr->rcChannel;
176 INT thumbDiff;
177
178 GetClientRect(hwnd,&lpRect);
179
180 if (dwStyle & TBS_ENABLESELRANGE) channelSize = MAX(infoPtr->uThumbLen-CHANNEL_THUMB_DIFF,CHANNEL_MIN_HEIGHT);
181 else channelSize = CHANNEL_NOSEL_HEIGHT;
182
183 thumbDiff = (infoPtr->uThumbLen-channelSize)/2;
184
185 if (dwStyle & TBS_VERT)
186 {
187 channel->top = lpRect.top+CHANNEL_SPACE;
188 channel->bottom = lpRect.bottom-CHANNEL_SPACE;
189
190 if (dwStyle & TBS_BOTH || dwStyle & TBS_NOTICKS)
191 { //center
192 channel->left = (lpRect.right-channelSize)/2;
193 channel->right = (lpRect.right+channelSize)/2;
194 } else if (dwStyle & TBS_LEFT)
195 {
196 channel->left = lpRect.left+thumbDiff+CHANNEL_SCALE_SPACE;
197 channel->right = channel->left+channelSize;
198 } else
199 { //Right, align left
200 channel->left = lpRect.left+thumbDiff+CHANNEL_THUMB_SPACE;
201 channel->right = channel->left+channelSize;
202 }
203 } else
204 {
205 channel->left = lpRect.left+CHANNEL_SPACE;
206 channel->right = lpRect.right-CHANNEL_SPACE;
207 if (dwStyle & TBS_BOTH || dwStyle & TBS_NOTICKS)
208 { //center
209 channel->top = (lpRect.bottom-channelSize)/2;
210 channel->bottom = (lpRect.bottom+channelSize)/2;
211 } else if (dwStyle & TBS_TOP)
212 {
213 channel->top = lpRect.top+thumbDiff+CHANNEL_SCALE_SPACE;
214 channel->bottom = channel->top+channelSize;
215 } else
216 { //Bottom, align top
217 channel->top = lpRect.top+thumbDiff+CHANNEL_THUMB_SPACE;
218 channel->bottom = channel->top+channelSize;
219 }
220 }
221}
222
223//Calculate thumb size
224
225static VOID
226TRACKBAR_CalcThumb(HWND hwnd,TRACKBAR_INFO *infoPtr)
227{
228 RECT *thumb;
229 RECT *fullThumb;
230 int range, width;
231 int x,y;
232 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
233 int thumbFactor = 2;
234
235 thumb = &infoPtr->rcThumb;
236 fullThumb = &infoPtr->rcFullThumb;
237 range = infoPtr->nRangeMax-infoPtr->nRangeMin;
238 if (dwStyle & TBS_VERT)
239 {
240 width = infoPtr->rcChannel.bottom-infoPtr->rcChannel.top;
241 y = infoPtr->uThumbLen/thumbFactor; //thumb height
242 if (y%2 == 1) y++; //for real arrow
243 thumb->top = infoPtr->rcChannel.top+(width*(infoPtr->nPos-infoPtr->nRangeMin))/range-y/2; //centered
244 thumb->bottom = thumb->top+y;
245 //centered, no arrows
246 thumb->left = infoPtr->rcChannel.left-(infoPtr->uThumbLen-(infoPtr->rcChannel.right-infoPtr->rcChannel.left))/2;
247 thumb->right = thumb->left+infoPtr->uThumbLen;
248 CopyRect(fullThumb,thumb);
249 if (dwStyle & TBS_BOTH) return;
250 x = y/2; //arrow width
251 if (dwStyle & TBS_LEFT) thumb->left += x; else thumb->right -= x;
252 } else
253 {
254 width = infoPtr->rcChannel.right-infoPtr->rcChannel.left;
255 x = infoPtr->uThumbLen/thumbFactor; //thumb width
256 if (x%2 == 1) x++; //for real arrow
257 thumb->left = infoPtr->rcChannel.left+(width*(infoPtr->nPos-infoPtr->nRangeMin))/range-x/2; //centered
258 thumb->right = thumb->left+x;
259 //centered, no arrows
260 thumb->top = infoPtr->rcChannel.top-(infoPtr->uThumbLen-(infoPtr->rcChannel.bottom-infoPtr->rcChannel.top))/2;
261 thumb->bottom = thumb->top+infoPtr->uThumbLen;
262 CopyRect(fullThumb,thumb);
263 if (dwStyle & TBS_BOTH) return;
264 y = x/2; //arrow height
265 if (dwStyle & TBS_TOP) thumb->top += y; else thumb->bottom -= y;
266 }
267}
268
269static VOID
270TRACKBAR_CalcSelection (HWND hwnd, TRACKBAR_INFO *infoPtr)
271{
272 RECT *selection;
273 int range,width,height;
274 int selMin = infoPtr->nSelMin-infoPtr->nRangeMin; //relative to nRangeMin
275 int selMax = infoPtr->nSelMax-infoPtr->nRangeMin; //dito
276
277 selection = &infoPtr->rcSelection;
278 range = infoPtr->nRangeMax-infoPtr->nRangeMin;
279
280 if (range <= 0 || selMin == selMax) SetRectEmpty(selection);
281 else
282 if (!(GetWindowLongA(hwnd, GWL_STYLE) & TBS_VERT))
283 { //Horizontal
284 width = infoPtr->rcChannel.right-infoPtr->rcChannel.left;
285 selection->left = infoPtr->rcChannel.left+(width*selMin)/range;
286 selection->right = infoPtr->rcChannel.left+(width*selMax)/range;
287 selection->top = infoPtr->rcChannel.top+2;
288 selection->bottom = infoPtr->rcChannel.bottom-2;
289 } else
290 { //Vertical
291 height = infoPtr->rcChannel.bottom-infoPtr->rcChannel.top;
292 selection->top = infoPtr->rcChannel.top+(height*selMin)/range;
293 selection->bottom = infoPtr->rcChannel.top+(height*selMax)/range;
294 selection->left = infoPtr->rcChannel.left+2;
295 selection->right = infoPtr->rcChannel.right-2;
296 }
297}
298
299/* Trackbar drawing code */
300
301/* ticPos is in tic-units, not in pixels */
302
303static VOID
304TRACKBAR_DrawHorizTic (TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos,
305 int flags, COLORREF clrTic)
306{
307 RECT rcChannel = infoPtr->rcChannel;
308 int x,y,width,range,side;
309
310 range = infoPtr->nRangeMax-infoPtr->nRangeMin;
311 width = rcChannel.right-rcChannel.left;
312
313 if (flags & TBS_TOP)
314 {
315 y = infoPtr->rcFullThumb.top-SCALE_SPACE-1;
316 side = -1;
317 } else
318 {
319 y = infoPtr->rcFullThumb.bottom+SCALE_SPACE+1;
320 side = 1;
321 }
322 if (flags & TIC_SELECTIONMARK)
323 {
324 ticPos -= infoPtr->nRangeMin; //relative to nRangeMin
325 if (flags & TIC_SELECTIONMARKMIN) x = rcChannel.left+(width*ticPos)/range - 1;
326 else x = rcChannel.left+(width*ticPos)/range+1;
327
328 //first line
329 SetPixel(hdc,x,y+1*side,clrTic);
330 SetPixel(hdc,x,y+2*side,clrTic);
331 //point
332 if (flags & TIC_SELECTIONMARKMIN) x--; else x++;
333 SetPixel(hdc,x,y+2*side,clrTic);
334
335 return;
336 }
337
338 if ((ticPos > infoPtr->nRangeMin) && (ticPos < infoPtr->nRangeMax))
339 {
340 ticPos -= infoPtr->nRangeMin; //relative to nRangeMin
341 x = rcChannel.left+(width*ticPos)/range;
342 SetPixel(hdc,x,y,clrTic); //base
343 SetPixel(hdc,x,y+1*side,clrTic);
344 SetPixel(hdc,x,y+2*side,clrTic);
345 }
346
347 if (flags & TIC_EDGE)
348 {
349 if (flags & TIC_LEFTEDGE) x = rcChannel.left;
350 else x = rcChannel.right;
351
352 SetPixel(hdc,x,y,clrTic); //base
353 SetPixel(hdc,x,y+1*side,clrTic);
354 SetPixel(hdc,x,y+2*side,clrTic);
355 SetPixel(hdc,x,y+3*side,clrTic);
356 }
357}
358
359static VOID TRACKBAR_FillHorzTics(TRACKBAR_INFO *infoPtr,HDC hdc,int flags,COLORREF clrTic)
360{
361 RECT rect;
362 INT range = infoPtr->nRangeMax-infoPtr->nRangeMin;
363 INT width = infoPtr->rcChannel.right-infoPtr->rcChannel.left;
364 HBRUSH hbr = CreateSolidBrush(clrTic);
365
366 if (flags & TBS_TOP)
367 {
368 rect.bottom = infoPtr->rcFullThumb.top-SCALE_SPACE-1+1;
369 rect.top = rect.bottom-3;
370 } else
371 {
372 rect.top = infoPtr->rcFullThumb.bottom+SCALE_SPACE+1;
373 rect.bottom = rect.top+3;
374 }
375 rect.left = infoPtr->rcChannel.left+(width*(infoPtr->tics[0]-infoPtr->nRangeMin))/range;
376 rect.right = infoPtr->rcChannel.left+(width*(infoPtr->tics[infoPtr->uNumTics-1]-infoPtr->nRangeMin))/range+1;
377
378 FillRect(hdc,&rect,hbr);
379 DeleteObject(hbr);
380}
381
382static VOID
383TRACKBAR_DrawVertTic (TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos,
384 int flags, COLORREF clrTic)
385{
386 RECT rcChannel = infoPtr->rcChannel;
387 int x,y,width,range,side;
388
389 range = infoPtr->nRangeMax-infoPtr->nRangeMin;
390 width = rcChannel.bottom-rcChannel.top;
391
392 if (flags & TBS_LEFT)
393 {
394 x = infoPtr->rcFullThumb.left-SCALE_SPACE-1;
395 side = -1;
396 } else
397 {
398 x = infoPtr->rcFullThumb.right+SCALE_SPACE+1;
399 side = 1;
400 }
401
402
403 if (flags & TIC_SELECTIONMARK)
404 {
405 ticPos -= infoPtr->nRangeMin;
406 if (flags & TIC_SELECTIONMARKMIN) y = rcChannel.top+(width*ticPos)/range-1;
407 else y = rcChannel.top+(width*ticPos)/range+1;
408
409 //first line
410 SetPixel(hdc,x+1*side,y,clrTic);
411 SetPixel(hdc,x+2*side,y,clrTic);
412 //point
413 if (flags & TIC_SELECTIONMARKMIN) y--; else y++;
414 SetPixel(hdc,x+2*side,y,clrTic);
415
416 return;
417 }
418
419 if ((ticPos>infoPtr->nRangeMin) && (ticPos<infoPtr->nRangeMax))
420 {
421 ticPos -= infoPtr->nRangeMin;
422 y = rcChannel.top+(width*ticPos)/range;
423 SetPixel (hdc,x, y,clrTic); //base
424 SetPixel (hdc,x+1*side,y,clrTic);
425 SetPixel (hdc,x+2*side,y,clrTic);
426 }
427
428 if (flags & TIC_EDGE)
429 {
430 if (flags & TIC_LEFTEDGE) y = rcChannel.top;
431 else y = rcChannel.bottom;
432
433 SetPixel (hdc,x,y,clrTic); //base
434 SetPixel (hdc,x+1*side,y,clrTic);
435 SetPixel (hdc,x+2*side,y,clrTic);
436 SetPixel (hdc,x+3*side,y,clrTic);
437 }
438}
439
440static VOID TRACKBAR_FillVertTics(TRACKBAR_INFO *infoPtr,HDC hdc,int flags,COLORREF clrTic)
441{
442 RECT rect;
443 INT range = infoPtr->nRangeMax-infoPtr->nRangeMin;
444 INT width = infoPtr->rcChannel.bottom-infoPtr->rcChannel.top;
445 HBRUSH hbr = CreateSolidBrush(clrTic);
446
447 if (flags & TBS_TOP)
448 {
449 rect.right = infoPtr->rcFullThumb.left-SCALE_SPACE-1+1;
450 rect.left = rect.right-3;
451 } else
452 {
453 rect.left = infoPtr->rcFullThumb.right+SCALE_SPACE+1;
454 rect.right = rect.left+3;
455 }
456 rect.top = infoPtr->rcChannel.top+(width*(infoPtr->tics[0]-infoPtr->nRangeMin))/range;
457 rect.bottom = infoPtr->rcChannel.top+(width*(infoPtr->tics[infoPtr->uNumTics-1]-infoPtr->nRangeMin))/range+1;
458
459 FillRect(hdc,&rect,hbr);
460 DeleteObject(hbr);
461}
462
463static VOID
464TRACKBAR_DrawTics (TRACKBAR_INFO *infoPtr, HDC hdc, LONG ticPos,
465 int flags, COLORREF clrTic)
466{
467 if (flags & TBS_VERT)
468 {
469 if ((flags & TBS_LEFT) || (flags & TBS_BOTH))
470 TRACKBAR_DrawVertTic (infoPtr,hdc,ticPos,flags | TBS_LEFT ,clrTic);
471 //TBS_RIGHT == default
472 if (!(flags & TBS_LEFT) || (flags & TBS_BOTH))
473 TRACKBAR_DrawVertTic(infoPtr,hdc,ticPos,flags & ~TBS_LEFT,clrTic);
474 } else
475 {
476 if ((flags & TBS_TOP) || (flags & TBS_BOTH))
477 TRACKBAR_DrawHorizTic(infoPtr,hdc,ticPos,flags | TBS_TOP,clrTic);
478 //TBS_BOTTOM == default
479 if (!(flags & TBS_TOP) || (flags & TBS_BOTH))
480 TRACKBAR_DrawHorizTic(infoPtr,hdc,ticPos,flags & ~TBS_TOP,clrTic);
481 }
482}
483
484//draw thumb, call only from draw!
485
486static VOID TRACKBAR_DrawThumb(TRACKBAR_INFO *infoPtr,HDC hdc,DWORD dwStyle)
487{
488 if (!(dwStyle & TBS_NOTHUMB))
489 {
490 HBRUSH hbr,hbrOld;
491 RECT thumb = infoPtr->rcThumb;
492
493 if (infoPtr->flags & TB_DRAG_MODE) hbr = CreateSolidBrush(GetSysColor(COLOR_3DHILIGHT));
494 else hbr = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
495 hbrOld = SelectObject(hdc,hbr);
496
497 if (dwStyle & TBS_BOTH)
498 {
499 DrawEdge(hdc,&thumb,EDGE_RAISED,BF_RECT | BF_ADJUST);
500 FillRect(hdc,&thumb,hbr);
501 } else
502 {
503 POINT points[6];
504 RECT triangle; /* for correct shadows of thumb */
505
506 if (dwStyle & TBS_VERT)
507 { //Vertical
508
509 if (dwStyle & TBS_LEFT)
510 {
511 HPEN oldPen,pen;
512
513 //Outline
514
515 SetPolyFillMode(hdc,WINDING);
516 points[0].x = thumb.left;
517 points[0].y = thumb.top;
518 points[1].x = thumb.left-(thumb.bottom-thumb.top)/2;
519 points[1].y = thumb.top+(thumb.bottom-thumb.top)/2;
520 points[2].x = thumb.left;
521 points[2].y = thumb.bottom;
522 points[3].x = thumb.right;
523 points[3].y = thumb.bottom;
524 points[4].x = thumb.right;
525 points[4].y = thumb.top;
526 points[5].x = points[0].x;
527 points[5].y = points[0].y;
528 Polygon(hdc,points,6);
529
530 //Edge
531
532 thumb.bottom++;
533 thumb.right++;
534 DrawEdge(hdc,&thumb,EDGE_RAISED,BF_BOTTOM | BF_TOP | BF_RIGHT);
535
536 //Draw notch
537
538 triangle.right = points[0].x;
539 triangle.top = points[0].y;
540 triangle.left = points[1].x;
541 triangle.bottom = points[1].y;
542 DrawEdge(hdc,&triangle,EDGE_RAISED,BF_DIAGONAL | BF_DIAGONAL_ENDTOPRIGHT);
543
544 //draw this line direct, DrawEdge not useful
545 pen = GetSysColorPen(COLOR_3DDKSHADOW);
546 oldPen = SelectObject(hdc,pen);
547 MoveToEx(hdc,points[1].x,points[1].y,NULL);
548 LineTo(hdc,points[2].x-1,points[2].y-1);
549 pen = GetSysColorPen(COLOR_BTNSHADOW);
550 SelectObject(hdc,pen);
551 MoveToEx(hdc,points[1].x+1,points[1].y,NULL);
552 LineTo(hdc,points[2].x,points[2].y-1);
553 SelectObject(hdc,oldPen);
554
555 } else //Right
556 {
557 HPEN oldPen,pen;
558
559 //Outline
560
561 SetPolyFillMode(hdc,WINDING);
562 points[0].x = thumb.left;
563 points[0].y = thumb.top;
564 points[1].x = thumb.left;
565 points[1].y = thumb.bottom;
566 points[2].x = thumb.right;
567 points[2].y = thumb.bottom;
568 points[3].x = thumb.right+(thumb.bottom-thumb.top)/2;
569 points[3].y = thumb.bottom-(thumb.bottom-thumb.top)/2;
570 points[4].x = thumb.right;
571 points[4].y = thumb.top;
572 points[5].x = points[0].x;
573 points[5].y = points[0].y;
574 Polygon(hdc,points,6);
575
576 //Edge
577
578 thumb.bottom++;
579 DrawEdge(hdc,&thumb,EDGE_RAISED,BF_BOTTOM | BF_TOP | BF_LEFT);
580
581 //Draw notch
582
583 //draw this line direct, DrawEdge not useful
584 pen = GetSysColorPen(COLOR_3DLIGHT);
585 oldPen = SelectObject(hdc,pen);
586 MoveToEx(hdc,points[4].x,points[4].y,NULL);
587 LineTo(hdc,points[3].x-1,points[3].y-1);
588 pen = GetSysColorPen(COLOR_BTNHIGHLIGHT);
589 SelectObject(hdc,pen);
590 MoveToEx(hdc,points[4].x,points[4].y+1,NULL);
591 LineTo(hdc,points[3].x-2,points[3].y-1);
592 SelectObject(hdc,oldPen);
593
594 triangle.right = points[3].x;
595 triangle.top = points[3].y;
596 triangle.left = points[2].x;
597 triangle.bottom = points[2].y;
598 DrawEdge(hdc,&triangle,EDGE_RAISED,BF_DIAGONAL | BF_DIAGONAL_ENDBOTTOMLEFT);
599 }
600 } else
601 { //Horizontal
602
603 if (dwStyle & TBS_TOP)
604 {
605 //Outline
606
607 SetPolyFillMode(hdc,WINDING);
608 points[0].x = thumb.left;
609 points[0].y = thumb.top;
610 points[1].x = thumb.left+(thumb.right-thumb.left)/2;
611 points[1].y = thumb.top-(thumb.right-thumb.left)/2;
612 points[2].x = thumb.right;
613 points[2].y = thumb.top;
614 points[3].x = thumb.right;
615 points[3].y = thumb.bottom;
616 points[4].x = thumb.left;
617 points[4].y = thumb.bottom;
618 points[5].x = points[0].x;
619 points[5].y = points[0].y;
620 Polygon(hdc,points,6);
621
622 //Edge
623
624 thumb.right++;
625 thumb.bottom++;
626 DrawEdge(hdc,&thumb,EDGE_RAISED,BF_BOTTOM | BF_LEFT | BF_RIGHT);
627
628 //Draw notch
629
630 triangle.left = points[0].x;
631 triangle.bottom = points[0].y;
632 triangle.right = points[1].x;
633 triangle.top = points[1].y;
634 DrawEdge(hdc,&triangle,EDGE_RAISED,BF_DIAGONAL | BF_DIAGONAL_ENDTOPRIGHT);
635
636
637 triangle.left = points[1].x;
638 triangle.top = points[1].y;
639 triangle.right = points[2].x;
640 triangle.bottom = points[2].y;
641 DrawEdge(hdc,&triangle,EDGE_RAISED,BF_DIAGONAL | BF_DIAGONAL_ENDBOTTOMRIGHT);
642
643 } else //Bottom
644 {
645
646 //Outline
647
648 SetPolyFillMode(hdc,WINDING);
649 points[0].x = thumb.left;
650 points[0].y = thumb.top;
651 points[1].x = thumb.right;
652 points[1].y = thumb.top;
653 points[2].x = thumb.right;
654 points[2].y = thumb.bottom;
655 points[3].x = thumb.right-(thumb.right-thumb.left)/2;
656 points[3].y = thumb.bottom+(thumb.right-thumb.left)/2;
657 points[4].x = thumb.left;
658 points[4].y = thumb.bottom;
659 points[5].x = points[0].x;
660 points[5].y = points[0].y;
661 Polygon(hdc,points,6);
662
663 //Edge
664
665 thumb.right++;
666 thumb.bottom++;
667 DrawEdge(hdc,&thumb,EDGE_RAISED,BF_TOP | BF_LEFT | BF_RIGHT);
668
669 //Draw notch
670
671 triangle.right = points[2].x;
672 triangle.top = points[2].y;
673 triangle.left = points[3].x;
674 triangle.bottom = points[3].y;
675 DrawEdge(hdc,&triangle,EDGE_RAISED,BF_DIAGONAL | BF_DIAGONAL_ENDBOTTOMLEFT);
676 triangle.right = points[3].x;
677 triangle.bottom = points[3].y;
678 triangle.left = points[4].x;
679 triangle.top = points[4].y;
680 DrawEdge(hdc,&triangle,EDGE_RAISED,BF_DIAGONAL | BF_DIAGONAL_ENDTOPLEFT);
681
682 }
683 }
684 }
685 SelectObject(hdc,hbrOld);
686 DeleteObject(hbr);
687 }
688}
689
690//draw the trackbar
691
692static VOID TRACKBAR_Draw(HWND hwnd,HDC hdc)
693{
694 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
695 DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE);
696 RECT rcClient,rcChannel,rcSelection;
697 HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);
698 int i;
699 NMCUSTOMDRAW cdraw;
700 LRESULT cdctlres,cdres;
701
702 GetClientRect(hwnd,&rcClient);
703
704 //Custom draw
705 cdraw.hdr.hwndFrom = hwnd;
706 cdraw.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID);
707 cdraw.hdr.code = NM_CUSTOMDRAW;
708 cdraw.dwDrawStage = CDDS_PREPAINT;
709 cdraw.hdc = hdc;
710 cdraw.dwItemSpec = 0;
711 cdraw.uItemState = CDIS_DEFAULT;
712 cdraw.rc = rcClient;
713 cdraw.lItemlParam = 0;
714
715 cdctlres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
716
717 if (cdctlres & CDRF_SKIPDEFAULT) return;
718
719 //Background
720 hBrush = CreateSolidBrush(infoPtr->clrBk);
721 FillRect(hdc,&rcClient,hBrush);
722 DeleteObject(hBrush);
723
724 if (infoPtr->flags & TB_DRAGPOSVALID)
725 {
726 infoPtr->nPos = infoPtr->dragPos;
727 infoPtr->flags |= TB_THUMBPOSCHANGED;
728 }
729
730 if (infoPtr->flags & TB_THUMBCHANGED)
731 {
732 if (infoPtr->flags & TB_THUMBSIZECHANGED) TRACKBAR_CalcChannel(hwnd,infoPtr);
733 TRACKBAR_CalcThumb(hwnd,infoPtr);
734 }
735 if (infoPtr->flags & TB_SELECTIONCHANGED) TRACKBAR_CalcSelection(hwnd,infoPtr);
736 infoPtr->flags &= ~ (TB_THUMBCHANGED | TB_SELECTIONCHANGED | TB_DRAGPOSVALID);
737
738 /* draw channel */
739
740 if (cdctlres & CDRF_NOTIFYITEMDRAW)
741 {
742 cdraw.dwDrawStage = CDDS_ITEMPREPAINT;
743 cdraw.dwItemSpec = TBCD_CHANNEL;
744 cdraw.rc = infoPtr->rcChannel;
745
746 cdres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
747 } else cdres = 0;
748
749 if (!(cdres & CDRF_SKIPDEFAULT))
750 {
751 rcChannel = infoPtr->rcChannel;
752 rcSelection = infoPtr->rcSelection;
753 DrawEdge(hdc,&rcChannel,EDGE_SUNKEN,BF_RECT | BF_ADJUST);
754
755 if (dwStyle & TBS_ENABLESELRANGE) /* fill the channel */
756 {
757 HBRUSH hbr = CreateSolidBrush(RGB(255,255,255));
758 FillRect(hdc,&rcChannel,hbr);
759 DeleteObject(hbr);
760 if (((dwStyle & TBS_VERT) && (rcSelection.top != rcSelection.bottom)) ||
761 ((!(dwStyle & TBS_VERT)) && (rcSelection.left != rcSelection.right)))
762 {
763 hbr = CreateSolidBrush (COLOR_HIGHLIGHT);
764 FillRect (hdc,&rcSelection,hbr);
765 DeleteObject(hbr);
766 }
767 }
768
769 if (cdctlres & CDRF_NOTIFYITEMDRAW)
770 {
771 cdraw.dwDrawStage = CDDS_ITEMPOSTPAINT;
772
773 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
774 }
775 }
776
777 /* draw tics */
778
779 if (cdctlres & CDRF_NOTIFYITEMDRAW)
780 {
781 cdraw.dwDrawStage = CDDS_ITEMPREPAINT;
782 cdraw.dwItemSpec = TBCD_TICS;
783 SetRectEmpty(&cdraw.rc);
784
785 cdres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
786 } else cdres = 0;
787
788 if (!(cdres & CDRF_SKIPDEFAULT))
789 {
790 if (!(dwStyle & TBS_NOTICKS))
791 {
792 int ticFlags = dwStyle & 0x0f;
793 COLORREF clrTic = GetSysColor(COLOR_3DDKSHADOW);
794 INT range = infoPtr->nRangeMax-infoPtr->nRangeMin;
795 INT width = (dwStyle & TBS_VERT) ? rcChannel.bottom-rcChannel.top:rcChannel.right-rcChannel.left;
796
797 //check if maximum of visible marks is reached
798 if (dwStyle & TBS_AUTOTICKS && infoPtr->uNumTics > 1 && (INT)(width*infoPtr->tics[0]/range) == (INT)(width*infoPtr->tics[1]/range))
799 {
800 //draw all pixels at once -> much faster
801 if (dwStyle & TBS_VERT)
802 {
803 if ((ticFlags & TBS_LEFT) || (ticFlags & TBS_BOTH))
804 TRACKBAR_FillVertTics(infoPtr,hdc,ticFlags | TBS_LEFT,clrTic);
805 if (!(ticFlags & TBS_LEFT) || (ticFlags & TBS_BOTH))
806 TRACKBAR_FillVertTics(infoPtr,hdc,ticFlags & ~TBS_LEFT,clrTic);
807 } else
808 {
809 if ((ticFlags & TBS_TOP) || (ticFlags & TBS_BOTH))
810 TRACKBAR_FillHorzTics(infoPtr,hdc,ticFlags | TBS_TOP,clrTic);
811 if (!(ticFlags & TBS_TOP) || (ticFlags & TBS_BOTH))
812 TRACKBAR_FillHorzTics(infoPtr,hdc,ticFlags & ~TBS_TOP,clrTic);
813 }
814 } else
815 {
816 for (i = 0;i < infoPtr->uNumTics;i++)
817 TRACKBAR_DrawTics(infoPtr,hdc,infoPtr->tics[i],ticFlags,clrTic);
818 }
819
820 TRACKBAR_DrawTics(infoPtr,hdc,0,ticFlags | TIC_LEFTEDGE,clrTic);
821 TRACKBAR_DrawTics(infoPtr,hdc,0,ticFlags | TIC_RIGHTEDGE,clrTic);
822
823 if ((dwStyle & TBS_ENABLESELRANGE) &&
824 ((dwStyle & TBS_VERT && rcSelection.bottom != rcSelection.top) ||
825 (!(dwStyle & TBS_VERT) && rcSelection.left != rcSelection.right)))
826 {
827 TRACKBAR_DrawTics(infoPtr,hdc,infoPtr->nSelMin,ticFlags | TIC_SELECTIONMARKMIN,clrTic);
828 TRACKBAR_DrawTics(infoPtr,hdc,infoPtr->nSelMax,ticFlags | TIC_SELECTIONMARKMAX,clrTic);
829 }
830 }
831
832 if (cdctlres & CDRF_NOTIFYITEMDRAW)
833 {
834 cdraw.dwDrawStage = CDDS_ITEMPOSTPAINT;
835
836 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
837 }
838 }
839
840 /* draw thumb */
841
842 if (cdctlres & CDRF_NOTIFYITEMDRAW)
843 {
844 cdraw.dwDrawStage = CDDS_ITEMPREPAINT;
845 cdraw.dwItemSpec = TBCD_THUMB;
846 cdraw.rc = infoPtr->rcFullThumb;
847
848 cdres = SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
849 } else cdres = 0;
850
851 if (!(cdres & CDRF_SKIPDEFAULT))
852 {
853 TRACKBAR_DrawThumb(infoPtr,hdc,dwStyle);
854
855 if (cdctlres & CDRF_NOTIFYITEMDRAW)
856 {
857 cdraw.dwDrawStage = CDDS_ITEMPOSTPAINT;
858
859 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
860 }
861
862 }
863
864 if (infoPtr->bFocus) DrawFocusRect(hdc,&rcClient);
865
866 if (cdctlres & CDRF_NOTIFYPOSTPAINT)
867 {
868 cdraw.dwDrawStage = CDDS_POSTPAINT;
869 cdraw.dwItemSpec = 0;
870 GetClientRect(hwnd,&cdraw.rc);
871
872 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)cdraw.hdr.idFrom,(LPARAM)&cdraw);
873 }
874
875}
876
877//update thumb position
878
879static VOID TRACKBAR_UpdateThumbPosition(HWND hwnd,INT lastPos,BOOL mustRedraw)
880{
881 HDC hdc;
882 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
883 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
884 RECT lastRect,newRect,updateRect;
885 HDC hdcCompatible;
886 HBITMAP bitmap,oldbmp;
887
888 //last
889 lastRect = infoPtr->rcFullThumb;
890
891 //new
892 if (infoPtr->flags & TB_DRAGPOSVALID)
893 {
894 infoPtr->nPos = infoPtr->dragPos;
895 infoPtr->flags &= ~TB_DRAGPOSVALID;
896 }
897 if (!mustRedraw && infoPtr->nPos == lastPos) return;
898
899 if (dwStyle & TBS_NOTHUMB) return;
900
901 TRACKBAR_CalcThumb(hwnd,infoPtr);
902 infoPtr->flags &= ~TB_THUMBCHANGED;
903 newRect = infoPtr->rcFullThumb;
904
905 //same rect?
906 if (!mustRedraw && EqualRect(&lastRect,&newRect)) return;
907
908 //3D frame adjustation
909 lastRect.right++;
910 lastRect.bottom++;
911 newRect.right++;
912 newRect.bottom++;
913
914 //BitBlt from memory -> no flickering
915 updateRect.left = MIN(lastRect.left,newRect.left);
916 updateRect.right = MAX(lastRect.right,newRect.right);
917 updateRect.top = MIN(lastRect.top,newRect.top);
918 updateRect.bottom = MAX(lastRect.bottom,newRect.bottom);
919 hdc = GetDC(hwnd);
920 hdcCompatible = CreateCompatibleDC(hdc);
921 bitmap = CreateCompatibleBitmap(hdc,updateRect.right,updateRect.bottom);
922 oldbmp = SelectObject(hdcCompatible,bitmap);
923 TRACKBAR_Draw(hwnd,hdcCompatible);
924 if (dwStyle & TBS_VERT)
925 {
926 if (lastRect.top > newRect.top && lastRect.top < newRect.bottom)
927 BitBlt(hdc,newRect.left,newRect.top,newRect.right-newRect.left,lastRect.bottom-newRect.top,hdcCompatible,newRect.left,newRect.top,SRCCOPY);
928 else if (lastRect.bottom < newRect.bottom && lastRect.bottom > newRect.top)
929 BitBlt(hdc,lastRect.left,lastRect.top,lastRect.right-lastRect.left,newRect.bottom-lastRect.top,hdcCompatible,lastRect.left,lastRect.top,SRCCOPY);
930 else
931 {
932 BitBlt(hdc,lastRect.left,lastRect.top,lastRect.right-lastRect.left,lastRect.bottom-lastRect.top,hdcCompatible,lastRect.left,lastRect.top,SRCCOPY);
933 BitBlt(hdc,newRect.left,newRect.top,newRect.right-newRect.left,newRect.bottom-newRect.top,hdcCompatible,newRect.left,newRect.top,SRCCOPY);
934 }
935 } else
936 {
937 if (lastRect.right > newRect.left && lastRect.right < newRect.right)
938 BitBlt(hdc,lastRect.left,lastRect.top,newRect.right-lastRect.left,lastRect.bottom-lastRect.top,hdcCompatible,lastRect.left,lastRect.top,SRCCOPY);
939 else if (lastRect.left < newRect.right && lastRect.left > newRect.left)
940 BitBlt(hdc,newRect.left,newRect.top,lastRect.right-newRect.left,newRect.bottom-newRect.top,hdcCompatible,newRect.left,newRect.top,SRCCOPY);
941 else
942 {
943 BitBlt(hdc,lastRect.left,lastRect.top,lastRect.right-lastRect.left,lastRect.bottom-lastRect.top,hdcCompatible,lastRect.left,lastRect.top,SRCCOPY);
944 BitBlt(hdc,newRect.left,newRect.top,newRect.right-newRect.left,newRect.bottom-newRect.top,hdcCompatible,newRect.left,newRect.top,SRCCOPY);
945 }
946 }
947 SelectObject(hdcCompatible,oldbmp);
948 DeleteObject(bitmap);
949 DeleteDC(hdcCompatible);
950 ReleaseDC(hwnd,hdc);
951}
952
953//redraw everything
954
955static VOID TRACKBAR_Refresh (HWND hwnd)
956{
957 HDC hdc;
958
959 hdc = GetDC (hwnd);
960 TRACKBAR_Draw(hwnd,hdc);
961 ReleaseDC(hwnd,hdc);
962}
963
964static VOID
965TRACKBAR_AlignBuddies (HWND hwnd, TRACKBAR_INFO *infoPtr)
966{
967 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
968 HWND hwndParent = GetParent(hwnd);
969 RECT rcSelf,rcBuddy;
970 INT x, y;
971
972 GetWindowRect(hwnd,&rcSelf);
973
974 /* align buddy left or above */
975 if (infoPtr->hwndBuddyLA)
976 {
977 GetWindowRect(infoPtr->hwndBuddyLA,&rcBuddy);
978
979 if (dwStyle & TBS_VERT)
980 { //above
981 x = rcSelf.left-(rcBuddy.right-rcBuddy.left)/2+infoPtr->rcChannel.left+(infoPtr->rcChannel.right-infoPtr->rcChannel.left)/2;
982 y = rcSelf.top-(rcBuddy.bottom-rcBuddy.top);
983 } else
984 { //left
985 x = rcSelf.left+infoPtr->rcChannel.left-(rcBuddy.right-rcBuddy.left)/2;
986 y = rcSelf.top-(rcBuddy.bottom-rcBuddy.top);
987 }
988
989 SetWindowPos(infoPtr->hwndBuddyLA,0,x,y,0,0,SWP_NOZORDER | SWP_NOSIZE);
990 }
991
992
993 /* align buddy right or below */
994 if (infoPtr->hwndBuddyRB)
995 {
996 GetWindowRect(infoPtr->hwndBuddyRB,&rcBuddy);
997
998 if (dwStyle & TBS_VERT)
999 { //below
1000 x = rcSelf.left-(rcBuddy.right-rcBuddy.left)/2+infoPtr->rcChannel.left+(infoPtr->rcChannel.right-infoPtr->rcChannel.left)/2;
1001 y = rcSelf.bottom;
1002 } else
1003 {
1004 x = rcSelf.right-infoPtr->rcChannel.left-(rcBuddy.right-rcBuddy.left)/2;
1005 y = rcSelf.top-(rcBuddy.bottom-rcBuddy.top);
1006 }
1007
1008 SetWindowPos(infoPtr->hwndBuddyRB,0,x,y,0,0,SWP_NOZORDER | SWP_NOSIZE);
1009 }
1010}
1011
1012
1013static LRESULT
1014TRACKBAR_ClearSel (HWND hwnd, WPARAM wParam, LPARAM lParam)
1015{
1016 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1017
1018 if (infoPtr->nSelMin != infoPtr->nSelMax)
1019 {
1020 infoPtr->nSelMin = 0;
1021 infoPtr->nSelMax = 0;
1022 infoPtr->flags |= TB_SELECTIONCHANGED;
1023
1024 if ((BOOL)wParam) TRACKBAR_Refresh(hwnd);
1025 }
1026
1027 return 0;
1028}
1029
1030
1031static LRESULT
1032TRACKBAR_ClearTics (HWND hwnd, WPARAM wParam, LPARAM lParam)
1033{
1034 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1035
1036 if (!(GetWindowLongA(hwnd, GWL_STYLE) & (TBS_AUTOTICKS | TBS_NOTICKS))) return 0;
1037
1038 if (infoPtr->tics)
1039 {
1040 COMCTL32_Free(infoPtr->tics);
1041 infoPtr->tics = NULL;
1042 infoPtr->uNumTics = 0;
1043
1044 if (wParam) TRACKBAR_Refresh(hwnd);
1045 }
1046
1047 return 0;
1048}
1049
1050
1051static LRESULT
1052TRACKBAR_GetBuddy (HWND hwnd, WPARAM wParam, LPARAM lParam)
1053{
1054 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
1055
1056 if (wParam)
1057 return (LRESULT)infoPtr->hwndBuddyLA; //left or above
1058 else
1059 return (LRESULT)infoPtr->hwndBuddyRB; //right or below
1060}
1061
1062
1063static LRESULT
1064TRACKBAR_GetChannelRect (HWND hwnd, WPARAM wParam, LPARAM lParam)
1065{
1066 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1067 LPRECT lprc = (LPRECT)lParam;
1068
1069 if (lprc == NULL) return 0;
1070
1071 CopyRect(lprc,&infoPtr->rcChannel);
1072
1073 return 0;
1074}
1075
1076
1077static LRESULT
1078TRACKBAR_GetLineSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1079{
1080 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1081
1082 return infoPtr->nLineSize;
1083}
1084
1085
1086static LRESULT
1087TRACKBAR_GetNumTics (HWND hwnd, WPARAM wParam, LPARAM lParam)
1088{
1089 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1090
1091 if (GetWindowLongA(hwnd, GWL_STYLE) & TBS_NOTICKS) return 0;
1092
1093 return infoPtr->uNumTics+2; //includes last and first tick
1094}
1095
1096
1097static LRESULT
1098TRACKBAR_GetPageSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1099{
1100 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1101
1102 return infoPtr->nPageSize;
1103}
1104
1105
1106static LRESULT
1107TRACKBAR_GetPos (HWND hwnd, WPARAM wParam, LPARAM lParam)
1108{
1109 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1110
1111 return infoPtr->nPos;
1112}
1113
1114
1115static LRESULT
1116TRACKBAR_GetRangeMax (HWND hwnd, WPARAM wParam, LPARAM lParam)
1117{
1118 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1119
1120 return infoPtr->nRangeMax;
1121}
1122
1123
1124static LRESULT
1125TRACKBAR_GetRangeMin (HWND hwnd, WPARAM wParam, LPARAM lParam)
1126{
1127 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1128
1129 return infoPtr->nRangeMin;
1130}
1131
1132
1133static LRESULT
1134TRACKBAR_GetSelEnd (HWND hwnd, WPARAM wParam, LPARAM lParam)
1135{
1136 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1137
1138 return infoPtr->nSelMax;
1139}
1140
1141
1142static LRESULT
1143TRACKBAR_GetSelStart (HWND hwnd, WPARAM wParam, LPARAM lParam)
1144{
1145 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1146
1147 return infoPtr->nSelMin;
1148}
1149
1150
1151static LRESULT
1152TRACKBAR_GetThumbLength (HWND hwnd, WPARAM wParam, LPARAM lParam)
1153{
1154 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1155
1156 return infoPtr->uThumbLen;
1157}
1158
1159static LRESULT
1160TRACKBAR_GetPTics (HWND hwnd)
1161{
1162 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1163
1164 return (LRESULT)infoPtr->tics;
1165}
1166
1167static LRESULT
1168TRACKBAR_GetThumbRect (HWND hwnd, WPARAM wParam, LPARAM lParam)
1169{
1170 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1171 LPRECT lprc = (LPRECT)lParam;
1172
1173 if (lprc == NULL) return 0;
1174
1175 CopyRect(lprc,&infoPtr->rcFullThumb);
1176
1177 return 0;
1178}
1179
1180
1181static LRESULT
1182TRACKBAR_GetTic (HWND hwnd, WPARAM wParam, LPARAM lParam)
1183{
1184 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1185 INT iTic;
1186
1187 iTic = (INT)wParam;
1188 if ((iTic < 0) || (iTic > infoPtr->uNumTics)) return -1;
1189
1190 return (LRESULT)infoPtr->tics[iTic];
1191
1192}
1193
1194
1195static LRESULT
1196TRACKBAR_GetTicPos (HWND hwnd, WPARAM wParam, LPARAM lParam)
1197{
1198 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1199 INT iTic, range, width, pos;
1200
1201
1202 iTic = (INT)wParam;
1203 if ((iTic < 0) || (iTic > infoPtr->uNumTics)) return -1;
1204
1205 range = infoPtr->nRangeMax-infoPtr->nRangeMin;
1206 width = infoPtr->rcChannel.right-infoPtr->rcChannel.left;
1207 pos = infoPtr->rcChannel.left+(width*(infoPtr->tics[iTic]-infoPtr->nRangeMin))/range;
1208
1209 return (LRESULT) pos;
1210}
1211
1212
1213static LRESULT
1214TRACKBAR_GetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam)
1215{
1216 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1217
1218 if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_TOOLTIPS)
1219 return (LRESULT)infoPtr->hwndToolTip;
1220 return 0;
1221}
1222
1223
1224/* case TBM_GETUNICODEFORMAT: */
1225
1226
1227static LRESULT
1228TRACKBAR_SetBuddy (HWND hwnd, WPARAM wParam, LPARAM lParam)
1229{
1230 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
1231 HWND hwndTemp;
1232
1233 if (!(GetParent(lParam) == GetParent(hwnd))) return wParam ? infoPtr->hwndBuddyLA:infoPtr->hwndBuddyRB;
1234
1235 if (wParam)
1236 {
1237 /* buddy is left or above */
1238 hwndTemp = infoPtr->hwndBuddyLA;
1239 infoPtr->hwndBuddyLA = (HWND)lParam;
1240 } else
1241 {
1242 /* buddy is right or below */
1243 hwndTemp = infoPtr->hwndBuddyRB;
1244 infoPtr->hwndBuddyRB = (HWND)lParam;
1245 }
1246
1247 TRACKBAR_AlignBuddies(hwnd,infoPtr);
1248
1249 return (LRESULT)hwndTemp;
1250}
1251
1252
1253static LRESULT
1254TRACKBAR_SetLineSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1255{
1256 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1257 INT nTemp = infoPtr->nLineSize;
1258
1259 infoPtr->nLineSize = (INT)lParam;
1260
1261 return nTemp;
1262}
1263
1264
1265static LRESULT
1266TRACKBAR_SetPageSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
1267{
1268 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1269 INT nTemp = infoPtr->nPageSize;
1270
1271 infoPtr->nPageSize = (INT)lParam;
1272
1273 return nTemp;
1274}
1275
1276
1277static LRESULT
1278TRACKBAR_SetPos (HWND hwnd, WPARAM wParam, LPARAM lParam)
1279{
1280 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1281 INT lastPos = infoPtr->nPos;
1282
1283 infoPtr->nPos = (INT)LOWORD(lParam);
1284
1285 if (lastPos == infoPtr->nPos) return 0; //nothing changed
1286
1287 if (infoPtr->nPos < infoPtr->nRangeMin)
1288 infoPtr->nPos = infoPtr->nRangeMin;
1289
1290 if (infoPtr->nPos > infoPtr->nRangeMax)
1291 infoPtr->nPos = infoPtr->nRangeMax;
1292 infoPtr->flags |= TB_THUMBPOSCHANGED;
1293
1294 if (wParam) TRACKBAR_UpdateThumbPosition(hwnd,lastPos,FALSE);
1295
1296 return 0;
1297}
1298
1299
1300static LRESULT
1301TRACKBAR_SetRange (HWND hwnd, WPARAM wParam, LPARAM lParam)
1302{
1303 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1304 int newMin,newMax;
1305 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
1306
1307 newMin = (INT)LOWORD(lParam);
1308 newMax = (INT)HIWORD(lParam);
1309
1310 if (newMin == newMax) return 0;
1311 if (newMin > newMax)
1312 { //exchange
1313 int x;
1314
1315 x = newMin;
1316 newMin = newMax;
1317 newMax = x;
1318 }
1319 if (newMin == infoPtr->nRangeMin && newMax == infoPtr->nRangeMax) return 0;
1320
1321 infoPtr->nRangeMin = newMin;
1322 infoPtr->nRangeMax = newMax;
1323
1324 if (infoPtr->nPos < infoPtr->nRangeMin)
1325 {
1326 infoPtr->nPos = infoPtr->nRangeMin;
1327 infoPtr->flags |= TB_THUMBPOSCHANGED;
1328 }
1329 if (infoPtr->nPos > infoPtr->nRangeMax)
1330 {
1331 infoPtr->nPos = infoPtr->nRangeMax;
1332 infoPtr->flags |= TB_THUMBPOSCHANGED;
1333 }
1334
1335 if (infoPtr->nSelMin < infoPtr->nRangeMin)
1336 {
1337 infoPtr->nSelMin = infoPtr->nRangeMin;
1338 infoPtr->flags |= TB_SELECTIONCHANGED;
1339 }
1340 if (infoPtr->nSelMin > infoPtr->nRangeMax)
1341 {
1342 infoPtr->nSelMin = infoPtr->nRangeMax;
1343 infoPtr->flags |= TB_SELECTIONCHANGED;
1344 }
1345 if (infoPtr->nSelMax < infoPtr->nRangeMin)
1346 {
1347 infoPtr->nSelMax = infoPtr->nRangeMin;
1348 infoPtr->flags |= TB_SELECTIONCHANGED;
1349 }
1350 if (infoPtr->nSelMax > infoPtr->nRangeMax)
1351 {
1352 infoPtr->nSelMax = infoPtr->nRangeMax;
1353 infoPtr->flags |= TB_SELECTIONCHANGED;
1354 }
1355
1356 infoPtr->nPageSize = (infoPtr->nRangeMax-infoPtr->nRangeMin)/5;
1357 if (infoPtr->nPageSize == 0) infoPtr->nPageSize = 1;
1358 TRACKBAR_RecalculateTics(hwnd,infoPtr,TRUE);
1359
1360 if (wParam) TRACKBAR_Refresh(hwnd);
1361
1362 return 0;
1363}
1364
1365
1366static LRESULT
1367TRACKBAR_SetRangeMax (HWND hwnd, WPARAM wParam, LPARAM lParam)
1368{
1369 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1370
1371 if ((INT)lParam <= infoPtr->nRangeMin) return 0;
1372 if (infoPtr->nRangeMax == (INT)lParam) return 0;
1373
1374 infoPtr->nRangeMax = (INT)lParam;
1375 if (infoPtr->nPos > infoPtr->nRangeMax)
1376 {
1377 infoPtr->nPos = infoPtr->nRangeMax;
1378 infoPtr->flags |=TB_THUMBPOSCHANGED;
1379 }
1380
1381 infoPtr->nPageSize = (infoPtr->nRangeMax-infoPtr->nRangeMin)/5;
1382 if (infoPtr->nPageSize == 0) infoPtr->nPageSize = 1;
1383 TRACKBAR_RecalculateTics(hwnd,infoPtr,TRUE);
1384
1385 if (wParam) TRACKBAR_Refresh(hwnd);
1386
1387 return 0;
1388}
1389
1390
1391static LRESULT
1392TRACKBAR_SetRangeMin (HWND hwnd, WPARAM wParam, LPARAM lParam)
1393{
1394 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1395
1396 if ((INT)lParam >= infoPtr->nRangeMax) return 0;
1397 if (infoPtr->nRangeMin == (INT)lParam) return 0;
1398
1399 infoPtr->nRangeMin = (INT)lParam;
1400 if (infoPtr->nPos < infoPtr->nRangeMin)
1401 {
1402 infoPtr->nPos = infoPtr->nRangeMin;
1403 infoPtr->flags |=TB_THUMBPOSCHANGED;
1404 }
1405
1406 infoPtr->nPageSize = (infoPtr->nRangeMax-infoPtr->nRangeMin)/5;
1407 if (infoPtr->nPageSize == 0) infoPtr->nPageSize = 1;
1408 TRACKBAR_RecalculateTics(hwnd,infoPtr,TRUE);
1409
1410 if (wParam) TRACKBAR_Refresh(hwnd);
1411
1412 return 0;
1413}
1414
1415
1416static LRESULT
1417TRACKBAR_SetTicFreq (HWND hwnd, WPARAM wParam)
1418{
1419 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1420
1421 if (infoPtr->uTicFreq == (UINT)wParam) return 0;
1422
1423 if (!(GetWindowLongA(hwnd,GWL_STYLE) & TBS_AUTOTICKS)) return 0;
1424
1425 infoPtr->uTicFreq = (UINT)wParam;
1426
1427 TRACKBAR_RecalculateTics(hwnd,infoPtr,FALSE);
1428
1429 TRACKBAR_Refresh(hwnd);
1430
1431 return 0;
1432}
1433
1434
1435static LRESULT
1436TRACKBAR_SetSel(HWND hwnd,WPARAM wParam,LPARAM lParam)
1437{
1438 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1439 INT newMin,newMax,oldMin,oldMax;
1440
1441 oldMin = infoPtr->nSelMin;
1442 oldMax = infoPtr->nSelMax;
1443 newMin = (INT)LOWORD(lParam);
1444 newMax = (INT)HIWORD(lParam);
1445
1446 if (infoPtr->nSelMin == newMin && infoPtr->nSelMax == newMax) return 0;
1447 infoPtr->nSelMin = newMin;
1448 infoPtr->nSelMax = newMax;
1449
1450 if (infoPtr->nSelMin < infoPtr->nRangeMin) infoPtr->nSelMin = infoPtr->nRangeMin;
1451 if (infoPtr->nSelMin > infoPtr->nRangeMax) infoPtr->nSelMin = infoPtr->nRangeMax;
1452 if (infoPtr->nSelMax > infoPtr->nRangeMax) infoPtr->nSelMax = infoPtr->nRangeMax;
1453 if (infoPtr->nSelMax < infoPtr->nRangeMin) infoPtr->nSelMax = infoPtr->nRangeMin;
1454
1455 if (infoPtr->nSelMin > infoPtr->nSelMax) infoPtr->nSelMin = infoPtr->nSelMax;
1456
1457 if (!GetWindowLongA(hwnd, GWL_STYLE) & TBS_ENABLESELRANGE) return 0;
1458
1459 if (oldMin != newMin || oldMax != newMax)
1460 {
1461 infoPtr->flags |= TB_SELECTIONCHANGED;
1462 if (wParam) TRACKBAR_Refresh(hwnd);
1463 }
1464
1465 return 0;
1466}
1467
1468
1469static LRESULT
1470TRACKBAR_SetSelEnd (HWND hwnd, WPARAM wParam, LPARAM lParam)
1471{
1472 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1473 INT oldMax;
1474
1475 if (infoPtr->nSelMax == (INT)lParam) return 0;
1476
1477 oldMax = infoPtr->nSelMax;
1478 infoPtr->nSelMax = (INT)lParam;
1479
1480 if (infoPtr->nSelMax > infoPtr->nRangeMax) infoPtr->nSelMax = infoPtr->nRangeMax;
1481 if (infoPtr->nSelMax < infoPtr->nRangeMin) infoPtr->nSelMax = infoPtr->nRangeMin;
1482
1483 if (infoPtr->nSelMin > infoPtr->nSelMax) infoPtr->nSelMin = infoPtr->nSelMax;
1484
1485 if (!GetWindowLongA(hwnd,GWL_STYLE) & TBS_ENABLESELRANGE) return 0;
1486
1487 if (oldMax != infoPtr->nSelMax)
1488 {
1489 infoPtr->flags |= TB_SELECTIONCHANGED;
1490 if (wParam) TRACKBAR_Refresh(hwnd);
1491 }
1492
1493 return 0;
1494}
1495
1496
1497static LRESULT
1498TRACKBAR_SetSelStart (HWND hwnd, WPARAM wParam, LPARAM lParam)
1499{
1500 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1501 INT oldMin;
1502
1503 if (infoPtr->nSelMin == (INT)lParam) return 0;
1504
1505 oldMin = infoPtr->nSelMin;
1506 infoPtr->nSelMin = (INT)lParam;
1507
1508 if (infoPtr->nSelMin < infoPtr->nRangeMin) infoPtr->nSelMin = infoPtr->nRangeMin;
1509 if (infoPtr->nSelMin > infoPtr->nRangeMax) infoPtr->nSelMin = infoPtr->nRangeMax;
1510
1511 if (infoPtr->nSelMin > infoPtr->nSelMax) infoPtr->nSelMin = infoPtr->nSelMax;
1512
1513 if (!GetWindowLongA(hwnd,GWL_STYLE) & TBS_ENABLESELRANGE) return 0;
1514
1515 if (oldMin != infoPtr->nSelMin)
1516 {
1517 infoPtr->flags |= TB_SELECTIONCHANGED;
1518 if (wParam) TRACKBAR_Refresh(hwnd);
1519 }
1520
1521 return 0;
1522}
1523
1524
1525static LRESULT
1526TRACKBAR_SetThumbLength (HWND hwnd, WPARAM wParam, LPARAM lParam)
1527{
1528 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
1529
1530 if (infoPtr->uThumbLen == (UINT)wParam) return 0;
1531
1532 if (GetWindowLongA(hwnd,GWL_STYLE) & TBS_FIXEDLENGTH) return 0;
1533
1534 infoPtr->uThumbLen = MAX((UINT)wParam,THUMB_MINLEN);
1535 infoPtr->flags |= TB_THUMBSIZECHANGED | TB_THUMBCHANGED;
1536
1537 TRACKBAR_Refresh(hwnd);
1538
1539 return 0;
1540}
1541
1542static void TRACKBAR_QuickSort(LPLONG list,INT lo,INT hi)
1543{
1544 INT i,j,x,y;
1545
1546 i = lo;
1547 j = hi;
1548 x = list[(lo+hi)/2];
1549 do
1550 {
1551 while (list[i] < x) i++;
1552 while (x < list[j]) j--;
1553 if (i <= j)
1554 {
1555 y = list[i];
1556 list[i] = list[j];
1557 list[j] = y;
1558 i++;
1559 j--;
1560 }
1561 } while (i <= j);
1562 if (lo < j) TRACKBAR_QuickSort(list,lo,j);
1563 if (i < hi) TRACKBAR_QuickSort(list,i,hi);
1564}
1565
1566static LRESULT
1567TRACKBAR_SetTic (HWND hwnd, WPARAM wParam, LPARAM lParam)
1568{
1569 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1570 INT nPos = (INT)lParam;
1571 INT x;
1572
1573 if (!(GetWindowLongA(hwnd, GWL_STYLE) & (TBS_AUTOTICKS | TBS_NOTICKS))) return 0;
1574
1575 if ((nPos < infoPtr->nRangeMin) || (nPos > infoPtr->nRangeMax)) return FALSE;
1576
1577 //Check if tick exists
1578 for (x = 0;x < infoPtr->uNumTics;x++)
1579 {
1580 if (infoPtr->tics[x] == nPos) return TRUE; //value is ok
1581 }
1582
1583 infoPtr->uNumTics++;
1584 infoPtr->tics = COMCTL32_ReAlloc(infoPtr->tics,infoPtr->uNumTics*sizeof(DWORD));
1585 infoPtr->tics[infoPtr->uNumTics-1] = nPos;
1586
1587 //Quicksort the list
1588 TRACKBAR_QuickSort(infoPtr->tics,0,infoPtr->uNumTics-1);
1589
1590 TRACKBAR_Refresh(hwnd);
1591
1592 return TRUE;
1593}
1594
1595
1596static LRESULT
1597TRACKBAR_SetTipSide (HWND hwnd, WPARAM wParam, LPARAM lParam)
1598{
1599 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
1600 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
1601 INT fTemp = infoPtr->fLocation;
1602
1603 if (dwStyle & TBS_VERT)
1604 {
1605 if (wParam == TBTS_LEFT || wParam == TBTS_RIGHT) infoPtr->fLocation = (INT)wParam;
1606 } else
1607 {
1608 if (wParam == TBTS_TOP || wParam == TBTS_BOTTOM) infoPtr->fLocation = (INT)wParam;
1609 }
1610
1611 return fTemp;
1612}
1613
1614
1615static LRESULT
1616TRACKBAR_SetToolTips (HWND hwnd, WPARAM wParam, LPARAM lParam)
1617{
1618 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1619
1620 infoPtr->hwndToolTip = (HWND)wParam;
1621
1622 return 0;
1623}
1624
1625
1626/* case TBM_SETUNICODEFORMAT: */
1627
1628
1629static LRESULT
1630TRACKBAR_InitializeThumb (HWND hwnd)
1631{
1632 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1633 RECT clientRect;
1634 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
1635 INT scaleSize;
1636
1637 GetClientRect(hwnd,&clientRect);
1638 infoPtr->uThumbLen = THUMB_LEN; /* initial thumb length */
1639
1640 scaleSize = 2*BORDER_SIZE;
1641 if (dwStyle & TBS_NOTICKS) scaleSize += 0;
1642 else if (dwStyle & TBS_BOTH) scaleSize += 2*(SCALE_SIZE+SCALE_SPACE);
1643 else scaleSize += SCALE_SIZE+SCALE_SPACE;
1644
1645 if (dwStyle & TBS_VERT)
1646 {
1647 INT width = clientRect.right-clientRect.left;
1648
1649 if (infoPtr->uThumbLen+scaleSize > width) infoPtr->uThumbLen = MAX(width-scaleSize,THUMB_MINLEN);
1650 } else
1651 {
1652 INT height = clientRect.bottom-clientRect.top;
1653
1654 if (infoPtr->uThumbLen+scaleSize > height) infoPtr->uThumbLen = MAX(height-scaleSize,THUMB_MINLEN);
1655 }
1656
1657 TRACKBAR_CalcChannel(hwnd,infoPtr);
1658 TRACKBAR_CalcThumb(hwnd,infoPtr);
1659
1660 infoPtr->flags &= ~TB_SELECTIONCHANGED;
1661
1662 return 0;
1663}
1664
1665
1666static LRESULT
1667TRACKBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
1668{
1669 TRACKBAR_INFO *infoPtr;
1670 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
1671
1672 infoPtr = (TRACKBAR_INFO *)COMCTL32_Alloc(sizeof(TRACKBAR_INFO));
1673 SetWindowLongA(hwnd,0,(DWORD)infoPtr);
1674
1675 /* set default values */
1676 infoPtr->nRangeMin = 0;
1677 infoPtr->nRangeMax = 100;
1678 infoPtr->nLineSize = 1;
1679 infoPtr->nPageSize = 20;
1680 infoPtr->nSelMin = 0;
1681 infoPtr->nSelMax = 0;
1682 infoPtr->nPos = 0;
1683
1684 infoPtr->uNumTics = 0; /* start and end tic are not included in count*/
1685 infoPtr->uTicFreq = 1;
1686 infoPtr->tics = NULL;
1687 infoPtr->clrBk = GetSysColor(COLOR_3DFACE);
1688 infoPtr->hwndNotify = GetParent(hwnd);
1689
1690 infoPtr->hwndBuddyLA = 0;
1691 infoPtr->hwndBuddyRB = 0;
1692 infoPtr->flags = 0;
1693 infoPtr->bFocus = FALSE;
1694
1695 if (dwStyle & TBS_VERT)
1696 {
1697 infoPtr->fLocation = (dwStyle & TBS_LEFT) ? TBTS_RIGHT : TBTS_LEFT;
1698 } else
1699 {
1700 infoPtr->fLocation = (dwStyle & TBS_TOP) ? TBTS_BOTTOM : TBTS_TOP;
1701 }
1702
1703 TRACKBAR_InitializeThumb (hwnd);
1704
1705 /* Create tooltip control */
1706 if (dwStyle & TBS_TOOLTIPS)
1707 {
1708 TTTOOLINFOA ti;
1709
1710 infoPtr->hwndToolTip =
1711 CreateWindowExA (WS_EX_TOOLWINDOW,TOOLTIPS_CLASSA,NULL,WS_POPUP,
1712 CW_USEDEFAULT,CW_USEDEFAULT,
1713 CW_USEDEFAULT,CW_USEDEFAULT,
1714 hwnd,0,0,0);
1715
1716 /* Send NM_TOOLTIPSCREATED notification */
1717 if (infoPtr->hwndToolTip)
1718 {
1719 NMTOOLTIPSCREATED nmttc;
1720
1721 nmttc.hdr.hwndFrom = hwnd;
1722 nmttc.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID);
1723 nmttc.hdr.code = NM_TOOLTIPSCREATED;
1724 nmttc.hwndToolTips = infoPtr->hwndToolTip;
1725
1726 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmttc.hdr.idFrom,(LPARAM)&nmttc);
1727 }
1728
1729 ZeroMemory(&ti,sizeof(TTTOOLINFOA));
1730 ti.cbSize = sizeof(TTTOOLINFOA);
1731 ti.uFlags = TTF_TRACK | TTF_CENTERTIP | TTF_ABSOLUTE;
1732 ti.hwnd = hwnd;
1733 ti.uId = 0;
1734 ti.lpszText = ""; /* LPSTR_TEXTCALLBACK */
1735 SetRectEmpty(&ti.rect);
1736
1737 SendMessageA(infoPtr->hwndToolTip,TTM_ADDTOOLA,0,(LPARAM)&ti);
1738 } else infoPtr->hwndToolTip = 0;
1739
1740 return 0;
1741}
1742
1743
1744static LRESULT
1745TRACKBAR_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
1746{
1747 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1748
1749 /* delete tooltip control */
1750 if (infoPtr->hwndToolTip) DestroyWindow(infoPtr->hwndToolTip);
1751
1752 COMCTL32_Free(infoPtr->tics);
1753 COMCTL32_Free(infoPtr);
1754
1755 return 0;
1756}
1757
1758static VOID TRACKBAR_CalcToolTipPos(HWND hwnd,DWORD dwStyle,TRACKBAR_INFO *infoPtr,POINT *pt)
1759{
1760 if (dwStyle & TBS_VERT)
1761 {
1762 if (infoPtr->fLocation == TBTS_RIGHT)
1763 {
1764 pt->x = infoPtr->rcFullThumb.right;
1765 pt->y = infoPtr->rcFullThumb.top+(infoPtr->rcFullThumb.bottom-infoPtr->rcFullThumb.top)/2;
1766 } else
1767 {
1768 pt->x = infoPtr->rcFullThumb.left-15; //CB: optimize!
1769 pt->y = infoPtr->rcFullThumb.top+(infoPtr->rcFullThumb.bottom-infoPtr->rcFullThumb.top)/2;
1770 }
1771
1772 } else
1773 {
1774 if (infoPtr->fLocation == TBTS_TOP)
1775 {
1776 pt->x = infoPtr->rcFullThumb.left+(infoPtr->rcFullThumb.right-infoPtr->rcFullThumb.left)/2;
1777 pt->y = infoPtr->rcFullThumb.top-15; //CB: optimize!
1778 } else
1779 {
1780 pt->x = infoPtr->rcFullThumb.left+(infoPtr->rcFullThumb.right-infoPtr->rcFullThumb.left)/2;
1781 pt->y = infoPtr->rcFullThumb.bottom;
1782 }
1783 }
1784 ClientToScreen(hwnd,pt);
1785}
1786
1787static LRESULT
1788TRACKBAR_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
1789{
1790 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1791 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
1792 int clickPlace,prevPos,vertical;
1793 DOUBLE clickPos;
1794 RECT thumb,fullThumb;
1795 POINT clickPoint;
1796
1797 SetFocus (hwnd);
1798
1799 vertical = dwStyle & TBS_VERT;
1800 clickPoint.x = (INT)LOWORD(lParam);
1801 clickPoint.y = (INT)HIWORD(lParam);
1802
1803
1804 if (vertical) clickPlace = clickPoint.y;
1805 else clickPlace = clickPoint.x;
1806
1807 //Button down on thumb?
1808 thumb = infoPtr->rcThumb;
1809 fullThumb = infoPtr->rcFullThumb;
1810 if ((vertical &&
1811 clickPoint.y >= thumb.top &&
1812 clickPoint.y <= thumb.bottom &&
1813 ((dwStyle & TBS_BOTH &&
1814 clickPoint.x >= thumb.left &&
1815 clickPoint.x <= thumb.right
1816 ) ||
1817 (dwStyle & TBS_LEFT &&
1818 clickPoint.x <= thumb.right &&
1819 (clickPoint.x >= thumb.left ||
1820 (clickPoint.x >= fullThumb.left &&
1821 (thumb.left-clickPoint.x <= clickPoint.y-thumb.top &&
1822 thumb.left-clickPoint.x <= thumb.bottom-clickPoint.y
1823 )
1824 )
1825 )
1826 ) ||
1827 (!(dwStyle & (TBS_BOTH | TBS_LEFT)) &&
1828 clickPoint.x >= thumb.left &&
1829 (clickPoint.x <= thumb.right ||
1830 (clickPoint.x <= fullThumb.right &&
1831 (clickPoint.x-thumb.right <= clickPoint.y-thumb.top &&
1832 clickPoint.x-thumb.right <= thumb.bottom-clickPoint.y
1833 )
1834 )
1835 )
1836 ))
1837 ) ||
1838 (!vertical &&
1839 clickPoint.x >= thumb.left &&
1840 clickPoint.x <= thumb.right &&
1841 ((dwStyle & TBS_BOTH &&
1842 clickPoint.y >= thumb.top &&
1843 clickPoint.y <= thumb.bottom
1844 ) ||
1845 (dwStyle & TBS_TOP &&
1846 clickPoint.y <= thumb.bottom &&
1847 (clickPoint.y >= thumb.top ||
1848 (clickPoint.y >= fullThumb.top &&
1849 (thumb.top-clickPoint.y <= clickPoint.x-thumb.left &&
1850 thumb.top-clickPoint.y <= thumb.right-clickPoint.x
1851 )
1852 )
1853 )
1854 ) ||
1855 (!(dwStyle & (TBS_BOTH | TBS_TOP)) &&
1856 clickPoint.y >= thumb.top &&
1857 (clickPoint.y <= thumb.bottom ||
1858 (clickPoint.y <= fullThumb.bottom &&
1859 (clickPoint.y-thumb.bottom <= clickPoint.x-thumb.left &&
1860 clickPoint.y-thumb.bottom <= thumb.right-clickPoint.x
1861 )
1862 )
1863 )
1864 ))
1865 ))
1866 {
1867 infoPtr->flags |= TB_DRAG_MODE;
1868 if (dwStyle & TBS_TOOLTIPS)
1869 { /* enable tooltip */
1870 TTTOOLINFOA ti;
1871 POINT pt;
1872 char buf[80];
1873
1874 TRACKBAR_CalcToolTipPos(hwnd,dwStyle,infoPtr,&pt);
1875 SendMessageA(infoPtr->hwndToolTip,TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(pt.x,pt.y));
1876
1877 ti.cbSize = sizeof(TTTOOLINFOA);
1878 ti.uId = 0;
1879 ti.hwnd = (UINT)hwnd;
1880 ti.hinst = 0;
1881 sprintf (buf,"%d",infoPtr->nPos);
1882 ti.lpszText = (LPSTR)buf;
1883
1884 infoPtr->flags |= TB_SHOW_TOOLTIP;
1885 SetCapture(hwnd);
1886
1887 SendMessageA(infoPtr->hwndToolTip,TTM_UPDATETIPTEXTA,0,(LPARAM)&ti);
1888 SendMessageA(infoPtr->hwndToolTip,TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti);
1889 }
1890 SetCapture(hwnd);
1891 TRACKBAR_UpdateThumbPosition(hwnd,infoPtr->nPos,TRUE); //change arrow color
1892 return 0;
1893 }
1894 else if ((vertical &&
1895 (clickPoint.y >= thumb.top) &&
1896 (clickPoint.y <= thumb.bottom)) ||
1897 (!vertical &&
1898 (clickPoint.x >= thumb.left) &&
1899 (clickPoint.x <= thumb.right)))
1900 {
1901 //ScrollMode
1902 infoPtr->flags |= TB_SCROLL_MODE;
1903 SetCapture(hwnd);
1904 SetTimer(hwnd,SCROLL_TIMER_ID,SCROLL_TIME,NULL);
1905
1906 return 0;
1907 }
1908
1909 clickPos = TRACKBAR_ConvertPlaceToPosition(infoPtr,clickPlace,vertical);
1910 prevPos = infoPtr->nPos;
1911
1912 if (clickPos > prevPos)
1913 { /* similar to VK_NEXT */
1914 infoPtr->nPos += infoPtr->nPageSize;
1915 if (infoPtr->nPos > infoPtr->nRangeMax) infoPtr->nPos = infoPtr->nRangeMax;
1916 if (prevPos != infoPtr->nPos) TRACKBAR_SendNotify(hwnd,TB_PAGEUP);
1917 } else
1918 { /* similar to VK_PRIOR */
1919 infoPtr->nPos -= infoPtr->nPageSize;
1920 if (infoPtr->nPos < infoPtr->nRangeMin) infoPtr->nPos = infoPtr->nRangeMin;
1921 if (prevPos != infoPtr->nPos) TRACKBAR_SendNotify(hwnd,TB_PAGEDOWN);
1922 }
1923
1924 if (prevPos != infoPtr->nPos)
1925 {
1926 infoPtr->flags |= TB_THUMBPOSCHANGED;
1927 TRACKBAR_UpdateThumbPosition(hwnd,prevPos,TRUE);
1928 }
1929
1930 //ScrollMode
1931 infoPtr->flags |= TB_SCROLL_MODE;
1932 SetCapture(hwnd);
1933 SetTimer(hwnd,SCROLL_TIMER_ID,SCROLL_TIME,NULL);
1934
1935 return 0;
1936}
1937
1938
1939static LRESULT
1940TRACKBAR_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
1941{
1942 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
1943
1944 if (infoPtr->flags & TB_DRAG_MODE)
1945 {
1946 TRACKBAR_SendNotify(hwnd,TB_ENDTRACK);
1947
1948 infoPtr->flags &= ~TB_DRAG_MODE;
1949
1950 if (GetCapture() == hwnd)
1951 {
1952 NMHDR nmhdr;
1953
1954 nmhdr.hwndFrom = hwnd;
1955 nmhdr.idFrom = GetWindowLongA(hwnd,GWL_ID);
1956 nmhdr.code = NM_RELEASEDCAPTURE;
1957
1958 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.idFrom,(LPARAM)&nmhdr);
1959
1960 ReleaseCapture();
1961 }
1962
1963 TRACKBAR_UpdateThumbPosition(hwnd,infoPtr->nPos,TRUE); //change arrow color
1964 }
1965
1966 if (infoPtr->flags & TB_SCROLL_MODE)
1967 {
1968 infoPtr->flags &= ~TB_SCROLL_MODE;
1969
1970 if (GetCapture() == hwnd)
1971 {
1972 NMHDR nmhdr;
1973
1974 nmhdr.hwndFrom = hwnd;
1975 nmhdr.idFrom = GetWindowLongA(hwnd,GWL_ID);
1976 nmhdr.code = NM_RELEASEDCAPTURE;
1977
1978 SendMessageA(GetParent(hwnd),WM_NOTIFY,(WPARAM)nmhdr.idFrom,(LPARAM)&nmhdr);
1979
1980 ReleaseCapture();
1981 }
1982
1983 KillTimer(hwnd,SCROLL_TIMER_ID);
1984 }
1985
1986 if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_TOOLTIPS)
1987 { /* disable tooltip */
1988 TTTOOLINFOA ti;
1989
1990 ti.cbSize = sizeof(TTTOOLINFOA);
1991 ti.uId = 0;
1992 ti.hwnd = (UINT)hwnd;
1993
1994 infoPtr->flags &= ~TB_SHOW_TOOLTIP;
1995 SendMessageA (infoPtr->hwndToolTip,TTM_TRACKACTIVATE,(WPARAM)FALSE,(LPARAM)&ti);
1996 }
1997
1998 return 0;
1999}
2000
2001
2002static LRESULT TRACKBAR_Timer(HWND hwnd,WPARAM wParam,LPARAM lParam)
2003{
2004 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
2005 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
2006 POINT mousePoint;
2007 INT mousePlace,prevPos,newPos,vertical;
2008 DOUBLE mousePos;
2009
2010 GetCursorPos(&mousePoint);
2011 ScreenToClient(hwnd,&mousePoint);
2012
2013 vertical = dwStyle & TBS_VERT;
2014 if (vertical) mousePlace = mousePoint.y;
2015 else mousePlace = mousePoint.x;
2016
2017 mousePos = TRACKBAR_ConvertPlaceToPosition(infoPtr,mousePlace,vertical);
2018 prevPos = infoPtr->nPos;
2019
2020 if (mousePos > (INT)mousePos+0.5) newPos = mousePos+1;
2021 else newPos = mousePos;
2022 if (newPos == prevPos) return 0;
2023
2024 if (newPos > prevPos)
2025 { /* similar to VK_NEXT */
2026 infoPtr->nPos += infoPtr->nPageSize;
2027 if (infoPtr->nPos > infoPtr->nRangeMax) infoPtr->nPos = infoPtr->nRangeMax;
2028 if (prevPos != infoPtr->nPos) TRACKBAR_SendNotify(hwnd,TB_PAGEUP);
2029 } else
2030 { /* similar to VK_PRIOR */
2031 infoPtr->nPos -= infoPtr->nPageSize;
2032 if (infoPtr->nPos < infoPtr->nRangeMin) infoPtr->nPos = infoPtr->nRangeMin;
2033 if (prevPos != infoPtr->nPos) TRACKBAR_SendNotify(hwnd,TB_PAGEDOWN);
2034 }
2035
2036 if (prevPos != infoPtr->nPos)
2037 {
2038 infoPtr->flags |= TB_THUMBPOSCHANGED;
2039 TRACKBAR_UpdateThumbPosition(hwnd,prevPos,FALSE);
2040 }
2041
2042 return 0;
2043}
2044
2045static LRESULT
2046TRACKBAR_CaptureChanged (HWND hwnd, WPARAM wParam, LPARAM lParam)
2047{
2048 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
2049
2050 if (infoPtr->flags & TB_DRAGPOSVALID)
2051 {
2052 int lastPos = infoPtr->nPos;
2053 infoPtr->nPos = infoPtr->dragPos;
2054 if (lastPos != infoPtr->nPos) TRACKBAR_UpdateThumbPosition(hwnd,lastPos,TRUE);
2055 }
2056
2057 infoPtr->flags &= ~ TB_DRAGPOSVALID;
2058
2059 if (infoPtr->flags & TB_SCROLL_MODE)
2060 {
2061 infoPtr->flags &= ~TB_SCROLL_MODE;
2062 KillTimer(hwnd,SCROLL_TIMER_ID);
2063 }
2064
2065 TRACKBAR_SendNotify(hwnd,TB_ENDTRACK);
2066 return 0;
2067}
2068
2069
2070static LRESULT
2071TRACKBAR_Paint (HWND hwnd, WPARAM wParam)
2072{
2073 HDC hdc;
2074 PAINTSTRUCT ps;
2075
2076 hdc = wParam == 0 ? BeginPaint(hwnd,&ps) : (HDC)wParam;
2077 TRACKBAR_Draw(hwnd,hdc);
2078 if (!wParam) EndPaint(hwnd,&ps);
2079 return 0;
2080}
2081
2082
2083static LRESULT
2084TRACKBAR_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
2085{
2086 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
2087 HDC hdc;
2088 RECT rcClient;
2089
2090// TRACE (trackbar,"\n");
2091 if (!infoPtr->bFocus)
2092 {
2093 infoPtr->bFocus = TRUE;
2094
2095 GetClientRect (hwnd,&rcClient);
2096 hdc = GetDC (hwnd);
2097 DrawFocusRect (hdc,&rcClient);
2098 ReleaseDC(hwnd,hdc);
2099
2100 }
2101 return 0;
2102}
2103
2104static LRESULT
2105TRACKBAR_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
2106{
2107 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
2108 HDC hdc;
2109 RECT rcClient;
2110
2111// TRACE (trackbar,"\n");
2112
2113 infoPtr->flags &= ~TB_DRAG_MODE;
2114 if (infoPtr->bFocus)
2115 {
2116 infoPtr->bFocus = FALSE;
2117
2118 GetClientRect(hwnd,&rcClient);
2119 hdc = GetDC (hwnd);
2120 DrawFocusRect(hdc,&rcClient); //XOR removes
2121 ReleaseDC(hwnd,hdc);
2122 }
2123
2124 return 0;
2125}
2126
2127static LRESULT
2128TRACKBAR_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
2129{
2130 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
2131
2132 TRACKBAR_CalcChannel (hwnd, infoPtr);
2133 TRACKBAR_AlignBuddies (hwnd, infoPtr);
2134
2135 return 0;
2136}
2137
2138
2139static BOOL
2140TRACKBAR_SendNotify (HWND hwnd, UINT code)
2141{
2142// TRACE (trackbar, "%x\n",code);
2143
2144 if (GetWindowLongA(hwnd, GWL_STYLE) & TBS_VERT)
2145 {
2146 return (BOOL)SendMessageA(GetParent(hwnd),WM_VSCROLL,(WPARAM)code,(LPARAM)hwnd);
2147 } else
2148 {
2149 return (BOOL)SendMessageA(GetParent(hwnd),WM_HSCROLL,(WPARAM)code,(LPARAM)hwnd);
2150 }
2151}
2152
2153
2154static LRESULT
2155TRACKBAR_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)
2156{
2157 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
2158 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
2159 SHORT clickPlace;
2160 DOUBLE dragPos;
2161
2162// TRACE (trackbar, "%x\n",wParam);
2163
2164 if (!(infoPtr->flags & TB_DRAG_MODE)) return TRUE;
2165
2166 if (dwStyle & TBS_VERT) clickPlace = (SHORT)HIWORD(lParam);
2167 else clickPlace = (SHORT)LOWORD(lParam);
2168
2169 dragPos = TRACKBAR_ConvertPlaceToPosition(infoPtr,clickPlace,dwStyle & TBS_VERT);
2170 if (dragPos > ((INT)dragPos)+0.5) infoPtr->dragPos = dragPos + 1;
2171 else infoPtr->dragPos = dragPos;
2172
2173 if (infoPtr->nPos == infoPtr->dragPos) return TRUE; //nothing changed
2174
2175 infoPtr->flags |= TB_DRAGPOSVALID;
2176
2177 TRACKBAR_UpdateThumbPosition(hwnd,infoPtr->nPos,FALSE); //infoPtr->nPos now set
2178
2179 TRACKBAR_SendNotify(hwnd,TB_THUMBTRACK | (infoPtr->nPos >> 16));
2180
2181 if (infoPtr->flags & TB_SHOW_TOOLTIP)
2182 {
2183 POINT pt;
2184 TTTOOLINFOA ti;
2185 char buf[80];
2186
2187 ti.cbSize = sizeof(TTTOOLINFOA);
2188 ti.hwnd = hwnd;
2189 ti.uId = 0;
2190 ti.hinst = 0;
2191 sprintf (buf,"%d",infoPtr->nPos);
2192 ti.lpszText = (LPSTR)buf;
2193
2194 SendMessageA(infoPtr->hwndToolTip,TTM_UPDATETIPTEXTA,0,(LPARAM)&ti);
2195 TRACKBAR_CalcToolTipPos(hwnd,dwStyle,infoPtr,&pt);
2196 SendMessageA(infoPtr->hwndToolTip,TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(pt.x,pt.y));
2197 }
2198
2199 return TRUE;
2200}
2201
2202
2203static LRESULT
2204TRACKBAR_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
2205{
2206 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
2207 INT pos;
2208
2209// TRACE (trackbar, "%x\n",wParam);
2210
2211 if (infoPtr->flags & TB_DRAG_MODE) return TRUE;
2212
2213 pos = infoPtr->nPos;
2214 switch (wParam) {
2215 case VK_LEFT:
2216 case VK_UP:
2217 if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE;
2218 infoPtr->nPos -= infoPtr->nLineSize;
2219 if (infoPtr->nPos < infoPtr->nRangeMin)
2220 infoPtr->nPos = infoPtr->nRangeMin;
2221 TRACKBAR_SendNotify(hwnd,TB_LINEUP);
2222 break;
2223 case VK_RIGHT:
2224 case VK_DOWN:
2225 if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE;
2226 infoPtr->nPos += infoPtr->nLineSize;
2227 if (infoPtr->nPos > infoPtr->nRangeMax)
2228 infoPtr->nPos = infoPtr->nRangeMax;
2229 TRACKBAR_SendNotify (hwnd, TB_LINEDOWN);
2230 break;
2231 case VK_NEXT:
2232 if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE;
2233 infoPtr->nPos += infoPtr->nPageSize;
2234 if (infoPtr->nPos > infoPtr->nRangeMax)
2235 infoPtr->nPos = infoPtr->nRangeMax;
2236 TRACKBAR_SendNotify (hwnd, TB_PAGEUP);
2237 break;
2238 case VK_PRIOR:
2239 if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE;
2240 infoPtr->nPos -= infoPtr->nPageSize;
2241 if (infoPtr->nPos < infoPtr->nRangeMin)
2242 infoPtr->nPos = infoPtr->nRangeMin;
2243 TRACKBAR_SendNotify (hwnd, TB_PAGEDOWN);
2244 break;
2245 case VK_HOME:
2246 if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE;
2247 infoPtr->nPos = infoPtr->nRangeMin;
2248 TRACKBAR_SendNotify (hwnd, TB_TOP);
2249 break;
2250 case VK_END:
2251 if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE;
2252 infoPtr->nPos = infoPtr->nRangeMax;
2253 TRACKBAR_SendNotify (hwnd, TB_BOTTOM);
2254 break;
2255 }
2256
2257 if (pos != infoPtr->nPos)
2258 {
2259 infoPtr->flags |= TB_THUMBPOSCHANGED;
2260 TRACKBAR_UpdateThumbPosition(hwnd,pos,FALSE);
2261 }
2262
2263 return TRUE;
2264}
2265
2266
2267static LRESULT
2268TRACKBAR_KeyUp (HWND hwnd, WPARAM wParam)
2269{
2270 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(hwnd);
2271
2272 if (infoPtr->flags & TB_DRAG_MODE) return TRUE;
2273
2274 switch (wParam) {
2275 case VK_LEFT:
2276 case VK_UP:
2277 case VK_RIGHT:
2278 case VK_DOWN:
2279 case VK_NEXT:
2280 case VK_PRIOR:
2281 case VK_HOME:
2282 case VK_END:
2283 TRACKBAR_SendNotify (hwnd, TB_ENDTRACK);
2284 }
2285 return TRUE;
2286}
2287
2288
2289static LRESULT WINAPI
2290TRACKBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2291{
2292 switch (uMsg)
2293 {
2294 case TBM_CLEARSEL:
2295 return TRACKBAR_ClearSel (hwnd, wParam, lParam);
2296
2297 case TBM_CLEARTICS:
2298 return TRACKBAR_ClearTics (hwnd, wParam, lParam);
2299
2300 case TBM_GETBUDDY:
2301 return TRACKBAR_GetBuddy (hwnd, wParam, lParam);
2302
2303 case TBM_GETCHANNELRECT:
2304 return TRACKBAR_GetChannelRect (hwnd, wParam, lParam);
2305
2306 case TBM_GETLINESIZE:
2307 return TRACKBAR_GetLineSize (hwnd, wParam, lParam);
2308
2309 case TBM_GETNUMTICS:
2310 return TRACKBAR_GetNumTics (hwnd, wParam, lParam);
2311
2312 case TBM_GETPAGESIZE:
2313 return TRACKBAR_GetPageSize (hwnd, wParam, lParam);
2314
2315 case TBM_GETPOS:
2316 return TRACKBAR_GetPos (hwnd, wParam, lParam);
2317
2318 case TBM_GETPTICS:
2319 return TRACKBAR_GetPTics (hwnd);
2320
2321 case TBM_GETRANGEMAX:
2322 return TRACKBAR_GetRangeMax (hwnd, wParam, lParam);
2323
2324 case TBM_GETRANGEMIN:
2325 return TRACKBAR_GetRangeMin (hwnd, wParam, lParam);
2326
2327 case TBM_GETSELEND:
2328 return TRACKBAR_GetSelEnd (hwnd, wParam, lParam);
2329
2330 case TBM_GETSELSTART:
2331 return TRACKBAR_GetSelStart (hwnd, wParam, lParam);
2332
2333 case TBM_GETTHUMBLENGTH:
2334 return TRACKBAR_GetThumbLength (hwnd, wParam, lParam);
2335
2336 case TBM_GETTHUMBRECT:
2337 return TRACKBAR_GetThumbRect (hwnd, wParam, lParam);
2338
2339 case TBM_GETTIC:
2340 return TRACKBAR_GetTic (hwnd, wParam, lParam);
2341
2342 case TBM_GETTICPOS:
2343 return TRACKBAR_GetTicPos (hwnd, wParam, lParam);
2344
2345 case TBM_GETTOOLTIPS:
2346 return TRACKBAR_GetToolTips (hwnd, wParam, lParam);
2347
2348/* case TBM_GETUNICODEFORMAT: */
2349
2350 case TBM_SETBUDDY:
2351 return TRACKBAR_SetBuddy (hwnd, wParam, lParam);
2352
2353 case TBM_SETLINESIZE:
2354 return TRACKBAR_SetLineSize (hwnd, wParam, lParam);
2355
2356 case TBM_SETPAGESIZE:
2357 return TRACKBAR_SetPageSize (hwnd, wParam, lParam);
2358
2359 case TBM_SETPOS:
2360 return TRACKBAR_SetPos (hwnd, wParam, lParam);
2361
2362 case TBM_SETRANGE:
2363 return TRACKBAR_SetRange (hwnd, wParam, lParam);
2364
2365 case TBM_SETRANGEMAX:
2366 return TRACKBAR_SetRangeMax (hwnd, wParam, lParam);
2367
2368 case TBM_SETRANGEMIN:
2369 return TRACKBAR_SetRangeMin (hwnd, wParam, lParam);
2370
2371 case TBM_SETSEL:
2372 return TRACKBAR_SetSel (hwnd, wParam, lParam);
2373
2374 case TBM_SETSELEND:
2375 return TRACKBAR_SetSelEnd (hwnd, wParam, lParam);
2376
2377 case TBM_SETSELSTART:
2378 return TRACKBAR_SetSelStart (hwnd, wParam, lParam);
2379
2380 case TBM_SETTHUMBLENGTH:
2381 return TRACKBAR_SetThumbLength (hwnd, wParam, lParam);
2382
2383 case TBM_SETTIC:
2384 return TRACKBAR_SetTic (hwnd, wParam, lParam);
2385
2386 case TBM_SETTICFREQ:
2387 return TRACKBAR_SetTicFreq (hwnd, wParam);
2388
2389 case TBM_SETTIPSIDE:
2390 return TRACKBAR_SetTipSide (hwnd, wParam, lParam);
2391
2392 case TBM_SETTOOLTIPS:
2393 return TRACKBAR_SetToolTips (hwnd, wParam, lParam);
2394
2395/* case TBM_SETUNICODEFORMAT: */
2396
2397
2398 case WM_CAPTURECHANGED:
2399 return TRACKBAR_CaptureChanged (hwnd, wParam, lParam);
2400
2401 case WM_CREATE:
2402 return TRACKBAR_Create (hwnd, wParam, lParam);
2403
2404 case WM_DESTROY:
2405 return TRACKBAR_Destroy (hwnd, wParam, lParam);
2406
2407/* case WM_ENABLE: */
2408
2409/* case WM_ERASEBKGND: */
2410/* return 0; */
2411
2412 case WM_GETDLGCODE:
2413 return DLGC_WANTARROWS;
2414
2415 case WM_KEYDOWN:
2416 return TRACKBAR_KeyDown (hwnd, wParam, lParam);
2417
2418 case WM_KEYUP:
2419 return TRACKBAR_KeyUp (hwnd, wParam);
2420
2421 case WM_LBUTTONDOWN:
2422 return TRACKBAR_LButtonDown (hwnd, wParam, lParam);
2423
2424 case WM_LBUTTONUP:
2425 return TRACKBAR_LButtonUp (hwnd, wParam, lParam);
2426
2427 case WM_TIMER:
2428 return TRACKBAR_Timer(hwnd,wParam,lParam);
2429
2430 case WM_MOUSEMOVE:
2431 return TRACKBAR_MouseMove (hwnd, wParam, lParam);
2432
2433 case WM_PAINT:
2434 return TRACKBAR_Paint (hwnd, wParam);
2435
2436 case WM_SETFOCUS:
2437 return TRACKBAR_SetFocus (hwnd, wParam, lParam);
2438
2439 case WM_KILLFOCUS:
2440 return TRACKBAR_KillFocus (hwnd, wParam, lParam);
2441
2442 case WM_SIZE:
2443 return TRACKBAR_Size (hwnd, wParam, lParam);
2444
2445 case WM_WININICHANGE:
2446 return TRACKBAR_InitializeThumb (hwnd);
2447
2448 default:
2449// if (uMsg >= WM_USER)
2450// ERR (trackbar, "unknown msg %04x wp=%08x lp=%08lx\n",
2451// uMsg, wParam, lParam);
2452 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
2453 }
2454 return 0;
2455}
2456
2457
2458VOID
2459TRACKBAR_Register (VOID)
2460{
2461 WNDCLASSA wndClass;
2462
2463 if (GlobalFindAtomA (TRACKBAR_CLASSA)) return;
2464
2465 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
2466 wndClass.style = CS_GLOBALCLASS;
2467 wndClass.lpfnWndProc = (WNDPROC)TRACKBAR_WindowProc;
2468 wndClass.cbClsExtra = 0;
2469 wndClass.cbWndExtra = sizeof(TRACKBAR_INFO *);
2470 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
2471 wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
2472 wndClass.lpszClassName = TRACKBAR_CLASSA;
2473
2474 RegisterClassA (&wndClass);
2475}
2476
2477
2478VOID
2479TRACKBAR_Unregister (VOID)
2480{
2481 if (GlobalFindAtomA (TRACKBAR_CLASSA))
2482 UnregisterClassA (TRACKBAR_CLASSA, (HINSTANCE)NULL);
2483}
2484
Note: See TracBrowser for help on using the repository browser.