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

📄 scrolbar.c

📁 rtCell 实时微内核-具有下列功能: 1. 完全抢占的实时微内核结构
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *******************************************************************************
 *                      The real-time kernel "rtCell"                          *
 *              Copyright 2005 taowentao, allrights reserved.                  *
 * File : Scrollbar.c                                                          *
 * By   : taowentao     2006-09-02  2007-05-20                                 *
 *******************************************************************************
 */

#if !defined(SCROLLBAR_H)
#include "giCell\Wins\include\Scrolbar.h"
#endif

#if !defined(WINDOW_H)
#include "giCell\Wins\include\Window.h"
#endif   

/*
 *******************************************************************************
 *                                                                             *
 *******************************************************************************
 */

static COLOR ScrollbarColor = GD_GRAY; 

/*
 *******************************************************************************
 *                                                                             *
 *******************************************************************************
 */

void SetScrolbar(SCROLLBAR *pScrolbar, const int page, const RECT *pPositionRect,
                 const RECT *pVRect, const RECT *pMRect, CBOOL dblScrol)
{
    VIEW *pView = pScrolbar->pView;
    int xSize, Max, View;
    long sliderSize;
    RECT r = (*pPositionRect);
    
    pScrolbar->Page = page;
    if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
        r.left = r.right-BOX_W+1;
        xSize = GetRectYSize(&r);
        if (dblScrol == true) {
            xSize -= BOX_H;
            pScrolbar->Status |= CTRL_SCROLLBAR_VBAR_EX;
        } else {
            pScrolbar->Status &= ~CTRL_SCROLLBAR_VBAR_EX;
        }

        Max = GetRectYSize(pMRect); View = GetRectYSize(pVRect);
        pScrolbar->Max = Max - View;
        pScrolbar->Value = pVRect->top - pMRect->top;
    } else {
        r.top = r.bottom-BOX_W+1;
        if (dblScrol == true) r.right -= BOX_H;
        xSize = GetRectXSize(&r);
        Max = GetRectXSize(pMRect); View = GetRectXSize(pVRect);
        pScrolbar->Max = Max - View;
        pScrolbar->Value = pVRect->left - pMRect->left;  
    }

    pScrolbar->sliderSize = 0;
    if (xSize < (BOX_H*2)) {
        /*if (xSize < (2*BOX_H_MIN)) xSize = (2*BOX_H_MIN);*/ 
        pScrolbar->btnSize = BOX_H_MIN;
    } else {
        if (xSize >= (BOX_H*2+BOX_H_MIN)) {
            sliderSize = View;
            sliderSize *= (xSize-BOX_H*2);
            sliderSize = (sliderSize + ((Max+1)>>1))/Max;
            if (sliderSize < BOX_H_MIN) sliderSize = BOX_H_MIN;
            pScrolbar->sliderSize = (int)sliderSize;
        }
        pScrolbar->btnSize = BOX_H;
    }
    
    if (pScrolbar->Value < 0) pScrolbar->Value = 0;
    if (pScrolbar->Value > pScrolbar->Max) pScrolbar->Value = pScrolbar->Max;
    SetViewRect(pView, r.left, r.top, GetRectXSize(&r), GetRectYSize(&r));
}

static int GetScrollSize(SCROLLBAR *pScrolbar)
{
    VIEW *pView = pScrolbar->pView;
    int xSize;   

    if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
        xSize = GetRectYSize(&(pView->viewRect));
        if (pScrolbar->Status & CTRL_SCROLLBAR_VBAR_EX)
            xSize -= BOX_H;
    } else {
        xSize = GetRectXSize(&(pView->viewRect));
    }

    if (xSize < (2*BOX_H_MIN)) xSize = (2*BOX_H_MIN);
    xSize -= ((pScrolbar->btnSize<<1)+pScrolbar->sliderSize);
    return (xSize);      
}

static int GetScrolbarPos(SCROLLBAR *pScrolbar)
{
    int xSize = GetScrollSize(pScrolbar);
    long val = pScrolbar->Value;
    
    val = (val*xSize+((pScrolbar->Max+1)>>1));
    val /= (pScrolbar->Max);
    return ((int)val);
}

static void GetScrolbarR0(SCROLLBAR *pScrolbar, RECT *pRect)
{
    RECT r0 = pScrolbar->pView->viewRect;
    
    if (pScrolbar->Align & CTRL_ALIGN_VCENTER)
        r0.bottom = r0.top+pScrolbar->btnSize-1;
    else
        r0.right = r0.left+pScrolbar->btnSize-1;

    if (pRect != NULL) (*pRect) = r0;
}

static void GetScrolbarR1(SCROLLBAR *pScrolbar, RECT *pRect)
{
    int xSize = GetScrollSize(pScrolbar);
    RECT r1, r0;

    GetScrolbarR0(pScrolbar, &r0);
    r1 = r0;
    if (pScrolbar->Align & CTRL_ALIGN_VCENTER)
        MoveRect(&r1, 0, xSize+pScrolbar->btnSize+pScrolbar->sliderSize);
    else
        MoveRect(&r1, xSize+pScrolbar->btnSize+pScrolbar->sliderSize, 0); 

    if (pRect != NULL) (*pRect) = r1;
}

static void GetScrolbarR(SCROLLBAR *pScrolbar, RECT *pRect)
{
    int x = GetScrolbarPos(pScrolbar);
    RECT r = pScrolbar->pView->viewRect;
    
    if (pScrolbar->Align & CTRL_ALIGN_VCENTER) { 
        MoveRect(&r, 0, x+pScrolbar->btnSize);
        r.bottom = r.top+pScrolbar->sliderSize-1;
    } else {
        MoveRect(&r, x+pScrolbar->btnSize, 0);
        r.right = r.left+pScrolbar->sliderSize-1;
    }

    if (pRect != NULL) (*pRect) = r;
}

static void GetScrolbarTrackRect(SCROLLBAR *pScrolbar, RECT *pRect)
{
    RECT r = pScrolbar->pView->viewRect;

    if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
        r.top += pScrolbar->btnSize; r.bottom -= pScrolbar->btnSize;
        if (pScrolbar->Status & CTRL_SCROLLBAR_VBAR_EX)
            r.bottom -= BOX_H;
    } else {  
        r.left += pScrolbar->btnSize; r.right -= pScrolbar->btnSize;
    }

    if (pRect != NULL) (*pRect) = r;
}

void SetScrolbarValue(SCROLLBAR *pScrolbar, const int value)
{
    if (value >= 0 && value <= pScrolbar->Max) {
        RECT r;
        if (pScrolbar->Value == value) return;
        pScrolbar->Value = value;
        GetScrolbarTrackRect(pScrolbar, &r);
        UpdateViewRect(pScrolbar->pView, &r);
    }
}

static void ScrolbarPaint(VIEW *pView)
{
    SCROLLBAR *pScrolbar;
    CWORD Align;
    int offl, offr;
    RECT r, r0, r1, rt;

    pScrolbar = OBJ_FROM_VIEW(pView);
    Align = pScrolbar->Align; 
    GetScrolbarR(pScrolbar, &r);
    GetScrolbarR0(pScrolbar, &r0);
    GetScrolbarR1(pScrolbar, &r1);

    offl = 0; offr = 0;
    if (pScrolbar->Status & CTRL_SCROLLBAR_LEFT_UP)
        offl = 1;
    if (pScrolbar->Status & CTRL_SCROLLBAR_RIGHT_DOWN)
        offr = 1;

    /* get box position, and draw it */
    if (Align & CTRL_ALIGN_VCENTER) {    
        FillRect(&r0, pScrolbar->ObjColor);
        FillRect(&r1, pScrolbar->ObjColor);
        if (pScrolbar->btnSize == BOX_H) {
            DrawTriangle(Align, r0.top+8+offl, r0.left+7+offl, 3, -1, GD_BLACK);
            DrawTriangle(Align, r1.bottom-9+offr, r1.left+7+offr, 3, 1, GD_BLACK);
        } else {
            DrawTriangle(Align, r0.top+4+offl, r0.left+7+offl, 1, -1, GD_BLACK);
            DrawTriangle(Align, r1.bottom-4+offr, r1.left+7+offr, 1, 1, GD_BLACK);
        }

        if ((pView->wdStatus & VS_HASTRANS) == 0) {
            rt = r0; rt.top = r0.bottom+1; rt.bottom = r.top-1;
            FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);

            rt.top = r.bottom+1; rt.bottom = r1.top-1;
            FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);
        }

        if (pScrolbar->Status & CTRL_SCROLLBAR_VBAR_EX) {
            rt = pScrolbar->pView->viewRect;
            rt.top = r1.bottom+1;
            FillRect(&rt, pScrolbar->ObjColor);
        }
    } else {   
        FillRect(&r0, pScrolbar->ObjColor);
        FillRect(&r1, pScrolbar->ObjColor);
        if (pScrolbar->btnSize == BOX_H) {
            DrawTriangle(Align, r0.left+8+offl, r0.top+7+offl, 3, -1, GD_BLACK);
            DrawTriangle(Align, r1.right-9+offr, r1.top+7+offr, 3, 1, GD_BLACK);
        } else {
            DrawTriangle(Align, r0.left+4+offl, r0.top+7+offl, 1, -1, GD_BLACK);
            DrawTriangle(Align, r1.right-4+offr, r1.top+7+offr, 1, 1, GD_BLACK);
        }

        if ((pView->wdStatus & VS_HASTRANS) == 0) {
            rt = r0; rt.left = r0.right+1; rt.right = r.left-1;
            FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);

            rt.left = r.right+1; rt.right = r1.left-1;
            FillRectColor2(&rt, GD_WHITE, GD_LIGHTGRAY);
        }
    }
    
    if (pScrolbar->Status & CTRL_SCROLLBAR_LEFT_UP) DrawRect(&r0, GD_DARKGRAY);
    else DrawUpRect(&r0);
    if (pScrolbar->Status & CTRL_SCROLLBAR_RIGHT_DOWN) DrawRect(&r1, GD_DARKGRAY);
    else DrawUpRect(&r1);
    FillRect(&r, pScrolbar->ObjColor);
    DrawUpRect(&r);
}

static void ScrollbarBtn(SCROLLBAR *pScrolbar)
{
    int scrollOff = pScrolbar->Value;
    int vo = pScrolbar->Page;
    
    if (pScrolbar->Status & CTRL_SCROLLBAR_LEFT_UP) {
        if (pScrolbar->Value > 0)

⌨️ 快捷键说明

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