Skip to content
Snippets Groups Projects
scroll.c 47.9 KiB
Newer Older
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           SetScrollInfo32   (USER32.501)
Alexandre Julliard's avatar
Alexandre Julliard committed
 * SetScrollInfo32 can be used to set the position, upper bound, 
 * lower bound, and page size of a scrollbar control.
 *
 * RETURNS
 *    Scrollbar position
 *
 * NOTE
 *    For 100 lines of text to be displayed in a window of 25 lines,
 *  one would for instance use info->nMin=0, info->nMax=75
 *  (corresponding to the 76 different positions of the window on
 *  the text), and info->nPage=25.
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
INT WINAPI SetScrollInfo( 
HWND hwnd /* [I] Handle of window whose scrollbar will be affected */, 
INT nBar /* [I] One of SB_HORZ, SB_VERT, or SB_CTL */, 
Alexandre Julliard's avatar
Alexandre Julliard committed
const SCROLLINFO *info /* [I] Specifies what to change and new values */,
BOOL bRedraw /* [I] Should scrollbar be redrawn afterwards ? */)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    INT action;
    INT retVal = SCROLL_SetScrollInfo( hwnd, nBar, info, &action );

    if( action & SA_SSI_HIDE )
	SCROLL_ShowScrollBar( hwnd, nBar, FALSE, FALSE );
    else
    {
	if( action & SA_SSI_SHOW )
	    if( SCROLL_ShowScrollBar( hwnd, nBar, TRUE, TRUE ) )
		return retVal; /* SetWindowPos() already did the painting */

	if( bRedraw && (action & SA_SSI_REFRESH))
	    SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE );
	else if( action & SA_SSI_REPAINT_ARROWS )
	    SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, FALSE );
    }
    return retVal;
}

INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, 
			    const SCROLLINFO *info, INT *action  )
{
    /* Update the scrollbar state and set action flags according to 
     * what has to be done graphics wise. */

Alexandre Julliard's avatar
Alexandre Julliard committed
    SCROLLBAR_INFO *infoPtr;
Alexandre Julliard's avatar
Alexandre Julliard committed
    dbg_decl_str(scroll, 256);
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (!(infoPtr = SCROLL_GetScrollInfo(hwnd, nBar))) return 0;
    if (info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) return 0;
    if ((info->cbSize != sizeof(*info)) &&
        (info->cbSize != sizeof(*info)-sizeof(info->nTrackPos))) return 0;
Alexandre Julliard's avatar
Alexandre Julliard committed

Alexandre Julliard's avatar
Alexandre Julliard committed
    /* Set the page size */

    if (info->fMask & SIF_PAGE)
    {
Alexandre Julliard's avatar
Alexandre Julliard committed
        dsprintf(scroll, " page=%d", info->nPage );
	if( infoPtr->Page != info->nPage )
	{
            infoPtr->Page = info->nPage;
	   *action |= SA_SSI_REFRESH;
	}
Alexandre Julliard's avatar
Alexandre Julliard committed
    }

    /* Set the scroll pos */

    if (info->fMask & SIF_POS)
    {
Alexandre Julliard's avatar
Alexandre Julliard committed
        dsprintf(scroll, " pos=%d", info->nPos );
	if( infoPtr->CurVal != info->nPos )
	{
	    infoPtr->CurVal = info->nPos;
	   *action |= SA_SSI_REFRESH;
	}
Alexandre Julliard's avatar
Alexandre Julliard committed
    }

    /* Set the scroll range */

    if (info->fMask & SIF_RANGE)
    {
Alexandre Julliard's avatar
Alexandre Julliard committed
        dsprintf(scroll, " min=%d max=%d", info->nMin, info->nMax );
Alexandre Julliard's avatar
Alexandre Julliard committed

        /* Invalid range -> range is set to (0,0) */
        if ((info->nMin > info->nMax) ||
            ((UINT)(info->nMax - info->nMin) >= 0x80000000))
Alexandre Julliard's avatar
Alexandre Julliard committed
        {
            infoPtr->MinVal = 0;
            infoPtr->MaxVal = 0;
        }
        else
        {
	    if( infoPtr->MinVal != info->nMin ||
		infoPtr->MaxVal != info->nMax )
	    {
	       *action |= SA_SSI_REFRESH;
                infoPtr->MinVal = info->nMin;
                infoPtr->MaxVal = info->nMax;
	    }
Alexandre Julliard's avatar
Alexandre Julliard committed
		    hwnd, nBar, dbg_str(scroll));

Alexandre Julliard's avatar
Alexandre Julliard committed
    /* Make sure the page size is valid */

    if (infoPtr->Page < 0) infoPtr->Page = 0;
    else if (infoPtr->Page > infoPtr->MaxVal - infoPtr->MinVal + 1 )
        infoPtr->Page = infoPtr->MaxVal - infoPtr->MinVal + 1;

    /* Make sure the pos is inside the range */

    if (infoPtr->CurVal < infoPtr->MinVal)
        infoPtr->CurVal = infoPtr->MinVal;
    else if (infoPtr->CurVal > infoPtr->MaxVal - MAX( infoPtr->Page-1, 0 ))
        infoPtr->CurVal = infoPtr->MaxVal - MAX( infoPtr->Page-1, 0 );

    TRACE("    new values: page=%d pos=%d min=%d max=%d\n",
Alexandre Julliard's avatar
Alexandre Julliard committed
		 infoPtr->Page, infoPtr->CurVal,
		 infoPtr->MinVal, infoPtr->MaxVal );
Alexandre Julliard's avatar
Alexandre Julliard committed

    /* Check if the scrollbar should be hidden or disabled */

Alexandre Julliard's avatar
Alexandre Julliard committed
    if (info->fMask & (SIF_RANGE | SIF_PAGE | SIF_DISABLENOSCROLL))
Alexandre Julliard's avatar
Alexandre Julliard committed
    {
Alexandre Julliard's avatar
Alexandre Julliard committed
        new_flags = infoPtr->flags;
        if (infoPtr->MinVal >= infoPtr->MaxVal - MAX( infoPtr->Page-1, 0 ))
Alexandre Julliard's avatar
Alexandre Julliard committed
        {
Alexandre Julliard's avatar
Alexandre Julliard committed
            /* Hide or disable scroll-bar */
            if (info->fMask & SIF_DISABLENOSCROLL)
Alexandre Julliard's avatar
Alexandre Julliard committed
                new_flags = ESB_DISABLE_BOTH;
Alexandre Julliard's avatar
Alexandre Julliard committed
            else if (nBar != SB_CTL)
Alexandre Julliard's avatar
Alexandre Julliard committed
            }
        }
        else  /* Show and enable scroll-bar */
        {
	    new_flags = 0;
            if (nBar != SB_CTL)
		*action |= SA_SSI_SHOW;
        if (infoPtr->flags != new_flags) /* check arrow flags */
Alexandre Julliard's avatar
Alexandre Julliard committed
        {
            infoPtr->flags = new_flags;
           *action |= SA_SSI_REPAINT_ARROWS;
Alexandre Julliard's avatar
Alexandre Julliard committed
        }
Alexandre Julliard's avatar
Alexandre Julliard committed
    /* Return current position */

    return infoPtr->CurVal;
}


/*************************************************************************
 *           GetScrollInfo16   (USER.476)
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
BOOL16 WINAPI GetScrollInfo16( HWND16 hwnd, INT16 nBar, LPSCROLLINFO info )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    return GetScrollInfo( hwnd, nBar, info );
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           GetScrollInfo32   (USER32.284)
Alexandre Julliard's avatar
Alexandre Julliard committed
 * GetScrollInfo32 can be used to retrieve the position, upper bound, 
 * lower bound, and page size of a scrollbar control.
 *
 * RETURNS STD
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
BOOL WINAPI GetScrollInfo( 
  HWND hwnd /* [I] Handle of window */ , 
  INT nBar /* [I] One of SB_HORZ, SB_VERT, or SB_CTL */, 
Alexandre Julliard's avatar
Alexandre Julliard committed
  LPSCROLLINFO info /* [IO] (info.fMask [I] specifies which values are to retrieve) */)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    SCROLLBAR_INFO *infoPtr;

    if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return FALSE;
    if (info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) return FALSE;
    if ((info->cbSize != sizeof(*info)) &&
        (info->cbSize != sizeof(*info)-sizeof(info->nTrackPos))) return FALSE;

    if (info->fMask & SIF_PAGE) info->nPage = infoPtr->Page;
    if (info->fMask & SIF_POS) info->nPos = infoPtr->CurVal;
    if ((info->fMask & SIF_TRACKPOS) && (info->cbSize == sizeof(*info)))
        info->nTrackPos = (SCROLL_TrackingWin==hwnd) ? SCROLL_TrackingVal : 0;
    if (info->fMask & SIF_RANGE)
    {
	info->nMin = infoPtr->MinVal;
	info->nMax = infoPtr->MaxVal;
    }
    return (info->fMask & SIF_ALL) != 0;
}


/*************************************************************************
 *           SetScrollPos16   (USER.62)
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
INT16 WINAPI SetScrollPos16( HWND16 hwnd, INT16 nBar, INT16 nPos,
                             BOOL16 bRedraw )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    return (INT16)SetScrollPos( hwnd, nBar, nPos, bRedraw );
Alexandre Julliard's avatar
Alexandre Julliard committed
}
Alexandre Julliard's avatar
Alexandre Julliard committed


/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           SetScrollPos32   (USER32.502)
Alexandre Julliard's avatar
Alexandre Julliard committed
 *
 * RETURNS
 *    Success: Scrollbar position
 *    Failure: 0
 *
 * REMARKS
 *    Note the ambiguity when 0 is returned.  Use GetLastError
 *    to make sure there was an error (and to know which one).
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
INT WINAPI SetScrollPos( 
HWND hwnd /* [I] Handle of window whose scrollbar will be affected */,
INT nBar /* [I] One of SB_HORZ, SB_VERT, or SB_CTL */,
INT nPos /* [I] New value */,
BOOL bRedraw /* [I] Should scrollbar be redrawn afterwards ? */ )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
    SCROLLINFO info;
Alexandre Julliard's avatar
Alexandre Julliard committed
    SCROLLBAR_INFO *infoPtr;
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return 0;
Alexandre Julliard's avatar
Alexandre Julliard committed
    oldPos      = infoPtr->CurVal;
    info.cbSize = sizeof(info);
    info.nPos   = nPos;
    info.fMask  = SIF_POS;
    SetScrollInfo( hwnd, nBar, &info, bRedraw );
Alexandre Julliard's avatar
Alexandre Julliard committed
    return oldPos;
}


/*************************************************************************
 *           GetScrollPos16   (USER.63)
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
INT16 WINAPI GetScrollPos16( HWND16 hwnd, INT16 nBar )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    return (INT16)GetScrollPos( hwnd, nBar );
Alexandre Julliard's avatar
Alexandre Julliard committed
/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           GetScrollPos32   (USER32.285)
Alexandre Julliard's avatar
Alexandre Julliard committed
 *
 * RETURNS
 *    Success: Current position
 *    Failure: 0   
 *
 * REMARKS
 *    Note the ambiguity when 0 is returned.  Use GetLastError
 *    to make sure there was an error (and to know which one).
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
INT WINAPI GetScrollPos( 
HWND hwnd, /* [I] Handle of window */
INT nBar /* [I] One of SB_HORZ, SB_VERT, or SB_CTL */)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
    SCROLLBAR_INFO *infoPtr;
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return 0;
    return infoPtr->CurVal;
}


/*************************************************************************
 *           SetScrollRange16   (USER.64)
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
void WINAPI SetScrollRange16( HWND16 hwnd, INT16 nBar,
                              INT16 MinVal, INT16 MaxVal, BOOL16 bRedraw )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    /* Invalid range -> range is set to (0,0) */
    if ((INT)MaxVal - (INT)MinVal > 0x7fff) MinVal = MaxVal = 0;
    SetScrollRange( hwnd, nBar, MinVal, MaxVal, bRedraw );
Alexandre Julliard's avatar
Alexandre Julliard committed
}
Alexandre Julliard's avatar
Alexandre Julliard committed

Alexandre Julliard's avatar
Alexandre Julliard committed
/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           SetScrollRange32   (USER32.503)
Alexandre Julliard's avatar
Alexandre Julliard committed
 *
 * RETURNS STD
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
BOOL WINAPI SetScrollRange( 
HWND hwnd, /* [I] Handle of window whose scrollbar will be affected */
INT nBar, /* [I] One of SB_HORZ, SB_VERT, or SB_CTL */
INT MinVal, /* [I] New minimum value */
INT MaxVal, /* [I] New maximum value */
BOOL bRedraw /* [I] Should scrollbar be redrawn afterwards ? */)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    SCROLLINFO info;
Alexandre Julliard's avatar
Alexandre Julliard committed
    info.cbSize = sizeof(info);
    info.nMin   = MinVal;
    info.nMax   = MaxVal;
    info.fMask  = SIF_RANGE;
    SetScrollInfo( hwnd, nBar, &info, bRedraw );
Alexandre Julliard's avatar
Alexandre Julliard committed
    return TRUE;
Alexandre Julliard's avatar
Alexandre Julliard committed
}
Alexandre Julliard's avatar
Alexandre Julliard committed

Alexandre Julliard's avatar
Alexandre Julliard committed
/*************************************************************************
 *	     SCROLL_SetNCSbState
 *
 * Updates both scrollbars at the same time. Used by MDI CalcChildScroll().
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
INT SCROLL_SetNCSbState(WND* wndPtr, int vMin, int vMax, int vPos,
Alexandre Julliard's avatar
Alexandre Julliard committed
				       int hMin, int hMax, int hPos)
{
    vInfo.cbSize = hInfo.cbSize = sizeof(SCROLLINFO);
    vInfo.nMin   = vMin;	 hInfo.nMin   = hMin;
    vInfo.nMax   = vMax;	 hInfo.nMax   = hMax;
    vInfo.nPos   = vPos;	 hInfo.nPos   = hPos;
    vInfo.fMask  = hInfo.fMask = SIF_RANGE | SIF_POS;

    SCROLL_SetScrollInfo( wndPtr->hwndSelf, SB_VERT, &vInfo, &vA );
    SCROLL_SetScrollInfo( wndPtr->hwndSelf, SB_HORZ, &hInfo, &hA );

    if( !SCROLL_ShowScrollBar( wndPtr->hwndSelf, SB_BOTH,
			      (hA & SA_SSI_SHOW),(vA & SA_SSI_SHOW) ) )
    {
	/* SetWindowPos() wasn't called, just redraw the scrollbars if needed */
	if( vA & SA_SSI_REFRESH )
	    SCROLL_RefreshScrollBar( wndPtr->hwndSelf, SB_VERT, FALSE, TRUE );

	if( hA & SA_SSI_REFRESH )
	    SCROLL_RefreshScrollBar( wndPtr->hwndSelf, SB_HORZ, FALSE, TRUE );
    }
    return 0;
Alexandre Julliard's avatar
Alexandre Julliard committed
}
Alexandre Julliard's avatar
Alexandre Julliard committed

Alexandre Julliard's avatar
Alexandre Julliard committed
/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           GetScrollRange16   (USER.65)
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
BOOL16 WINAPI GetScrollRange16( HWND16 hwnd, INT16 nBar,
                                LPINT16 lpMin, LPINT16 lpMax)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    INT min, max;
    BOOL16 ret = GetScrollRange( hwnd, nBar, &min, &max );
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (lpMin) *lpMin = min;
    if (lpMax) *lpMax = max;
    return ret;
}


/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           GetScrollRange32   (USER32.286)
Alexandre Julliard's avatar
Alexandre Julliard committed
 *
 * RETURNS STD
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
BOOL WINAPI GetScrollRange( 
HWND hwnd, /* [I] Handle of window */
INT nBar, /* [I] One of SB_HORZ, SB_VERT, or SB_CTL  */
LPINT lpMin, /* [O] Where to store minimum value */
LPINT lpMax /* [O] Where to store maximum value */)
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
    SCROLLBAR_INFO *infoPtr;
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar )))
    {
        if (lpMin) lpMin = 0;
        if (lpMax) lpMax = 0;
        return FALSE;
    }
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (lpMin) *lpMin = infoPtr->MinVal;
    if (lpMax) *lpMax = infoPtr->MaxVal;
Alexandre Julliard's avatar
Alexandre Julliard committed
    return TRUE;
}


/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *
 * Back-end for ShowScrollBar(). Returns FALSE if no action was taken.
 * NOTE: fShowV/fShowH must be zero when nBar is SB_HORZ/SB_VERT.
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
BOOL SCROLL_ShowScrollBar( HWND hwnd, INT nBar, 
			     BOOL fShowH, BOOL fShowV )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    WND *wndPtr = WIN_FindWndPtr( hwnd );
    BOOL retvalue = FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
    if (!wndPtr) return FALSE;
    TRACE("hwnd=%04x bar=%d horz=%d, vert=%d\n",
Alexandre Julliard's avatar
Alexandre Julliard committed
    switch(nBar)
Alexandre Julliard's avatar
Alexandre Julliard committed
    {
    case SB_CTL:
        ShowWindow( hwnd, fShowH ? SW_SHOW : SW_HIDE );
        retvalue = TRUE;
        goto END;
Alexandre Julliard's avatar
Alexandre Julliard committed
    case SB_HORZ:
Alexandre Julliard's avatar
Alexandre Julliard committed
        {
            fShowH = !(wndPtr->dwStyle & WS_HSCROLL);
Alexandre Julliard's avatar
Alexandre Julliard committed
            wndPtr->dwStyle |= WS_HSCROLL;
        }
        else  /* hide it */
        {
            fShowH = (wndPtr->dwStyle & WS_HSCROLL);
Alexandre Julliard's avatar
Alexandre Julliard committed
            wndPtr->dwStyle &= ~WS_HSCROLL;
        }
        if( nBar == SB_HORZ ) break; 
	/* fall through */
Alexandre Julliard's avatar
Alexandre Julliard committed
    case SB_VERT:
Alexandre Julliard's avatar
Alexandre Julliard committed
        {
            fShowV = !(wndPtr->dwStyle & WS_VSCROLL);
Alexandre Julliard's avatar
Alexandre Julliard committed
            wndPtr->dwStyle |= WS_VSCROLL;
        }
Alexandre Julliard's avatar
Alexandre Julliard committed
        {
            fShowV = (wndPtr->dwStyle & WS_VSCROLL);
Alexandre Julliard's avatar
Alexandre Julliard committed
            wndPtr->dwStyle &= ~WS_VSCROLL;
        }
        break;

    default:
        retvalue = FALSE;  /* Nothing to do! */
        goto END;
Alexandre Julliard's avatar
Alexandre Julliard committed
    }

    if( fShowH || fShowV ) /* frame has been changed, let the window redraw itself */
    {
	SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
Alexandre Julliard's avatar
Alexandre Julliard committed
                    | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
        retvalue = TRUE;
        goto END;
    retvalue = FALSE; /* no frame changes */
END:
    WIN_ReleaseWndPtr(wndPtr);
    return retvalue;
}


/*************************************************************************
 *           ShowScrollBar16   (USER.267)
 */
void WINAPI ShowScrollBar16( HWND16 hwnd, INT16 nBar, BOOL16 fShow )
{
    SCROLL_ShowScrollBar( hwnd, nBar, (nBar == SB_VERT) ? 0 : fShow,
				      (nBar == SB_HORZ) ? 0 : fShow );
}


/*************************************************************************
 *           ShowScrollBar32   (USER32.532)
 *
 * RETURNS STD
 */
BOOL WINAPI ShowScrollBar(
HWND hwnd, /* [I] Handle of window whose scrollbar(s) will be affected   */
INT nBar, /* [I] One of SB_HORZ, SB_VERT, SB_BOTH or SB_CTL */
BOOL fShow /* [I] TRUE = show, FALSE = hide  */)
{
    SCROLL_ShowScrollBar( hwnd, nBar, (nBar == SB_VERT) ? 0 : fShow,
                                      (nBar == SB_HORZ) ? 0 : fShow );
Alexandre Julliard's avatar
Alexandre Julliard committed
    return TRUE;
}
Alexandre Julliard's avatar
Alexandre Julliard committed


/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           EnableScrollBar16   (USER.482)
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
BOOL16 WINAPI EnableScrollBar16( HWND16 hwnd, INT16 nBar, UINT16 flags )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
    return EnableScrollBar( hwnd, nBar, flags );
Alexandre Julliard's avatar
Alexandre Julliard committed
}


/*************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
 *           EnableScrollBar32   (USER32.171)
Alexandre Julliard's avatar
Alexandre Julliard committed
 */
BOOL WINAPI EnableScrollBar( HWND hwnd, INT nBar, UINT flags )
Alexandre Julliard's avatar
Alexandre Julliard committed
{
Alexandre Julliard's avatar
Alexandre Julliard committed
    SCROLLBAR_INFO *infoPtr;

    TRACE("%04x %d %d\n", hwnd, nBar, flags );
Alexandre Julliard's avatar
Alexandre Julliard committed
    flags &= ESB_DISABLE_BOTH;

    if (nBar == SB_BOTH)
    {
	if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, SB_VERT ))) return FALSE;
	if (!(bFineWithMe = (infoPtr->flags == flags)) )
	{
	    infoPtr->flags = flags;
	    SCROLL_RefreshScrollBar( hwnd, SB_VERT, TRUE, TRUE );
	}
	nBar = SB_HORZ;
    }
    else
	bFineWithMe = TRUE;
   
    if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return FALSE;
    if (bFineWithMe && infoPtr->flags == flags) return FALSE;
Alexandre Julliard's avatar
Alexandre Julliard committed
    infoPtr->flags = flags;
    SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE );
Alexandre Julliard's avatar
Alexandre Julliard committed
    return TRUE;
}