예제 #1
0
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);
        }
    }
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #4
0
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);
        }
    }
}
예제 #5
0
LOCAL void Slider_OnSetFocus(HWND hWindow, HWND hwndOldFocus)
/***********************************************************************/
{
    LPSLIDERINFO lpInfo = Slider_GetInfo (hWindow);

    if (lpInfo)
    {
        lpInfo->bFocus = TRUE;
        InvalidateRect (hWindow,NULL,FALSE);
    }
}
예제 #6
0
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);
    }
}
예제 #7
0
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);
    }
}
예제 #8
0
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);
        }
    }
}
예제 #9
0
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);
    }
}
예제 #10
0
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);
    }
}
예제 #11
0
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);
        }
    }
}
예제 #12
0
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);
        }
    }
}
예제 #13
0
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;
}