4 * Copyright 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
5 * Copyright 1998 Alex Priem <alexp@sci.kun.nl>
12 * - more display code.
13 * - handle dragging slider better
14 * - better tic handling.
15 * - more notifications.
21 -TBM_SETRANGEMAX & TBM_SETRANGEMIN should only change the view of the
22 trackbar, not the actual amount of tics in the list.
23 -TBM_GETTIC & TBM_GETTICPOS shouldn't rely on infoPtr->tics being sorted.
24 -code currently only handles horizontal trackbars correct.
25 -TB_DRAGTIMER behaves wierd.
38 #define TRACKBAR_GetInfoPtr(wndPtr) ((TRACKBAR_INFO *)wndPtr->wExtra[0])
41 /* Used by TRACKBAR_Refresh to find out which parts of the control
42 need to be recalculated */
44 #define TB_THUMBPOSCHANGED 1
45 #define TB_THUMBSIZECHANGED 2
46 #define TB_THUMBCHANGED 3
47 #define TB_SELECTIONCHANGED 4
48 #define TB_DRAG_TIMER_SET 16
49 #define TB_DRAGPOSVALID 32
52 static BOOL32 TRACKBAR_SendNotify (WND *wndPtr, UINT32 code);
54 void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr)
59 if (infoPtr->uTicFreq)
60 nrTics=(infoPtr->nRangeMax - infoPtr->nRangeMin)/infoPtr->uTicFreq;
63 HeapFree (SystemHeap,0,infoPtr->tics);
69 if (nrTics!=infoPtr->uNumTics) {
70 infoPtr->tics=HeapReAlloc( SystemHeap, 0, infoPtr->tics,
71 (nrTics+1)*sizeof (DWORD));
72 infoPtr->uNumTics=nrTics;
74 infoPtr->uNumTics=nrTics;
75 tic=infoPtr->nRangeMin+infoPtr->uTicFreq;
76 for (i=0; i<nrTics; i++,tic+=infoPtr->uTicFreq)
81 /* converts from physical (mouse) position to logical position
82 (in range of trackbar) */
85 TRACKBAR_ConvertPlaceToPosition (TRACKBAR_INFO *infoPtr, int place)
87 double range,width,pos;
89 range=infoPtr->nRangeMax - infoPtr->nRangeMin;
90 width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
91 pos=(range*(place - infoPtr->rcChannel.left)) / width;
93 TRACE (trackbar,"%.2f\n",pos);
100 TRACKBAR_CalcChannel (WND *wndPtr, TRACKBAR_INFO *infoPtr)
103 RECT32 lpRect,*channel = & infoPtr->rcChannel;
105 GetClientRect32 (wndPtr->hwndSelf, &lpRect);
107 if (wndPtr->dwStyle & TBS_ENABLESELRANGE)
108 cyChannel = MAX(infoPtr->uThumbLen - 8, 4);
112 if (wndPtr->dwStyle & TBS_VERT) {
113 channel->top = lpRect.top + 8;
114 channel->bottom = lpRect.bottom - 8;
116 if (wndPtr->dwStyle & TBS_BOTH) {
117 channel->left = (lpRect.bottom - cyChannel) / 2;
118 channel->right = (lpRect.bottom + cyChannel) / 2;
120 else if (wndPtr->dwStyle & TBS_LEFT) {
121 channel->left = lpRect.left + 10;
122 channel->right = channel->left + cyChannel;
124 else { /* TBS_RIGHT */
125 channel->right = lpRect.right - 10;
126 channel->left = channel->right - cyChannel;
130 channel->left = lpRect.left + 8;
131 channel->right = lpRect.right - 8;
132 if (wndPtr->dwStyle & TBS_BOTH) {
133 channel->top = (lpRect.bottom - cyChannel) / 2;
134 channel->bottom = (lpRect.bottom + cyChannel) / 2;
136 else if (wndPtr->dwStyle & TBS_TOP) {
137 channel->top = lpRect.top + 10;
138 channel->bottom = channel->top + cyChannel;
140 else { /* TBS_BOTTOM */
141 channel->bottom = lpRect.bottom - 10;
142 channel->top = channel->bottom - cyChannel;
148 TRACKBAR_CalcThumb (WND *wndPtr, TRACKBAR_INFO *infoPtr)
154 thumb=&infoPtr->rcThumb;
155 range=infoPtr->nRangeMax - infoPtr->nRangeMin;
156 width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
158 thumb->left = infoPtr->rcChannel.left +
159 (width*infoPtr->nPos)/range - 5;
160 thumb->right = thumb->left + infoPtr->uThumbLen/3;
161 thumb->top = infoPtr->rcChannel.top - 1;
162 thumb->bottom = infoPtr->rcChannel.top + infoPtr->uThumbLen - 8;
166 TRACKBAR_CalcSelection (WND *wndPtr, TRACKBAR_INFO *infoPtr)
171 selection= & infoPtr->rcSelection;
172 range=infoPtr->nRangeMax - infoPtr->nRangeMin;
173 width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
176 selection->left = infoPtr->rcChannel.left +
177 (width*infoPtr->nSelMin)/range;
178 selection->right = infoPtr->rcChannel.left +
179 (width*infoPtr->nSelMax)/range;
180 selection->top = infoPtr->rcChannel.top + 2;
181 selection->bottom = infoPtr->rcChannel.bottom - 2;
184 SetRectEmpty32 (selection);
190 TRACKBAR_Refresh (WND *wndPtr, HDC32 hdc)
192 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
193 RECT32 rcClient, rcChannel, rcSelection;
194 HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
198 GetClientRect32 (wndPtr->hwndSelf, &rcClient);
199 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
200 FillRect32 (hdc, &rcClient, hBrush);
201 DeleteObject32 (hBrush);
205 if (infoPtr->flags & TB_THUMBCHANGED) {
206 TRACKBAR_CalcThumb (wndPtr, infoPtr);
207 if (infoPtr->flags & TB_THUMBSIZECHANGED)
208 TRACKBAR_CalcChannel (wndPtr, infoPtr);
210 if (infoPtr->flags & TB_SELECTIONCHANGED)
211 TRACKBAR_CalcSelection (wndPtr, infoPtr);
212 infoPtr->flags &= ~ (TB_THUMBCHANGED | TB_SELECTIONCHANGED);
216 rcChannel = infoPtr->rcChannel;
217 rcSelection= infoPtr->rcSelection;
218 DrawEdge32 (hdc, &rcChannel, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
220 if (wndPtr->dwStyle & TBS_ENABLESELRANGE) { /* fill the channel */
221 HBRUSH32 hbr = CreateSolidBrush32 (RGB(255,255,255));
222 FillRect32 (hdc, &rcChannel, hbr);
223 if (rcSelection.left!=rcSelection.right) {
224 hbr=CreateSolidBrush32 (COLOR_HIGHLIGHT);
225 FillRect32 (hdc, &rcSelection, hbr);
227 DeleteObject32 (hbr);
233 if (!(wndPtr->dwStyle & TBS_NOTICKS)) {
234 COLORREF clrTic=GetSysColor32 (COLOR_3DDKSHADOW);
237 y=rcChannel.bottom+2;
238 range=infoPtr->nRangeMax - infoPtr->nRangeMin;
239 width=rcChannel.right - rcChannel.left;
240 if (wndPtr->dwStyle & TBS_VERT) { /* swap x/y */
243 if ((wndPtr->dwStyle & TBS_TOP) || (wndPtr->dwStyle & TBS_BOTH)) {
244 /* draw upper tics */
247 // if (!((wndPtr->dwStyle & TBS_TOP) || (!(wndPtr->dwStyle & TBS_BOTH))))
248 /* draw lower tics */
249 // if (wndPtr->dwStyle & TBS_AUTOTICKS)
250 for (i=0; i<infoPtr->uNumTics; i++) {
251 tic=infoPtr->tics[i];
252 if ((tic>infoPtr->nRangeMin) && (tic<infoPtr->nRangeMax)) {
253 x=rcChannel.left + (width*tic)/range;
254 SetPixel32 (hdc, x,y+5, clrTic);
255 SetPixel32 (hdc, x,y+6, clrTic);
256 SetPixel32 (hdc, x,y+7, clrTic);
259 if ((wndPtr->dwStyle & TBS_ENABLESELRANGE) &&
260 (rcSelection.left!=rcSelection.right)) {
261 x=rcChannel.left + (width*infoPtr->nSelMin)/range - 1;
262 SetPixel32 (hdc, x,y+6, clrTic);
263 SetPixel32 (hdc, x,y+7, clrTic);
264 x=rcChannel.left + (width*infoPtr->nSelMax)/range + 1;
265 SetPixel32 (hdc, x,y+6, clrTic);
266 SetPixel32 (hdc, x,y+7, clrTic);
270 SetPixel32 (hdc, x,y+5, clrTic);
271 SetPixel32 (hdc, x,y+6, clrTic);
272 SetPixel32 (hdc, x,y+7, clrTic);
273 SetPixel32 (hdc, x,y+8, clrTic);
275 SetPixel32 (hdc, x,y+5, clrTic);
276 SetPixel32 (hdc, x,y+6, clrTic);
277 SetPixel32 (hdc, x,y+7, clrTic);
278 SetPixel32 (hdc, x,y+8, clrTic);
285 if (!(wndPtr->dwStyle & TBS_NOTHUMB)) {
286 HBRUSH32 hbr = CreateSolidBrush32 (COLOR_BACKGROUND);
287 RECT32 thumb = infoPtr->rcThumb;
289 SelectObject32 (hdc, hbr);
291 if (wndPtr->dwStyle & TBS_BOTH) {
292 FillRect32 (hdc, &thumb, hbr);
293 DrawEdge32 (hdc, &thumb, EDGE_RAISED, BF_TOPLEFT);
297 RECT32 triangle; /* for correct shadows of thumb */
299 /* first, fill the thumb */
301 SetPolyFillMode32 (hdc,WINDING);
302 points[0].x=thumb.left;
303 points[0].y=thumb.top;
304 points[1].x=thumb.right - 1;
305 points[1].y=thumb.top;
306 points[2].x=thumb.right - 1;
307 points[2].y=thumb.bottom -2;
308 points[3].x=(thumb.right + thumb.left-1)/2;
309 points[3].y=thumb.bottom+4;
310 points[4].x=thumb.left;
311 points[4].y=thumb.bottom -2;
312 points[5].x=points[0].x;
313 points[5].y=points[0].y;
314 Polygon32 (hdc, points, 6);
315 DrawEdge32 (hdc, &thumb, EDGE_RAISED, BF_TOPLEFT);
316 // DrawEdge32 (hdc, &thumb, EDGE_SUNKEN, BF_BOTTOMRIGHT);
320 triangle.right = thumb.right+5;
321 triangle.left = points[3].x+5;
322 triangle.top = thumb.bottom +5;
323 triangle.bottom= thumb.bottom +1;
324 DrawEdge32 (hdc, &triangle, EDGE_SUNKEN, BF_DIAGONAL | BF_TOP | BF_RIGHT);
325 triangle.left = thumb.left+6;
326 triangle.right = points[3].x+6;
327 DrawEdge32 (hdc, &triangle, EDGE_RAISED, BF_DIAGONAL | BF_TOP | BF_LEFT);
329 DeleteObject32 (hbr);
333 DrawFocusRect32 (hdc, &rcClient);
340 TRACKBAR_AlignBuddies (WND *wndPtr, TRACKBAR_INFO *infoPtr)
342 HWND32 hwndParent = GetParent32 (wndPtr->hwndSelf);
343 RECT32 rcSelf, rcBuddy;
346 GetWindowRect32 (wndPtr->hwndSelf, &rcSelf);
347 MapWindowPoints32 (HWND_DESKTOP, hwndParent, (LPPOINT32)&rcSelf, 2);
349 /* align buddy left or above */
350 if (infoPtr->hwndBuddyLA) {
351 GetWindowRect32 (infoPtr->hwndBuddyLA, &rcBuddy);
352 MapWindowPoints32 (HWND_DESKTOP, hwndParent, (LPPOINT32)&rcBuddy, 2);
354 if (wndPtr->dwStyle & TBS_VERT) {
355 x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 -
356 (rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left;
357 y = rcSelf.top - (rcBuddy.bottom - rcBuddy.top);
360 x = rcSelf.left - (rcBuddy.right - rcBuddy.left);
361 y = (infoPtr->rcChannel.bottom + infoPtr->rcChannel.top) / 2 -
362 (rcBuddy.bottom - rcBuddy.top) / 2 + rcSelf.top;
365 SetWindowPos32 (infoPtr->hwndBuddyLA, 0, x, y, 0, 0,
366 SWP_NOZORDER | SWP_NOSIZE);
370 /* align buddy right or below */
371 if (infoPtr->hwndBuddyRB) {
372 GetWindowRect32 (infoPtr->hwndBuddyRB, &rcBuddy);
373 MapWindowPoints32 (HWND_DESKTOP, hwndParent, (LPPOINT32)&rcBuddy, 2);
375 if (wndPtr->dwStyle & TBS_VERT) {
376 x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 -
377 (rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left;
382 y = (infoPtr->rcChannel.bottom + infoPtr->rcChannel.top) / 2 -
383 (rcBuddy.bottom - rcBuddy.top) / 2 + rcSelf.top;
385 SetWindowPos32 (infoPtr->hwndBuddyRB, 0, x, y, 0, 0,
386 SWP_NOZORDER | SWP_NOSIZE);
392 TRACKBAR_ClearSel (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
394 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
396 infoPtr->nSelMin = 0;
397 infoPtr->nSelMax = 0;
398 infoPtr->flags |=TB_SELECTIONCHANGED;
400 if ((BOOL32)wParam) {
401 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
402 TRACKBAR_Refresh (wndPtr, hdc);
403 ReleaseDC32 (wndPtr->hwndSelf, hdc);
411 TRACKBAR_ClearTics (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
413 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
416 HeapFree (GetProcessHeap (), 0, infoPtr->tics);
417 infoPtr->tics = NULL;
418 infoPtr->uNumTics = 0;
422 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
423 TRACKBAR_Refresh (wndPtr, hdc);
424 ReleaseDC32 (wndPtr->hwndSelf, hdc);
432 TRACKBAR_GetBuddy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
434 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
436 if (wParam) /* buddy is left or above */
437 return (LRESULT)infoPtr->hwndBuddyLA;
439 /* buddy is right or below */
440 return (LRESULT) infoPtr->hwndBuddyRB;
445 TRACKBAR_GetChannelRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
447 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
448 LPRECT32 lprc = (LPRECT32)lParam;
453 lprc->left = infoPtr->rcChannel.left;
454 lprc->right = infoPtr->rcChannel.right;
455 lprc->bottom = infoPtr->rcChannel.bottom;
456 lprc->top = infoPtr->rcChannel.top;
463 TRACKBAR_GetLineSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
465 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
467 return infoPtr->nLineSize;
472 TRACKBAR_GetNumTics (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
474 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
476 if (wndPtr->dwStyle & TBS_NOTICKS)
479 return infoPtr->uNumTics+2;
484 TRACKBAR_GetPageSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
486 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
488 return infoPtr->nPageSize;
493 TRACKBAR_GetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
495 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
497 return infoPtr->nPos;
504 TRACKBAR_GetRangeMax (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
506 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
508 return infoPtr->nRangeMax;
513 TRACKBAR_GetRangeMin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
515 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
517 return infoPtr->nRangeMin;
522 TRACKBAR_GetSelEnd (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
524 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
526 return infoPtr->nSelMax;
531 TRACKBAR_GetSelStart (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
533 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
535 return infoPtr->nSelMin;
540 TRACKBAR_GetThumbLength (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
542 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
544 return infoPtr->uThumbLen;
548 TRACKBAR_GetPTics (WND *wndPtr)
550 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
552 return (LRESULT) infoPtr->tics;
556 TRACKBAR_GetThumbRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
558 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
559 LPRECT32 lprc = (LPRECT32)lParam;
564 lprc->left = infoPtr->rcThumb.left;
565 lprc->right = infoPtr->rcThumb.right;
566 lprc->bottom = infoPtr->rcThumb.bottom;
567 lprc->top = infoPtr->rcThumb.top;
577 TRACKBAR_GetTic (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
580 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
584 if ((iTic<0) || (iTic>infoPtr->uNumTics))
587 return (LRESULT) infoPtr->tics[iTic];
593 TRACKBAR_GetTicPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
596 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
597 INT32 iTic, range, width, pos;
600 iTic=(INT32 ) wParam;
601 if ((iTic<0) || (iTic>infoPtr->uNumTics))
604 range=infoPtr->nRangeMax - infoPtr->nRangeMin;
605 width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
606 pos=infoPtr->rcChannel.left + (width * infoPtr->tics[iTic]) / range;
609 return (LRESULT) pos;
613 TRACKBAR_GetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
615 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
617 if (wndPtr->dwStyle & TBS_TOOLTIPS)
618 return (LRESULT)infoPtr->hwndToolTip;
623 // case TBM_GETUNICODEFORMAT:
627 TRACKBAR_SetBuddy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
629 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
633 /* buddy is left or above */
634 hwndTemp = infoPtr->hwndBuddyLA;
635 infoPtr->hwndBuddyLA = (HWND32)lParam;
637 FIXME (trackbar, "move buddy!\n");
640 /* buddy is right or below */
641 hwndTemp = infoPtr->hwndBuddyRB;
642 infoPtr->hwndBuddyRB = (HWND32)lParam;
644 FIXME (trackbar, "move buddy!\n");
647 TRACKBAR_AlignBuddies (wndPtr, infoPtr);
649 return (LRESULT)hwndTemp;
654 TRACKBAR_SetLineSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
656 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
657 INT32 nTemp = infoPtr->nLineSize;
659 infoPtr->nLineSize = (INT32)lParam;
666 TRACKBAR_SetPageSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
668 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
669 INT32 nTemp = infoPtr->nPageSize;
671 infoPtr->nPageSize = (INT32)lParam;
678 TRACKBAR_SetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
680 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
682 infoPtr->nPos = (INT32)HIWORD(lParam);
684 if (infoPtr->nPos < infoPtr->nRangeMin)
685 infoPtr->nPos = infoPtr->nRangeMin;
687 if (infoPtr->nPos > infoPtr->nRangeMax)
688 infoPtr->nPos = infoPtr->nRangeMax;
689 infoPtr->flags |=TB_THUMBPOSCHANGED;
692 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
693 TRACKBAR_Refresh (wndPtr, hdc);
694 ReleaseDC32 (wndPtr->hwndSelf, hdc);
702 TRACKBAR_SetRange (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
704 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
705 infoPtr->nRangeMin = (INT32)LOWORD(lParam);
706 infoPtr->nRangeMax = (INT32)HIWORD(lParam);
708 if (infoPtr->nPos < infoPtr->nRangeMin) {
709 infoPtr->nPos = infoPtr->nRangeMin;
710 infoPtr->flags |=TB_THUMBPOSCHANGED;
713 if (infoPtr->nPos > infoPtr->nRangeMax) {
714 infoPtr->nPos = infoPtr->nRangeMax;
715 infoPtr->flags |=TB_THUMBPOSCHANGED;
718 infoPtr->nPageSize=(infoPtr->nRangeMax - infoPtr->nRangeMin)/5;
719 TRACKBAR_RecalculateTics (infoPtr);
722 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
723 TRACKBAR_Refresh (wndPtr, hdc);
724 ReleaseDC32 (wndPtr->hwndSelf, hdc);
732 TRACKBAR_SetRangeMax (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
734 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
736 infoPtr->nRangeMax = (INT32)lParam;
737 if (infoPtr->nPos > infoPtr->nRangeMax) {
738 infoPtr->nPos = infoPtr->nRangeMax;
739 infoPtr->flags |=TB_THUMBPOSCHANGED;
742 infoPtr->nPageSize=(infoPtr->nRangeMax - infoPtr->nRangeMin)/5;
743 TRACKBAR_RecalculateTics (infoPtr);
746 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
747 TRACKBAR_Refresh (wndPtr, hdc);
748 ReleaseDC32 (wndPtr->hwndSelf, hdc);
756 TRACKBAR_SetRangeMin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
758 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
760 infoPtr->nRangeMin = (INT32)lParam;
761 if (infoPtr->nPos < infoPtr->nRangeMin) {
762 infoPtr->nPos = infoPtr->nRangeMin;
763 infoPtr->flags |=TB_THUMBPOSCHANGED;
766 infoPtr->nPageSize=(infoPtr->nRangeMax - infoPtr->nRangeMin)/5;
767 TRACKBAR_RecalculateTics (infoPtr);
770 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
771 TRACKBAR_Refresh (wndPtr, hdc);
772 ReleaseDC32 (wndPtr->hwndSelf, hdc);
779 TRACKBAR_SetTicFreq (WND *wndPtr, WPARAM32 wParam)
781 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
784 if (wndPtr->dwStyle & TBS_AUTOTICKS)
785 infoPtr->uTicFreq=(UINT32) wParam;
787 TRACKBAR_RecalculateTics (infoPtr);
789 hdc = GetDC32 (wndPtr->hwndSelf);
790 TRACKBAR_Refresh (wndPtr, hdc);
791 ReleaseDC32 (wndPtr->hwndSelf, hdc);
797 TRACKBAR_SetSel (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
799 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
801 infoPtr->nSelMin = (INT32)LOWORD(lParam);
802 infoPtr->nSelMax = (INT32)HIWORD(lParam);
803 infoPtr->flags |=TB_SELECTIONCHANGED;
805 if (!wndPtr->dwStyle & TBS_ENABLESELRANGE)
808 if (infoPtr->nSelMin < infoPtr->nRangeMin)
809 infoPtr->nSelMin = infoPtr->nRangeMin;
810 if (infoPtr->nSelMax > infoPtr->nRangeMax)
811 infoPtr->nSelMax = infoPtr->nRangeMax;
814 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
815 TRACKBAR_Refresh (wndPtr, hdc);
816 ReleaseDC32 (wndPtr->hwndSelf, hdc);
824 TRACKBAR_SetSelEnd (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
826 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
828 if (!wndPtr->dwStyle & TBS_ENABLESELRANGE)
831 infoPtr->nSelMax = (INT32)lParam;
832 infoPtr->flags |=TB_SELECTIONCHANGED;
834 if (infoPtr->nSelMax > infoPtr->nRangeMax)
835 infoPtr->nSelMax = infoPtr->nRangeMax;
838 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
839 TRACKBAR_Refresh (wndPtr, hdc);
840 ReleaseDC32 (wndPtr->hwndSelf, hdc);
848 TRACKBAR_SetSelStart (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
850 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
852 if (!wndPtr->dwStyle & TBS_ENABLESELRANGE)
855 infoPtr->nSelMin = (INT32)lParam;
856 infoPtr->flags |=TB_SELECTIONCHANGED;
857 if (infoPtr->nSelMin < infoPtr->nRangeMin)
858 infoPtr->nSelMin = infoPtr->nRangeMin;
861 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
862 TRACKBAR_Refresh (wndPtr, hdc);
863 ReleaseDC32 (wndPtr->hwndSelf, hdc);
871 TRACKBAR_SetThumbLength (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
873 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
876 if (wndPtr->dwStyle & TBS_FIXEDLENGTH)
877 infoPtr->uThumbLen = (UINT32)wParam;
879 hdc = GetDC32 (wndPtr->hwndSelf);
880 infoPtr->flags |=TB_THUMBSIZECHANGED;
881 TRACKBAR_Refresh (wndPtr, hdc);
882 ReleaseDC32 (wndPtr->hwndSelf, hdc);
889 TRACKBAR_SetTic (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
891 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
892 INT32 nPos = (INT32)lParam;
895 if ((nPos < infoPtr->nRangeMin) || (nPos> infoPtr->nRangeMax))
899 infoPtr->tics=HeapReAlloc( SystemHeap, 0, infoPtr->tics,
900 (infoPtr->uNumTics)*sizeof (DWORD));
901 infoPtr->tics[infoPtr->uNumTics-1]=nPos;
903 hdc = GetDC32 (wndPtr->hwndSelf);
904 TRACKBAR_Refresh (wndPtr, hdc);
905 ReleaseDC32 (wndPtr->hwndSelf, hdc);
914 TRACKBAR_SetTipSide (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
916 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
917 INT32 fTemp = infoPtr->fLocation;
919 infoPtr->fLocation = (INT32)wParam;
926 TRACKBAR_SetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
928 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
930 infoPtr->hwndToolTip = (HWND32)wParam;
936 // case TBM_SETUNICODEFORMAT:
940 TRACKBAR_InitializeThumb (WND *wndPtr)
942 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
944 infoPtr->uThumbLen = 23; /* initial thumb length */
946 TRACKBAR_CalcChannel (wndPtr,infoPtr);
947 TRACKBAR_CalcThumb (wndPtr, infoPtr);
948 infoPtr->flags &= ~TB_SELECTIONCHANGED;
955 TRACKBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
957 TRACKBAR_INFO *infoPtr;
959 infoPtr = (TRACKBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
960 sizeof(TRACKBAR_INFO));
961 wndPtr->wExtra[0] = (DWORD)infoPtr;
964 infoPtr->nRangeMin = 0; /* default values */
965 infoPtr->nRangeMax = 100;
966 infoPtr->nLineSize = 1;
967 infoPtr->nPageSize = 20;
968 infoPtr->nSelMin = 0;
969 infoPtr->nSelMax = 0;
972 infoPtr->uNumTics = 0; /* start and end tic are not included in count*/
973 infoPtr->uTicFreq = 1;
974 infoPtr->tics = NULL;
975 infoPtr->clrBk = GetSysColor32 (COLOR_BACKGROUND);
977 TRACKBAR_InitializeThumb (wndPtr);
984 TRACKBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
986 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
988 if (infoPtr->flags & TB_DRAG_TIMER_SET)
989 KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
991 HeapFree (GetProcessHeap (), 0, infoPtr);
997 TRACKBAR_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
999 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1002 TRACE (trackbar,"\n");
1004 if (infoPtr->flags & TB_DRAG_TIMER_SET)
1005 KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
1007 infoPtr->bFocus = FALSE;
1008 hdc = GetDC32 (wndPtr->hwndSelf);
1009 TRACKBAR_Refresh (wndPtr, hdc);
1010 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1011 InvalidateRect32 (wndPtr->hwndSelf, NULL, TRUE);
1018 TRACKBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1020 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1021 int clickPlace,prevPos,clickPos;
1023 SetFocus32 (wndPtr->hwndSelf);
1025 clickPlace=(INT32)LOWORD(lParam);
1027 if ((clickPlace>infoPtr->rcThumb.left) &&
1028 (clickPlace<infoPtr->rcThumb.right)) {
1029 SetTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER, TB_DRAG_DELAY, 0);
1030 infoPtr->flags |= TB_DRAG_TIMER_SET;
1034 clickPos=TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace);
1035 prevPos = infoPtr->nPos;
1037 if (clickPos > prevPos) { /* similar to VK_NEXT */
1038 infoPtr->nPos += infoPtr->nPageSize;
1039 if (infoPtr->nPos > infoPtr->nRangeMax)
1040 infoPtr->nPos = infoPtr->nRangeMax;
1041 TRACKBAR_SendNotify (wndPtr, TB_PAGEUP);
1043 infoPtr->nPos -= infoPtr->nPageSize; /* similar to VK_PRIOR */
1044 if (infoPtr->nPos < infoPtr->nRangeMin)
1045 infoPtr->nPos = infoPtr->nRangeMin;
1046 TRACKBAR_SendNotify (wndPtr, TB_PAGEDOWN);
1049 if (prevPos!=infoPtr->nPos) {
1052 hdc=GetDC32 (wndPtr->hwndSelf);
1053 infoPtr->flags |=TB_THUMBPOSCHANGED;
1054 TRACKBAR_Refresh (wndPtr, hdc);
1055 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1062 TRACKBAR_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1064 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1066 if (infoPtr->flags & TB_DRAG_TIMER_SET) {
1067 KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
1068 infoPtr->flags &= ~TB_DRAG_TIMER_SET;
1071 TRACKBAR_SendNotify (wndPtr, TB_ENDTRACK);
1077 TRACKBAR_CaptureChanged (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1079 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1081 if (infoPtr->flags & TB_DRAG_TIMER_SET)
1082 KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
1084 if (infoPtr->flags & TB_DRAGPOSVALID)
1085 infoPtr->nPos=infoPtr->dragPos;
1087 infoPtr->flags &= ~ (TB_DRAGPOSVALID | TB_DRAG_TIMER_SET);
1089 TRACKBAR_SendNotify (wndPtr, TB_ENDTRACK);
1094 TRACKBAR_Paint (WND *wndPtr, WPARAM32 wParam)
1099 hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
1100 TRACKBAR_Refresh (wndPtr, hdc);
1102 EndPaint32 (wndPtr->hwndSelf, &ps);
1108 TRACKBAR_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1110 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1113 TRACE (trackbar,"\n");
1114 infoPtr->bFocus = TRUE;
1116 hdc = GetDC32 (wndPtr->hwndSelf);
1117 TRACKBAR_Refresh (wndPtr, hdc);
1118 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1125 TRACKBAR_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1127 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1129 TRACKBAR_CalcChannel (wndPtr, infoPtr);
1130 TRACKBAR_AlignBuddies (wndPtr, infoPtr);
1138 TRACKBAR_SendNotify (WND *wndPtr, UINT32 code)
1141 TRACE (trackbar, "%x\n",code);
1142 if (wndPtr->dwStyle & TBS_VERT)
1143 return (BOOL32) SendMessage32A (GetParent32 (wndPtr->hwndSelf),
1144 WM_VSCROLL, (WPARAM32)code, (LPARAM) wndPtr->hwndSelf);
1146 return (BOOL32) SendMessage32A (GetParent32 (wndPtr->hwndSelf),
1147 WM_HSCROLL, (WPARAM32)code, (LPARAM) wndPtr->hwndSelf);
1151 TRACKBAR_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1153 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1156 clickPlace=(INT32)LOWORD(lParam);
1158 infoPtr->dragPos=TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace);
1159 infoPtr->flags|=TB_DRAGPOSVALID;
1161 TRACKBAR_SendNotify (wndPtr, TB_THUMBTRACK | (infoPtr->dragPos>>16));
1167 TRACKBAR_KeyDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1169 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1172 TRACE (trackbar, "%x\n",wParam);
1178 if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE;
1179 infoPtr->nPos -= infoPtr->nLineSize;
1180 if (infoPtr->nPos < infoPtr->nRangeMin)
1181 infoPtr->nPos = infoPtr->nRangeMin;
1182 TRACKBAR_SendNotify (wndPtr, TB_LINEUP);
1186 if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE;
1187 infoPtr->nPos += infoPtr->nLineSize;
1188 if (infoPtr->nPos > infoPtr->nRangeMax)
1189 infoPtr->nPos = infoPtr->nRangeMax;
1190 TRACKBAR_SendNotify (wndPtr, TB_LINEDOWN);
1193 if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE;
1194 infoPtr->nPos += infoPtr->nPageSize;
1195 if (infoPtr->nPos > infoPtr->nRangeMax)
1196 infoPtr->nPos = infoPtr->nRangeMax;
1197 TRACKBAR_SendNotify (wndPtr, TB_PAGEUP);
1200 if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE;
1201 infoPtr->nPos -= infoPtr->nPageSize;
1202 if (infoPtr->nPos < infoPtr->nRangeMin)
1203 infoPtr->nPos = infoPtr->nRangeMin;
1204 TRACKBAR_SendNotify (wndPtr, TB_PAGEDOWN);
1207 if (infoPtr->nPos == infoPtr->nRangeMin) return FALSE;
1208 infoPtr->nPos = infoPtr->nRangeMin;
1209 TRACKBAR_SendNotify (wndPtr, TB_TOP);
1212 if (infoPtr->nPos == infoPtr->nRangeMax) return FALSE;
1213 infoPtr->nPos = infoPtr->nRangeMax;
1214 TRACKBAR_SendNotify (wndPtr, TB_BOTTOM);
1218 if (pos!=infoPtr->nPos) {
1221 hdc=GetDC32 (wndPtr->hwndSelf);
1222 infoPtr->flags |=TB_THUMBPOSCHANGED;
1223 TRACKBAR_Refresh (wndPtr, hdc);
1224 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1231 TRACKBAR_KeyUp (WND *wndPtr, WPARAM32 wParam)
1241 case VK_END: TRACKBAR_SendNotify (wndPtr, TB_ENDTRACK);
1248 TRACKBAR_HandleTimer ( WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1250 TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
1253 TRACE (trackbar,"timer\n");
1257 if (infoPtr->flags & TB_DRAGPOSVALID) {
1258 infoPtr->nPos=infoPtr->dragPos;
1259 infoPtr->flags |= TB_THUMBPOSCHANGED;
1261 infoPtr->flags &= ~ (TB_DRAG_TIMER_SET | TB_DRAGPOSVALID);
1262 hdc=GetDC32 (wndPtr->hwndSelf);
1263 TRACKBAR_Refresh (wndPtr, hdc);
1264 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1272 TRACKBAR_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
1274 WND *wndPtr = WIN_FindWndPtr(hwnd);
1279 return TRACKBAR_ClearSel (wndPtr, wParam, lParam);
1282 return TRACKBAR_ClearTics (wndPtr, wParam, lParam);
1285 return TRACKBAR_GetBuddy (wndPtr, wParam, lParam);
1287 case TBM_GETCHANNELRECT:
1288 return TRACKBAR_GetChannelRect (wndPtr, wParam, lParam);
1290 case TBM_GETLINESIZE:
1291 return TRACKBAR_GetLineSize (wndPtr, wParam, lParam);
1293 case TBM_GETNUMTICS:
1294 return TRACKBAR_GetNumTics (wndPtr, wParam, lParam);
1296 case TBM_GETPAGESIZE:
1297 return TRACKBAR_GetPageSize (wndPtr, wParam, lParam);
1300 return TRACKBAR_GetPos (wndPtr, wParam, lParam);
1303 return TRACKBAR_GetPTics (wndPtr);
1305 case TBM_GETRANGEMAX:
1306 return TRACKBAR_GetRangeMax (wndPtr, wParam, lParam);
1308 case TBM_GETRANGEMIN:
1309 return TRACKBAR_GetRangeMin (wndPtr, wParam, lParam);
1312 return TRACKBAR_GetSelEnd (wndPtr, wParam, lParam);
1314 case TBM_GETSELSTART:
1315 return TRACKBAR_GetSelStart (wndPtr, wParam, lParam);
1317 case TBM_GETTHUMBLENGTH:
1318 return TRACKBAR_GetThumbLength (wndPtr, wParam, lParam);
1320 case TBM_GETTHUMBRECT:
1321 return TRACKBAR_GetThumbRect (wndPtr, wParam, lParam);
1324 return TRACKBAR_GetTic (wndPtr, wParam, lParam);
1327 return TRACKBAR_GetTicPos (wndPtr, wParam, lParam);
1329 case TBM_GETTOOLTIPS:
1330 return TRACKBAR_GetToolTips (wndPtr, wParam, lParam);
1332 // case TBM_GETUNICODEFORMAT:
1335 return TRACKBAR_SetBuddy (wndPtr, wParam, lParam);
1337 case TBM_SETLINESIZE:
1338 return TRACKBAR_SetLineSize (wndPtr, wParam, lParam);
1340 case TBM_SETPAGESIZE:
1341 return TRACKBAR_SetPageSize (wndPtr, wParam, lParam);
1344 return TRACKBAR_SetPos (wndPtr, wParam, lParam);
1347 return TRACKBAR_SetRange (wndPtr, wParam, lParam);
1349 case TBM_SETRANGEMAX:
1350 return TRACKBAR_SetRangeMax (wndPtr, wParam, lParam);
1352 case TBM_SETRANGEMIN:
1353 return TRACKBAR_SetRangeMin (wndPtr, wParam, lParam);
1356 return TRACKBAR_SetSel (wndPtr, wParam, lParam);
1359 return TRACKBAR_SetSelEnd (wndPtr, wParam, lParam);
1361 case TBM_SETSELSTART:
1362 return TRACKBAR_SetSelStart (wndPtr, wParam, lParam);
1364 case TBM_SETTHUMBLENGTH:
1365 return TRACKBAR_SetThumbLength (wndPtr, wParam, lParam);
1368 return TRACKBAR_SetTic (wndPtr, wParam, lParam);
1370 case TBM_SETTICFREQ:
1371 return TRACKBAR_SetTicFreq (wndPtr, wParam);
1374 case TBM_SETTIPSIDE:
1375 return TRACKBAR_SetTipSide (wndPtr, wParam, lParam);
1377 case TBM_SETTOOLTIPS:
1378 return TRACKBAR_SetToolTips (wndPtr, wParam, lParam);
1380 // case TBM_SETUNICODEFORMAT:
1383 case WM_CAPTURECHANGED:
1384 return TRACKBAR_CaptureChanged (wndPtr, wParam, lParam);
1387 return TRACKBAR_Create (wndPtr, wParam, lParam);
1390 return TRACKBAR_Destroy (wndPtr, wParam, lParam);
1394 // case WM_ERASEBKGND:
1398 return DLGC_WANTARROWS;
1401 return TRACKBAR_KeyDown (wndPtr, wParam, lParam);
1404 return TRACKBAR_KeyUp (wndPtr, wParam);
1407 return TRACKBAR_KillFocus (wndPtr, wParam, lParam);
1409 case WM_LBUTTONDOWN:
1410 return TRACKBAR_LButtonDown (wndPtr, wParam, lParam);
1413 return TRACKBAR_LButtonUp (wndPtr, wParam, lParam);
1416 return TRACKBAR_MouseMove (wndPtr, wParam, lParam);
1419 return TRACKBAR_Paint (wndPtr, wParam);
1422 return TRACKBAR_SetFocus (wndPtr, wParam, lParam);
1425 return TRACKBAR_Size (wndPtr, wParam, lParam);
1428 return TRACKBAR_HandleTimer (wndPtr, wParam, lParam);
1430 case WM_WININICHANGE:
1431 return TRACKBAR_InitializeThumb (wndPtr);
1434 if (uMsg >= WM_USER)
1435 ERR (trackbar, "unknown msg %04x wp=%08x lp=%08lx\n",
1436 uMsg, wParam, lParam);
1437 return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
1444 TRACKBAR_Register (VOID)
1446 WNDCLASS32A wndClass;
1448 if (GlobalFindAtom32A (TRACKBAR_CLASS32A)) return;
1450 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
1451 wndClass.style = CS_GLOBALCLASS;
1452 wndClass.lpfnWndProc = (WNDPROC32)TRACKBAR_WindowProc;
1453 wndClass.cbClsExtra = 0;
1454 wndClass.cbWndExtra = sizeof(TRACKBAR_INFO *);
1455 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
1456 wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
1457 wndClass.lpszClassName = TRACKBAR_CLASS32A;
1459 RegisterClass32A (&wndClass);
1464 TRACKBAR_Unregister (VOID)
1466 if (GlobalFindAtom32A (TRACKBAR_CLASS32A))
1467 UnregisterClass32A (TRACKBAR_CLASS32A, (HINSTANCE32)NULL);