LOCAL void Slider_OnTimer(HWND hWindow, UINT id) /***********************************************************************/ { POINT ptPosition; int Value; BOOL bPaint; LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { bPaint = FALSE; GetCursorPos (&ptPosition); ScreenToClient (hWindow,&ptPosition); Value = Slider_ValueFromPoint (hWindow,ptPosition,lpInfo); if (Value < lpInfo->Value) bPaint = Slider_DecrementValue (lpInfo); else if (Value > lpInfo->Value) bPaint = Slider_IncrementValue (lpInfo); Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); if (bPaint) { FORWARD_WM_COMMAND(GetParent(hWindow), GetDlgCtrlID(hWindow), hWindow, SN_VALUECHANGING, SendMessage); InvalidateRect (hWindow,NULL,FALSE); UpdateWindow (hWindow); } } }
LOCAL long Slider_OnUserMsg (HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam) /***********************************************************************/ { long lResult = 0L; LPHSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { switch (msg) { case SM_GETPOSITION: lResult = lpInfo->Position; break; case SM_SETPOSITION: lpInfo->Position = lParam; // Enforce min/max range if (lpInfo->Position < lpInfo->Min) lpInfo->Position = lpInfo->Min; if (lpInfo->Position > lpInfo->Max) lpInfo->Position = lpInfo->Max; InvalidateRect (hWindow,NULL,FALSE); default: break; } } return lResult; }
LOCAL void Slider_OnSize(HWND hWindow, UINT state, int cx, int cy) /***********************************************************************/ { LPSLIDERINFO lpInfo; HDC hDC = GetDC (hWindow); if (hDC && (cx > BitmapWidth || cy > BitmapHeight)) { if (cx > BitmapWidth) BitmapWidth = cx; if (cy > BitmapHeight) BitmapHeight = cy; if (hBitmap) DeleteObject (hBitmap); hBitmap = CreateCompatibleBitmap (hDC,BitmapWidth,BitmapHeight); InvalidateRect (hWindow,NULL,FALSE); UpdateWindow (hWindow); } if (hDC) ReleaseDC (hWindow,hDC); lpInfo = Slider_GetInfo (hWindow); if (lpInfo) Slider_InitInfo (hWindow, lpInfo,TRUE); FORWARD_WM_SIZE(hWindow, state, cx, cy, Control_DefProc); }
LOCAL void Slider_OnLButtonDown(HWND hWindow, BOOL fDoubleClick, int x, int y, UINT keyFlags) /***********************************************************************/ { POINT ptPosition; int Value; LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); ptPosition.x = x; ptPosition.y = y; if (lpInfo) { BOOL bPaint = FALSE; SetCapture (hWindow); lpInfo->bCaptured = TRUE; if (!(lpInfo->lStyle & SS_NOMOUSEFOCUS)) SetFocus (hWindow); if (!Slider_IsOnThumb (ptPosition,lpInfo) && (lpInfo->lStyle & SS_CLICKSTEP)) { Value = Slider_ValueFromPoint (hWindow,ptPosition,lpInfo); lpInfo->bStepping = TRUE; if (Value < lpInfo->Value) bPaint = Slider_DecrementValue (lpInfo); else if (Value > lpInfo->Value) bPaint = Slider_IncrementValue (lpInfo); Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); SetTimer (hWindow,1,150,NULL); } else { Value = lpInfo->Value; bPaint = TRUE; Slider_ClipPoint (&ptPosition,lpInfo); lpInfo->Value = Slider_ValueFromPoint (hWindow,ptPosition,lpInfo); if (lpInfo->lStyle & SS_SNAPDRAG) { Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); bPaint = lpInfo->Value != Value; } else if (lpInfo->lStyle & SS_HORZSLIDER && ptPosition.x != lpInfo->ptPosition.x) lpInfo->ptPosition.x = ptPosition.x; else if (ptPosition.y != lpInfo->ptPosition.y) lpInfo->ptPosition.y = ptPosition.y; else bPaint = FALSE; } if (bPaint) { FORWARD_WM_COMMAND(GetParent(hWindow), GetDlgCtrlID(hWindow), hWindow, SN_VALUECHANGING, SendMessage); InvalidateRect (hWindow,NULL,FALSE); UpdateWindow (hWindow); } } }
LOCAL void Slider_OnSetFocus(HWND hWindow, HWND hwndOldFocus) /***********************************************************************/ { LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { lpInfo->bFocus = TRUE; InvalidateRect (hWindow,NULL,FALSE); } }
LOCAL void Slider_OnKillFocus(HWND hWindow, HWND hwndNewFocus) /***********************************************************************/ { LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { if (lpInfo->bCaptured) { ReleaseCapture (); lpInfo->bCaptured = FALSE; } lpInfo->bFocus = FALSE; InvalidateRect (hWindow,NULL,FALSE); } }
LOCAL void Slider_OnKeyUp(HWND hWindow, UINT vk, BOOL fDown, int cRepeat, UINT flags) /***********************************************************************/ { LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { if (((lpInfo->lStyle & SS_HORZSLIDER) ? (vk == VK_LEFT || vk == VK_RIGHT) : (vk == VK_UP || vk == VK_DOWN)) || vk == VK_NEXT || vk == VK_PRIOR || vk == VK_END || vk == VK_HOME) FORWARD_WM_COMMAND(GetParent(hWindow), GetDlgCtrlID(hWindow), hWindow, SN_VALUESELECTED, SendMessage); } }
LOCAL void Slider_OnKeyDown(HWND hWindow, UINT vk, BOOL fDown, int cRepeat, UINT flags) /***********************************************************************/ { LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { int OldValue = lpInfo->Value; if (lpInfo->lStyle & SS_HORZSLIDER) { if ((vk == VK_LEFT && !(lpInfo->lStyle & SS_RIGHTTOLEFT)) || (vk == VK_RIGHT && lpInfo->lStyle & SS_RIGHTTOLEFT)) Slider_DecrementValue (lpInfo); else if ((vk == VK_RIGHT && !(lpInfo->lStyle & SS_RIGHTTOLEFT)) || (vk == VK_LEFT && lpInfo->lStyle & SS_RIGHTTOLEFT)) Slider_IncrementValue (lpInfo); } else { if ((vk == VK_UP && !(lpInfo->lStyle & SS_RIGHTTOLEFT)) || (vk == VK_DOWN && lpInfo->lStyle & SS_BOTTOMTOTOP)) Slider_DecrementValue (lpInfo); else if ((vk == VK_DOWN && !(lpInfo->lStyle & SS_RIGHTTOLEFT)) || (vk == VK_UP && lpInfo->lStyle & SS_BOTTOMTOTOP)) Slider_IncrementValue (lpInfo); } if (vk == VK_NEXT) Slider_DecrementValue (lpInfo); else if (vk == VK_PRIOR) Slider_IncrementValue (lpInfo); else if (vk == VK_END) lpInfo->Value = lpInfo->Max; else if (vk == VK_HOME) lpInfo->Value = lpInfo->Min; Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); if (OldValue != lpInfo->Value) { FORWARD_WM_COMMAND(GetParent(hWindow), GetDlgCtrlID(hWindow), hWindow, SN_VALUECHANGING, SendMessage); InvalidateRect (hWindow,NULL,FALSE); UpdateWindow (hWindow); } } }
LOCAL void Slider_OnDestroy(HWND hWindow) /***********************************************************************/ { LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (--nControls == 0 && hBitmap) { DeleteObject (hBitmap); BitmapWidth = 0; BitmapHeight = 0; hBitmap = NULL; } if (lpInfo) { Ctl_FreeUp(lpInfo); } }
LOCAL void Slider_OnLButtonUp(HWND hWindow, int x, int y, UINT keyFlags) /***********************************************************************/ { POINT ptPosition; BOOL bPaint; LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); ptPosition.x = x; ptPosition.y = y; if (lpInfo && lpInfo->bCaptured) { ReleaseCapture (); lpInfo->bCaptured = FALSE; if (lpInfo->bStepping) { lpInfo->bStepping = FALSE; KillTimer (hWindow,1); } else { bPaint = TRUE; Slider_ClipPoint (&ptPosition,lpInfo); lpInfo->Value = Slider_ValueFromPoint (hWindow,ptPosition,lpInfo); if (lpInfo->lStyle & SS_SNAP || lpInfo->lStyle & SS_SNAPDRAG) Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); else if (lpInfo->lStyle & SS_HORZSLIDER && ptPosition.x != lpInfo->ptPosition.x) lpInfo->ptPosition.x = ptPosition.x; else if (ptPosition.y != lpInfo->ptPosition.y) lpInfo->ptPosition.y = ptPosition.y; else bPaint = FALSE; if (bPaint) { InvalidateRect (hWindow,NULL,FALSE); UpdateWindow (hWindow); } } FORWARD_WM_COMMAND(GetParent(hWindow), GetDlgCtrlID(hWindow), hWindow, SN_VALUESELECTED, SendMessage); } }
LOCAL void Slider_Draw(HWND hWindow, HDC hDC) /***********************************************************************/ { LPSLIDERINFO lpInfo; DRAWITEMSTRUCT diData; RECT rClient; lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { if (lpInfo->lStyle & SS_OWNERDRAW) { GetClientRect (hWindow,&rClient); diData.CtlType = 0; diData.CtlID = GetDlgCtrlID(hWindow); diData.itemID = 0; diData.itemAction = ODA_DRAWENTIRE; diData.itemState = (lpInfo->bFocus ? ODS_FOCUS : 0); diData.hwndItem = hWindow; diData.hDC = hDC; diData.rcItem = lpInfo->rPosRange; diData.itemData = MAKELONG (lpInfo->ptPosition.x, lpInfo->ptPosition.y); if (lpInfo->lStyle & SS_HORZSLIDER) { diData.rcItem.top = rClient.top; diData.rcItem.bottom = rClient.bottom - rClient.top; } else { diData.rcItem.left = rClient.left; diData.rcItem.right = rClient.right - rClient.left; } FORWARD_WM_DRAWITEM(GetParent(hWindow), &diData, SendMessage); } else { Slider_DrawBackground (hWindow,hDC,lpInfo); Slider_DrawTicks (hWindow,hDC,lpInfo); Slider_DrawThumb (hWindow,hDC,lpInfo); } } }
LOCAL void Slider_OnMouseMove(HWND hWindow, int x, int y, UINT keyFlags) /***********************************************************************/ { POINT ptPosition; int Value; BOOL bPaint; LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); ptPosition.x = x; ptPosition.y = y; if (lpInfo && lpInfo->bCaptured) { bPaint = FALSE; if (!lpInfo->bStepping) { Value = lpInfo->Value; bPaint = TRUE; Slider_ClipPoint (&ptPosition,lpInfo); lpInfo->Value = Slider_ValueFromPoint (hWindow,ptPosition,lpInfo); if (lpInfo->lStyle & SS_SNAPDRAG) { Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); bPaint = lpInfo->Value != Value; } else if (lpInfo->lStyle & SS_HORZSLIDER && ptPosition.x != lpInfo->ptPosition.x) lpInfo->ptPosition.x = ptPosition.x; else if (ptPosition.y != lpInfo->ptPosition.y) lpInfo->ptPosition.y = ptPosition.y; else bPaint = FALSE; } if (bPaint) { FORWARD_WM_COMMAND(GetParent(hWindow), GetDlgCtrlID(hWindow), hWindow, SN_VALUECHANGING, SendMessage); InvalidateRect (hWindow,NULL,FALSE); UpdateWindow (hWindow); } } }
LOCAL long Slider_OnUserMsg (HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam) /***********************************************************************/ { long lResult = 0L; LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow); if (lpInfo) { switch (msg) { case SM_GETRANGE: lResult = MAKELONG (lpInfo->Min,lpInfo->Max); break; case SM_GETTHUMBSIZE: lResult = MAKELONG (lpInfo->ThumbWidth,lpInfo->ThumbHeight); break; case SM_GETTICKS: lResult = MAKELONG (lpInfo->BigTickInc,lpInfo->SmallTickInc); break; case SM_GETVALUE: lResult = (long)lpInfo->Value; // lResult = (INT32)lpInfo->Value; break; case SM_SETRANGE: lpInfo->Min = (int)LOWORD (lParam); lpInfo->Max = (int)HIWORD (lParam); // lpInfo->Min = (INT16)LOWORD (lParam); // lpInfo->Max = (INT16)HIWORD (lParam); Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); InvalidateRect (hWindow,NULL,FALSE); break; case SM_SETSTEP: lpInfo->Step = (int)wParam; // lpInfo->Step = (INT16)wParam; Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); InvalidateRect (hWindow,NULL,FALSE); break; case SM_SETTHUMBSIZE: lpInfo->ThumbWidth = (int)LOWORD (lParam); // lpInfo->ThumbWidth = (INT16)LOWORD (lParam); lpInfo->ThumbHeight = (int)HIWORD (lParam); // lpInfo->ThumbHeight = (INT16)HIWORD (lParam); lpInfo->bStdThumb = (lParam == 0L); Slider_InitInfo (hWindow, lpInfo,TRUE); InvalidateRect (hWindow,NULL,FALSE); break; case SM_SETTICKS: lpInfo->BigTickInc = (int)LOWORD (lParam); // lpInfo->BigTickInc = (INT16)LOWORD (lParam); lpInfo->SmallTickInc = (int)HIWORD (lParam); // lpInfo->SmallTickInc = (INT16)HIWORD (lParam); InvalidateRect (hWindow,NULL,FALSE); break; case SM_SETVALUE: lpInfo->Value = (int)wParam; // lpInfo->Value = (INT16)wParam; Slider_PointFromValue (hWindow,lpInfo->Value,&lpInfo->ptPosition,lpInfo); InvalidateRect (hWindow,NULL,FALSE); break; default: break; } } return lResult; }