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

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

trackbar: performance updates

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