From b2917cf59894cb2f92ad8e69c1e6bc2038bc5e87 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 10 Apr 2009 04:52:27 -0400 Subject: [PATCH] comctl32/updown: Allow ranges with max < min for Up/Down control. --- dlls/comctl32/updown.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/dlls/comctl32/updown.c b/dlls/comctl32/updown.c index d0bc27c828a..a4b9271b270 100644 --- a/dlls/comctl32/updown.c +++ b/dlls/comctl32/updown.c @@ -469,6 +469,27 @@ static LRESULT UPDOWN_KeyPressed(UPDOWN_INFO *infoPtr, int key) return 0; } +/*********************************************************************** + * UPDOWN_SetRange + * + * Handle UDM_SETRANGE, UDM_SETRANGE32 + * + * FIXME: handle Max == Min properly: + * - arrows should be disabled (without WS_DISABLED set), + * visually they can't be pressed and don't respond; + * - all input messages should still pass in. + */ +static LRESULT UPDOWN_SetRange(UPDOWN_INFO *infoPtr, INT Max, INT Min) +{ + infoPtr->MaxVal = Max; + infoPtr->MinVal = Min; + + TRACE("UpDown Ctrl new range(%d to %d), hwnd=%p\n", + infoPtr->MinVal, infoPtr->MaxVal, infoPtr->Self); + + return 0; +} + /*********************************************************************** * UPDOWN_MouseWheel * @@ -1045,12 +1066,11 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L return MAKELONG(infoPtr->MaxVal, infoPtr->MinVal); case UDM_SETRANGE: - /* we must have: */ - infoPtr->MaxVal = (short)(lParam); /* UD_MINVAL <= Max <= UD_MAXVAL */ - infoPtr->MinVal = (short)HIWORD(lParam); /* UD_MINVAL <= Min <= UD_MAXVAL */ - /* |Max-Min| <= UD_MAXVAL */ - TRACE("UpDown Ctrl new range(%d to %d), hwnd=%p\n", - infoPtr->MinVal, infoPtr->MaxVal, hwnd); + /* we must have: + UD_MINVAL <= Max <= UD_MAXVAL + UD_MINVAL <= Min <= UD_MAXVAL + |Max-Min| <= UD_MAXVAL */ + UPDOWN_SetRange(infoPtr, (short)lParam, (short)HIWORD(lParam)); break; case UDM_GETRANGE32: @@ -1059,12 +1079,7 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L break; case UDM_SETRANGE32: - infoPtr->MinVal = (INT)wParam; - infoPtr->MaxVal = (INT)lParam; - if (infoPtr->MaxVal <= infoPtr->MinVal) - infoPtr->MaxVal = infoPtr->MinVal + 1; - TRACE("UpDown Ctrl new range(%d to %d), hwnd=%p\n", - infoPtr->MinVal, infoPtr->MaxVal, hwnd); + UPDOWN_SetRange(infoPtr, (INT)lParam, (INT)wParam); break; case UDM_GETPOS32: