OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [mw/] [src/] [mwin/] [winsbar.2] - Rev 673

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * Copyright (c) 2000 Greg Haerr <greg@censoft.com>
 * Portions Copyright (c) 1999, 2000, Wei Yongming.
 * jmt: scrollbar thumb ported
 *
 * Microwindows win32 NonClient Scrollbars
 */
#define MWINCLUDECOLORS//jmt: for color macros
#include "windows.h"
#include "wintern.h"
#include "wintools.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>//printf
/* scrollbar status/positions*/
#define SBS_UNKNOWN             0x0000
#define SBS_LEFTARROW           0x0001
#define SBS_RIGHTARROW          0x0002
#define SBS_LEFTSPACE           0x0004
#define SBS_RIGHTSPACE          0x0008
#define SBS_HORZTHUMB           0x0010
#define SBS_UPARROW             0x0020
#define SBS_DOWNARROW           0x0040
#define SBS_UPSPACE             0x0080
#define SBS_DOWNSPACE           0x0100
#define SBS_VERTTHUMB           0x0200
#define SBS_MASK                0x03ff
#define SBS_DISABLED            0x4000
#define SBS_HIDE                0x8000

#define HSCROLLBARVISIBLE(hwnd) ((hwnd)->style & WS_HSCROLL)
#define VSCROLLBARVISIBLE(hwnd) ((hwnd)->style & WS_VSCROLL)

//#

/****************************** Drawing Helpers *******************************/
static void
Draw3DUpFrame(HDC hDC, int l, int t, int r, int b)
{
        RECT    rc;
        HBRUSH  hbr;

        SetRect(&rc, l, t, r, b);
        Draw3dBox(hDC, rc.left, rc.top,
                rc.right-rc.left, rc.bottom-rc.top,
                GetSysColor(COLOR_3DLIGHT),
                GetSysColor(COLOR_WINDOWFRAME));
        InflateRect(&rc, -1, -1);
        Draw3dBox(hDC, rc.left, rc.top,
                rc.right-rc.left, rc.bottom-rc.top,
                GetSysColor(COLOR_BTNHIGHLIGHT),
                GetSysColor(COLOR_BTNSHADOW));
        InflateRect(&rc, -1, -1);

        hbr = CreateSolidBrush(LTGRAY);
        FillRect(hDC, &rc, hbr);
        DeleteObject(hbr);
}


/* 
 * Adjust client area smaller if scrollbars visible.
 * Also, compute the NC hittest regions for the scrollbars.
 */
void
MwAdjustNCScrollbars(HWND hwnd)
{
        BOOL    vertbar = VSCROLLBARVISIBLE(hwnd);
        BOOL    horzbar = HSCROLLBARVISIBLE(hwnd);

        if (vertbar) {
                hwnd->clirect.right -= mwSYSMETRICS_CXVSCROLL;
                if (horzbar)
                        hwnd->clirect.bottom -= mwSYSMETRICS_CYHSCROLL;
                hwnd->vscroll.rc.left = hwnd->clirect.right;
                hwnd->vscroll.rc.right = hwnd->clirect.right +
                        mwSYSMETRICS_CXVSCROLL;
                hwnd->vscroll.rc.top = hwnd->clirect.top;
                hwnd->vscroll.rc.bottom = hwnd->clirect.bottom;
        } else
                SetRectEmpty(&hwnd->vscroll.rc);
        if (horzbar) {
                if (!vertbar)
                        hwnd->clirect.bottom -= mwSYSMETRICS_CYHSCROLL;
                hwnd->hscroll.rc.top = hwnd->clirect.bottom;
                hwnd->hscroll.rc.bottom = hwnd->clirect.bottom +
                        mwSYSMETRICS_CYHSCROLL;
                hwnd->hscroll.rc.left = hwnd->clirect.left;
                hwnd->hscroll.rc.right = hwnd->clirect.right;
        } else
                SetRectEmpty(&hwnd->hscroll.rc);
}

static int
wndGetBorder(HWND hwnd)
{
        if (hwnd->style & WS_BORDER)  {
                if ((hwnd->style & WS_CAPTION) == WS_CAPTION)
                        return mwSYSMETRICS_CXFRAME;
                return mwSYSMETRICS_CXBORDER;
        }
        return 0;
}

static BOOL
wndGetVScrollBarRect (HWND hwnd, RECT* rcVBar)
{
    if (hwnd->style & WS_VSCROLL) {
        rcVBar->left = hwnd->winrect.right - mwSYSMETRICS_CXVSCROLL
                        - wndGetBorder (hwnd);
        rcVBar->right = hwnd->winrect.right - wndGetBorder (hwnd);
        rcVBar->top  = hwnd->clirect.top;
        rcVBar->bottom = hwnd->winrect.bottom - wndGetBorder (hwnd);

        if (hwnd->style & WS_HSCROLL && !(hwnd->hscroll.status & SBS_HIDE))
            rcVBar->bottom -= mwSYSMETRICS_CYHSCROLL;
        
        return TRUE;
    }
    
    return FALSE;
}

static BOOL
wndGetHScrollBarRect (HWND hwnd, RECT* rcHBar)
{
    if (hwnd->style & WS_HSCROLL) {
        rcHBar->top = hwnd->winrect.bottom - mwSYSMETRICS_CYHSCROLL
                        - wndGetBorder (hwnd);
        rcHBar->bottom = hwnd->winrect.bottom - wndGetBorder (hwnd);
        rcHBar->left  = hwnd->clirect.left;
        rcHBar->right = hwnd->winrect.right - wndGetBorder (hwnd);

        if (hwnd->style & WS_VSCROLL && !(hwnd->vscroll.status & SBS_HIDE))
            rcHBar->right -= mwSYSMETRICS_CXVSCROLL;

        return TRUE;
    }
    
    return FALSE;
}

void
MwPaintNCScrollbars(HWND hwnd, HDC hdc)
{
        BOOL    vertbar = VSCROLLBARVISIBLE(hwnd);
        BOOL    horzbar = HSCROLLBARVISIBLE(hwnd);
        BOOL    fGotDC = FALSE;
        RECT    rc,rc2;

        POINT   p3[3];
        int     shrink=2;

        int start = 0;
        RECT rcHBar, rcVBar;


        if (!hdc && (horzbar || vertbar)) {
                hdc = GetWindowDC(hwnd);
                fGotDC = TRUE;
        }

        if (horzbar && vertbar) {
                rc.left = hwnd->clirect.right;
                rc.top = hwnd->clirect.bottom;
                rc.right = rc.left + mwSYSMETRICS_CXVSCROLL;
                rc.bottom = rc.top + mwSYSMETRICS_CYHSCROLL;
                FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));
        }
        if (vertbar) {
                rc = hwnd->vscroll.rc;

                /* bkgnd */
                FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));

                /* up */
                Draw3dUpDownState(hdc, rc.left, rc.top,
                        mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,
                        hwnd->vscroll.status & SBS_UPARROW);
                /* down */
                Draw3dUpDownState(hdc, rc.left,rc.bottom-mwSYSMETRICS_CYHSCROLL,
                        mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,
                        hwnd->vscroll.status & SBS_DOWNARROW);
#if 1//jmt: draw arrows
                SelectObject(hdc,GetStockObject(BLACK_BRUSH));
                /* up */
                p3[0].x= rc.left + (mwSYSMETRICS_CXVSCROLL/2) - 1;
                p3[0].y= rc.top + 2 + shrink;
                p3[1].x= rc.left + 2 + shrink - 1;
                p3[1].y= rc.top + (mwSYSMETRICS_CYHSCROLL-4) - shrink;
                p3[2].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink;
                p3[2].y= rc.top + (mwSYSMETRICS_CYHSCROLL-4) - shrink;
                Polygon(hdc,p3,3);
                /* down */
                p3[0].x= rc.left + (mwSYSMETRICS_CXVSCROLL/2) - 1;
                p3[0].y= rc.bottom - 4 - shrink;
                p3[1].x= rc.left + 2 + shrink - 1;
                p3[1].y= rc.bottom-mwSYSMETRICS_CYHSCROLL + 2 + shrink;
                p3[2].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink;
                p3[2].y= rc.bottom-mwSYSMETRICS_CYHSCROLL + 2 + shrink;
                Polygon(hdc,p3,3);
#endif
#if 1
                // draw moving bar

                wndGetVScrollBarRect (hwnd, &rcVBar);
                rcVBar.left -- ;
                rcVBar.right -- ;

                start = rcVBar.top + mwSYSMETRICS_CYVSCROLL + hwnd->vscroll.barStart;
                    
                if (start + hwnd->vscroll.barLen > rcVBar.bottom)
                        start = rcVBar.bottom - hwnd->vscroll.barLen;

                if (hwnd->vscroll.barLen == 0)
                        hwnd->vscroll.barLen=rc.bottom-rc.top-(mwSYSMETRICS_CYVSCROLL*2); 
                
                /* bkgnd */
                rc2.left=rc.left; rc2.right=rc.right/*-1*/;
                rc2.top=rc.top+mwSYSMETRICS_CYHSCROLL;
                rc2.bottom=start;
                if (rc2.bottom>rc2.top)
                        FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));   

                rc2.top=start+hwnd->vscroll.barLen;
                rc2.bottom=rc.bottom-mwSYSMETRICS_CYHSCROLL;
                if (rc2.bottom>rc2.top)
                        FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));   

                Draw3DUpFrame (hdc, rcVBar.left, start, rcVBar.right,
                        start + hwnd->vscroll.barLen);
#if 0
                printf("barv:(l,t,r,b):(%d,%d,%d,%d)\n",
                        rcVBar.left, start, rcVBar.right,
                        start + hwnd->vscroll.barLen);
#endif
#endif
        }
        if (horzbar) {
                rc = hwnd->hscroll.rc;

                /* bkgnd */
                FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));

                /* left */
                Draw3dUpDownState(hdc, rc.left, rc.top,
                        mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,
                        hwnd->hscroll.status & SBS_LEFTARROW);
                /* right */
                Draw3dUpDownState(hdc, rc.right-mwSYSMETRICS_CXVSCROLL, rc.top,
                        mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,
                        hwnd->hscroll.status & SBS_RIGHTARROW);
#if 1//jmt: draw arrows
                SelectObject(hdc,GetStockObject(BLACK_BRUSH));
                /* left */
                p3[0].x= rc.left + 2 + shrink;
                p3[0].y= rc.top + (mwSYSMETRICS_CYHSCROLL/2) ;
                p3[1].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink ;
                p3[1].y= rc.top + 2 + shrink;
                p3[2].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink;
                p3[2].y= rc.bottom - 4 - shrink + 1;
                Polygon(hdc,p3,3);
                /* right */
                p3[0].x= rc.right - 4 - shrink;
                p3[0].y= rc.top + (mwSYSMETRICS_CYHSCROLL/2) ;
                p3[1].x= rc.right-mwSYSMETRICS_CXVSCROLL + 2 + shrink ;
                p3[1].y= rc.top + 2 + shrink;
                p3[2].x= rc.right-mwSYSMETRICS_CXVSCROLL + 2 + shrink;
                p3[2].y= rc.bottom - 4 - shrink + 1;
                Polygon(hdc,p3,3);
#endif
#if 1
                // draw moving bar.

                wndGetHScrollBarRect (hwnd, &rcHBar);
                rcHBar.top -- ;
                rcHBar.bottom -- ;

                start = rcHBar.left + mwSYSMETRICS_CXHSCROLL + hwnd->hscroll.barStart;

                if (start + hwnd->hscroll.barLen > rcHBar.right)
                        start = rcHBar.right - hwnd->hscroll.barLen;

                if (hwnd->hscroll.barLen == 0)
                        hwnd->hscroll.barLen=rc.right-rc.left-(mwSYSMETRICS_CXHSCROLL*2); 

                /* bkgnd */
                rc2.top=rc.top; rc2.bottom=rc.bottom/*-1*/;
                rc2.left=rc.left+mwSYSMETRICS_CXVSCROLL;
                rc2.right=start;
                if (rc2.right>rc2.left)
                        FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));   

                rc2.left=start+hwnd->hscroll.barLen;
                rc2.right=rc.right-mwSYSMETRICS_CXVSCROLL;
                if (rc2.right>rc2.left)
                        FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));   

                Draw3DUpFrame (hdc, start, rcHBar.top, start + hwnd->hscroll.barLen,
                        rcHBar.bottom);
#if 0
                printf("barh:(l,t,r,b):(%d,%d,%d,%d)\n",
                        start, rcHBar.top, start + hwnd->hscroll.barLen,
                        rcHBar.bottom);
#endif
#endif
        }

        if (fGotDC)
                ReleaseDC(hwnd, hdc);
}

/* handle a non-client message for a scrollbar*/
void
MwHandleNCMessageScrollbar(HWND hwnd, WPARAM hitcode, LPARAM lParam, UINT msg/*BOOL fDown*/)
{
        int     pos = SBS_UNKNOWN;
        BOOL    vertbar = VSCROLLBARVISIBLE(hwnd);
        BOOL    horzbar = HSCROLLBARVISIBLE(hwnd);
        int *   pStat;
        POINT   pt;
        RECT    rc;

        static BOOL bDraw;

        static int downPos = SBS_UNKNOWN;//
        static int sbCode;
        int newThumbPos;

        int itemMoveable,itemCount,itemVisible,moveRange;//jmt:2k0819
        int moveTop,moveBottom,moveLeft,moveRight;//jmt:2k0819

        POINTSTOPOINT(pt, lParam);
        for (;;) {      /* use for() to allow break statement*/
                if (hitcode == HTVSCROLL && vertbar) 
                {
                        pStat = &hwnd->vscroll.status;
                        rc = hwnd->vscroll.rc;
                        rc.bottom = rc.top + mwSYSMETRICS_CYVSCROLL;
                        if (PtInRect(&rc, pt)) 
                        {
                                pos = SBS_UPARROW;
                                break;
                        }
                        rc.bottom = hwnd->vscroll.rc.bottom;
                        rc.top = rc.bottom - mwSYSMETRICS_CYVSCROLL;
                        if (PtInRect(&rc, pt)) 
                        {
                                pos = SBS_DOWNARROW;
                                break;
                        }
                        pos = SBS_VERTTHUMB;
                } else if (hitcode == HTHSCROLL && horzbar) 
                {
                        pStat = &hwnd->hscroll.status;
                        rc = hwnd->hscroll.rc;
                        rc.right = rc.left + mwSYSMETRICS_CXHSCROLL;
                        if (PtInRect(&rc, pt)) {
                                pos = SBS_LEFTARROW;
                                break;
                        }
                        rc.right = hwnd->hscroll.rc.right;
                        rc.left = rc.right - mwSYSMETRICS_CXHSCROLL;
                        if (PtInRect(&rc, pt)) {
                                pos = SBS_RIGHTARROW;
                                break;
                        }
                        pos = SBS_HORZTHUMB;
                } else
                        return;
                break;
        }

        if (pos == SBS_UNKNOWN)
                return;

        *pStat &= ~SBS_MASK;            /* remove stray mouse states*/

        if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK)//jmt:2k0819
                *pStat |= pos;
        else *pStat &= ~pos;

        if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK)//jmt:2k0819
                bDraw=TRUE;

        if (bDraw)
                MwPaintNCScrollbars(hwnd, NULL);

        if (pos == SBS_UPARROW || pos == SBS_LEFTARROW)//jmt:2k0820 
        {
                if (hwnd->vscroll.curPos != hwnd->vscroll.minPos)
                        sbCode = SB_LINEUP;
        }
        else if (pos == SBS_DOWNARROW || pos == SBS_RIGHTARROW)//jmt:2k0820 
        {
                if (hwnd->vscroll.curPos != hwnd->vscroll.maxPos)
                        sbCode = SB_LINEDOWN;
        }
        else if (pos == SBS_VERTTHUMB || pos == SBS_HORZTHUMB)// 
        {
                sbCode = SB_THUMBTRACK;//
        }

        switch(msg)
        {
        case WM_NCLBUTTONDOWN:
        case WM_NCLBUTTONDBLCLK://jmt:2k0819
            downPos = pos;
        break;

        case WM_NCMOUSEMOVE://jmt:2k0819
            if (hitcode == HTVSCROLL && vertbar) 
            {
                if (sbCode == SB_THUMBTRACK && downPos == SBS_VERTTHUMB)// 
                {
                        //jmt(2k0819): new algorithm for SB_THUMBTRACK

                        rc = hwnd->vscroll.rc;
                        moveTop = rc.top + mwSYSMETRICS_CYVSCROLL;
                        moveBottom = hwnd->vscroll.rc.bottom - mwSYSMETRICS_CYVSCROLL;
                        moveRange = moveBottom - moveTop;

                        itemCount = hwnd->vscroll.maxPos - hwnd->vscroll.minPos + 1;
                        itemVisible = hwnd->vscroll.pageStep;
                        itemMoveable = itemCount - itemVisible + 1;

                        newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange;
                        printf("((%d-%d)*%d)/%d=%d\n",
                                pt.y,moveTop,itemMoveable,moveRange,newThumbPos);
                        //#

                        if ( newThumbPos >= hwnd->vscroll.minPos &&
                             newThumbPos <= hwnd->vscroll.maxPos)
                                SendMessage (hwnd,
                                        WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
                        break;
                }
            }

            if (hitcode == HTHSCROLL && horzbar) 
            {
                if (sbCode == SB_THUMBTRACK && downPos == SBS_HORZTHUMB)// 
                {
                        //jmt(2k0819): new algorithm for SB_THUMBTRACK

                        rc = hwnd->hscroll.rc;
                        moveLeft = rc.left + mwSYSMETRICS_CXHSCROLL;
                        moveRight = hwnd->hscroll.rc.right - mwSYSMETRICS_CXHSCROLL;
                        moveRange = moveRight - moveLeft;

                        itemCount = hwnd->hscroll.maxPos - hwnd->hscroll.minPos + 1;
                        itemVisible = hwnd->hscroll.pageStep;
                        itemMoveable = itemCount - itemVisible + 1;

                        newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange;
                        printf("((%d-%d)*%d)/%d=%d\n",
                                pt.y,moveLeft,itemMoveable,moveRange,newThumbPos);
                        //#
    
                        if ( newThumbPos >= hwnd->hscroll.minPos &&
                             newThumbPos <= hwnd->hscroll.maxPos)
                                SendMessage (hwnd,
                                        WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
                        break;
                }
             }

        break;

        case WM_NCLBUTTONUP://jmt:2k0819
            bDraw=FALSE;
            downPos = SBS_UNKNOWN;//

            if (sbCode==SB_THUMBTRACK)
            {
                    if (hitcode == HTVSCROLL && vertbar) 
                    {
                        //jmt(2k0819): new algorithm for SB_THUMBTRACK

                        rc = hwnd->vscroll.rc;
                        moveTop = rc.top + mwSYSMETRICS_CYVSCROLL;
                        moveBottom = hwnd->vscroll.rc.bottom - mwSYSMETRICS_CYVSCROLL;
                        moveRange = moveBottom - moveTop;

                        itemCount = hwnd->vscroll.maxPos - hwnd->vscroll.minPos + 1;
                        itemVisible = hwnd->vscroll.pageStep;
                        itemMoveable = itemCount - itemVisible + 1;

                        newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange;
                        printf("((%d-%d)*%d)/%d=%d\n",
                                pt.y,moveTop,itemMoveable,moveRange,newThumbPos);
                        //#
                        if ( newThumbPos >= hwnd->vscroll.minPos &&
                             newThumbPos <= hwnd->vscroll.maxPos)
                                SendMessage (hwnd,
                                        WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
                        break;
                    }

                    if (hitcode == HTHSCROLL && horzbar) 
                    {
                        //jmt(2k0819): new algorithm for SB_THUMBTRACK

                        rc = hwnd->hscroll.rc;
                        moveLeft = rc.left + mwSYSMETRICS_CXHSCROLL;
                        moveRight = hwnd->hscroll.rc.right - mwSYSMETRICS_CXHSCROLL;
                        moveRange = moveRight - moveLeft;

                        itemCount = hwnd->hscroll.maxPos - hwnd->hscroll.minPos + 1;
                        itemVisible = hwnd->hscroll.pageStep;
                        itemMoveable = itemCount - itemVisible + 1;

                        newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange;
                        printf("((%d-%d)*%d)/%d=%d\n",
                                pt.y,moveLeft,itemMoveable,moveRange,newThumbPos);
                        //#
    
                        if ( newThumbPos >= hwnd->hscroll.minPos &&
                             newThumbPos <= hwnd->hscroll.maxPos)
                                SendMessage (hwnd,
                                        WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
                        break;
                    }
             }
             else//jmt:2k0820
             {
                    if (hitcode == HTVSCROLL && vertbar) 
                        SendMessage (hwnd, WM_VSCROLL, sbCode, 0);

                    if (hitcode == HTHSCROLL && horzbar) 
                        SendMessage (hwnd, WM_HSCROLL, sbCode, 0);
             }
        break;
        }

}


static BOOL
PtInRect2(const RECT *lprc, int x, int y)
{
        POINT   p;

        p.x = x;
        p.y = y;
        return PtInRect(lprc, p);
}

#if 1//0000


static void
wndScrollBarPos (HWND hwnd, BOOL bIsHBar, RECT* rcBar)
{
    UINT moveRange;
    PMWSCROLLBARINFO pSBar;

    if (bIsHBar)
        pSBar = &hwnd->hscroll;
    else
        pSBar = &hwnd->vscroll;

    if (pSBar->minPos == pSBar->maxPos) {
        pSBar->status |= SBS_HIDE;
        return;
    }

    if (bIsHBar)
        moveRange = (rcBar->right - rcBar->left) - (mwSYSMETRICS_CXHSCROLL<<1);
    else
        moveRange = (rcBar->bottom - rcBar->top) - (mwSYSMETRICS_CYVSCROLL<<1);

#define MWM_DEFBARLEN   18//
#define MWM_MINBARLEN   8//

    if (pSBar->pageStep == 0) 
    {
        pSBar->barLen = MWM_DEFBARLEN;

        if (pSBar->barLen > moveRange)
            pSBar->barLen = MWM_MINBARLEN;
    }
    else 
    {
        pSBar->barLen = moveRange * pSBar->pageStep /
              (pSBar->maxPos - pSBar->minPos + 1);
        if (pSBar->barLen < MWM_MINBARLEN)
            pSBar->barLen = MWM_MINBARLEN;
    }

    pSBar->barStart = moveRange * (pSBar->curPos - pSBar->minPos) /
       (pSBar->maxPos - pSBar->minPos + 1);


    if (pSBar->barStart + pSBar->barLen > moveRange)
        pSBar->barStart = moveRange - pSBar->barLen;


    if (pSBar->barStart < 0)
        pSBar->barStart = 0;
}

static PMWSCROLLBARINFO wndGetScrollBar (HWND pWin, int iSBar)
{
    if (iSBar == SB_HORZ) {
        if (pWin->style & WS_HSCROLL)
            return &pWin->hscroll;
    }
    else if (iSBar == SB_VERT) {
        if (pWin->style & WS_VSCROLL)
            return &pWin->vscroll;
    }

    return NULL;
}

BOOL EnableScrollBar (HWND hWnd, int iSBar, BOOL bEnable)
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    BOOL bPrevState;
    RECT rcBar;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )//ok
        return FALSE;

    bPrevState = !(pSBar->status & SBS_DISABLED);

    if (bEnable && !bPrevState)
        pSBar->status &= ~SBS_DISABLED;
    else if (!bEnable && bPrevState)
        pSBar->status |= SBS_DISABLED;
    else
        return FALSE;

    if (iSBar == SB_VERT)
    {
        wndGetVScrollBarRect (pWin, &rcBar);
        rcBar.left --;
        rcBar.right --;
    }
    else
    {
        wndGetHScrollBarRect (pWin, &rcBar);
        rcBar.top  --;
        rcBar.bottom --;
    }
#if 0
    SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));
#else
    MwPaintNCScrollbars(hWnd,NULL);//a must
#endif

    return TRUE;
}

BOOL  GetScrollPos (HWND hWnd, int iSBar, int* pPos)
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;

    *pPos = pSBar->curPos;
    return TRUE;
}

BOOL  GetScrollRange (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos)
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;

    *pMinPos = pSBar->minPos;
    *pMaxPos = pSBar->maxPos;
    return TRUE;
}

BOOL  SetScrollPos (HWND hWnd, int iSBar, int iNewPos)//ok
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    RECT rcBar;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;

    if (iNewPos < pSBar->minPos)
        pSBar->curPos = pSBar->minPos;
    else
        pSBar->curPos = iNewPos;

    {
        int max = pSBar->maxPos;
        max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;

        if (pSBar->curPos > max)
            pSBar->curPos = max;
    }
    
    if (iSBar == SB_VERT)
    {
        wndGetVScrollBarRect (pWin, &rcBar);
        rcBar.left --;
        rcBar.right --;
    }
    else
    {
        wndGetHScrollBarRect (pWin, &rcBar);
        rcBar.top  --;
        rcBar.bottom --;
    }

    wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);

#if 0
    SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));
#else
    MwPaintNCScrollbars(hWnd,NULL);//a must
#endif
    return TRUE;
}

BOOL  SetScrollRange (HWND hWnd, int iSBar, int iMinPos, int iMaxPos)
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    RECT rcBar;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;

    pSBar->minPos = (iMinPos < iMaxPos)?iMinPos:iMaxPos;
    pSBar->maxPos = (iMinPos > iMaxPos)?iMinPos:iMaxPos;
    
    // validate parameters.
    if (pSBar->curPos < pSBar->minPos)
        pSBar->curPos = pSBar->minPos;

    if (pSBar->pageStep <= 0)
        pSBar->pageStep = 0;
    else if (pSBar->pageStep > (pSBar->maxPos - pSBar->minPos + 1))
        pSBar->pageStep = pSBar->maxPos - pSBar->minPos + 1;
    
    {
        int max = pSBar->maxPos;
        max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;

        if (pSBar->curPos > max)
            pSBar->curPos = max;
    }

    if (iSBar == SB_VERT)
    {
        wndGetVScrollBarRect (pWin, &rcBar);
        rcBar.left --;
        rcBar.right --;
    }
    else
    {
        wndGetHScrollBarRect (pWin, &rcBar);
        rcBar.top  --;
        rcBar.bottom --;
    }
    wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);

#if 0
    SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));
#else
    MwPaintNCScrollbars(hWnd,NULL);//a must
#endif

    return TRUE;
}

BOOL  SetScrollInfo (HWND hWnd, int iSBar, 
                LPCSCROLLINFO lpsi, BOOL fRedraw)//ok
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    RECT rcBar;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;
        
    if( lpsi->fMask & SIF_RANGE )
    {
        pSBar->minPos = (lpsi->nMin < lpsi->nMax)?lpsi->nMin:lpsi->nMax;
        pSBar->maxPos = (lpsi->nMin < lpsi->nMax)?lpsi->nMax:lpsi->nMin;
    }
    
    if( lpsi->fMask & SIF_POS )
        pSBar->curPos = lpsi->nPos;
    
    if( lpsi->fMask & SIF_PAGE )
        pSBar->pageStep = lpsi->nPage;

    // validate parameters.
    if (pSBar->curPos < pSBar->minPos)
        pSBar->curPos = pSBar->minPos;

    if (pSBar->pageStep <= 0)
        pSBar->pageStep = 0;
    else if (pSBar->pageStep > (pSBar->maxPos - pSBar->minPos + 1))
        pSBar->pageStep = pSBar->maxPos - pSBar->minPos + 1;
    
    {
        int max = pSBar->maxPos;
        max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;

        if (pSBar->curPos > max)
            pSBar->curPos = max;
    }

    if(fRedraw)
    {
        if (iSBar == SB_VERT)
        {
            wndGetVScrollBarRect (pWin, &rcBar);
            rcBar.left --;
            rcBar.right --;
        }
        else
        {
            wndGetHScrollBarRect (pWin, &rcBar);
            rcBar.top --;
            rcBar.bottom --;
        }
        wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);

#if 0
        SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));
#else
        MwPaintNCScrollbars(hWnd,NULL);//a must
#endif
    }
    
    return TRUE;
}

BOOL  GetScrollInfo(HWND hWnd, int iSBar, LPSCROLLINFO lpsi)
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;
        
    if( lpsi->fMask & SIF_RANGE )
    {
        lpsi->nMin = pSBar->minPos;
        lpsi->nMax = pSBar->maxPos;
    }
    
    if( lpsi->fMask & SIF_POS )
    {
        lpsi->nPos = pSBar->curPos;
    }
    
    if( lpsi->fMask & SIF_PAGE )
        lpsi->nPage = pSBar->pageStep;
    
    return TRUE;
}

BOOL  ShowScrollBar (HWND hWnd, int iSBar, BOOL bShow)
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    BOOL bPrevState;
    RECT rcBar;
    
    pWin = (HWND)hWnd;
    
    if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )
        return FALSE;

    bPrevState = !(pSBar->status & SBS_HIDE);

    if (bShow && !bPrevState)
        pSBar->status &= ~SBS_HIDE;
    else if (!bShow && bPrevState)
        pSBar->status |= SBS_HIDE;
    else
        return FALSE;
#if 0//fix: no WM_CHANGESIZE
    SendMessage (hWnd, WM_CHANGESIZE, 0, 0);
#endif
    if (iSBar == SB_VERT)
        wndGetVScrollBarRect (pWin, &rcBar);
    else
        wndGetHScrollBarRect (pWin, &rcBar);

    {
        RECT rcWin, rcClient;
        
        memcpy (&rcWin, &pWin->winrect.left, sizeof (RECT));
        
        rcClient.left = 0;
        rcClient.top  = 0;
        rcClient.right = pWin->clirect.right - pWin->clirect.left;
        rcClient.bottom = pWin->clirect.bottom - pWin->clirect.top;
#if 0//fix: no WM_SIZECHANGED
        SendMessage/*SendAsyncMessage*/ (hWnd, WM_SIZECHANGED, 
            (WPARAM)&rcWin, (LPARAM)&rcClient);
#endif
    }
    
    if (bShow) {
        SendMessage (hWnd, WM_NCPAINT, 0, 0);
    }
    else {
        rcBar.left -= pWin->clirect.left;
        rcBar.top  -= pWin->clirect.top;
        rcBar.right -= pWin->clirect.left;
        rcBar.bottom -= pWin->clirect.top;
        SendMessage (hWnd, WM_NCPAINT, 0, 0);
        InvalidateRect (hWnd, &rcBar, TRUE);
    }

    return TRUE;
}
#endif

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.