⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrlbar.c

📁 TN-kernel内核针对LPC系列ARM7处理器和S3C44B0X重新定制好的源代码包。内含Nano-X GUI。
💻 C
📖 第 1 页 / 共 3 页
字号:
        }
        else if (pos == SBS_VERTTHUMB || pos == SBS_HORZTHUMB)
        {
                sbCode = SB_THUMBTRACK;
        }

        switch(msg)
        {
        case WM_NCLBUTTONDOWN:
        case WM_NCLBUTTONDBLCLK:
            downPos = pos;
        break;

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

                        rc = hwnd->winrect;
                        moveTop = rc.top + cx;
                        moveBottom = hwnd->winrect.bottom - cx;
                        moveRange = moveBottom - moveTop;

                        itemCount = pData->maxPos - pData->minPos + 1;
                        itemVisible = pData->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 >= pData->minPos &&
                                 newThumbPos <= pData->maxPos)
                        {
                                         SendMessage (hwnd,
                                        WM_VSCROLL, SB_THUMBTRACK, newThumbPos);

                                         SendMessage (GetParent(hwnd),
                                        WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
                        }
                        break;
                    }
            }
            if (horzbar)
            {
                if (sbCode == SB_THUMBTRACK && downPos == SBS_HORZTHUMB)
                {
                        /* jmt(2k0819): new algorithm for SB_THUMBTRACK */

                        rc = hwnd->winrect;
                        moveLeft = rc.left + cy;
                        moveRight = hwnd->winrect.right - cy;
                        moveRange = moveRight - moveLeft;

                        itemCount = pData->maxPos - pData->minPos + 1;
                        itemVisible = pData->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 >= pData->minPos &&
                             newThumbPos <= pData->maxPos)
                        {
                                    SendMessage (hwnd,
                                        WM_HSCROLL, SB_THUMBTRACK, newThumbPos);

                                    SendMessage (GetParent(hwnd),
                                        WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
                        }
                        break;
                }
             }
        break;

        case WM_NCLBUTTONUP:
            bDraw=FALSE;
            downPos = SBS_UNKNOWN;

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

                        rc = hwnd->winrect;
                        moveTop = rc.top + cx;
                        moveBottom = hwnd->winrect.bottom - cx;
                        moveRange = moveBottom - moveTop;

                        itemCount = pData->maxPos - pData->minPos + 1;
                        itemVisible = pData->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 >= pData->minPos &&
                             newThumbPos <= pData->maxPos)
                        {
                                SendMessage (hwnd,
                                        WM_VSCROLL, SB_THUMBTRACK, newThumbPos);

                                SendMessage (GetParent(hwnd),
                                        WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
                        }
                        break;        /* case */
                    }
                    if (horzbar)
                    {
                        /* jmt(2k0819): new algorithm for SB_THUMBTRACK */

                        rc = hwnd->winrect;
                        moveLeft = rc.left + cy;
                        moveRight = hwnd->winrect.right - cy;
                        moveRange = moveRight - moveLeft;

                        itemCount = pData->maxPos - pData->minPos + 1;
                        itemVisible = pData->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 >= pData->minPos &&
                             newThumbPos <= pData->maxPos)
                        {
                            SendMessage (hwnd,
                                        WM_HSCROLL, SB_THUMBTRACK, newThumbPos);

                            SendMessage (GetParent(hwnd),
                                        WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
                        }
                        break;        /* case */
                    }
            }
            else
            {
                if (vertbar)
                {
                        SendMessage (hwnd, WM_VSCROLL, sbCode, 0);
                        SendMessage (GetParent(hwnd), WM_VSCROLL, sbCode, 0);
                }
                if (horzbar)
                {
                        SendMessage (hwnd, WM_HSCROLL, sbCode, 0);
                        SendMessage (GetParent(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);
}

static void
wndScrollBarPos (HWND hwnd, BOOL bIsHBar, RECT* rcBar)        /* jmt: 2k0820 */
{
    UINT moveRange;
    PMWSCROLLBARINFO pSBar;
    int cx,cy;
    RECT rc;

    rc = hwnd->winrect;
    cx=rc.right-rc.left;
    cy=rc.bottom-rc.top;
    pSBar = (MWSCROLLBARINFO *)hwnd->userdata;

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

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


    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)        /* jmt: 2k0820 */
{
            MWSCROLLBARINFO* pData;

        pData = (MWSCROLLBARINFO *)pWin->userdata;

        if (!strcmp(pWin->pClass->lpszClassName,"SCROLLBAR"))
                return pData;
        else
                    return NULL;
}

BOOL EnableScrollBarEx (HWND hWnd, int iSBar, BOOL bEnable)        /* jmt: iSBar not used */
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    BOOL bPrevState;
    RECT rcBar;

    DWORD dwStyle;        /* jmt:2k0820 */

    pWin = (HWND)hWnd;

    if ( !(pSBar = wndGetScrollBar (pWin)) )
        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;

    dwStyle = (GetWindowStyle (hWnd) & SBS_TYPEMASK);        /* jmt: 2k0820 */

    if (dwStyle == SBS_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
    MwPaintScrollbars(hWnd,NULL,dwStyle);        /* a must */
#endif

    return TRUE;
}

BOOL GetScrollPosEx (HWND hWnd, int iSBar, int* pPos)        /* jmt: iSBar not used */
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;

    pWin = (HWND)hWnd;

    if ( !(pSBar = wndGetScrollBar (pWin)) )
        return FALSE;

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

BOOL GetScrollRangeEx (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos)        /* jmt: iSBar not used */
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;

    pWin = (HWND)hWnd;

    if ( !(pSBar = wndGetScrollBar (pWin)) )
        return FALSE;

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

BOOL SetScrollPosEx (HWND hWnd, int iSBar, int iNewPos)        /* jmt: iSBar not used */
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    RECT rcBar;

    DWORD dwStyle;        /* jmt:2k0820 */

    pWin = (HWND)hWnd;

    if ( !(pSBar = wndGetScrollBar (pWin)) )
        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;
    }

    dwStyle = (GetWindowStyle (hWnd) & SBS_TYPEMASK);        /* jmt: 2k0820 */

    if (dwStyle == SBS_VERT)
    {
        wndGetVScrollBarRect (pWin, &rcBar);
        rcBar.left --;
        rcBar.right --;
    }
    else
    {
        wndGetHScrollBarRect (pWin, &rcBar);
        rcBar.top  --;
        rcBar.bottom --;
    }

    wndScrollBarPos (pWin, dwStyle == SBS_HORZ, &rcBar);

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

BOOL SetScrollRangeEx (HWND hWnd, int iSBar, int iMinPos, int iMaxPos)        /* jmt: iSBar not used */
{
    PMWSCROLLBARINFO pSBar;
    HWND pWin;
    RECT rcBar;

    DWORD dwStyle;        /* jmt:2k0820 */

    pWin = (HWND)hWnd;

    if ( !(pSBar = wndGetScrollBar (pWin)) )
        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))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -