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

📄 scrolbar.c

📁 rtCell 实时微内核-具有下列功能: 1. 完全抢占的实时微内核结构
💻 C
📖 第 1 页 / 共 2 页
字号:
            pScrolbar->Value -= vo;
    } else if (pScrolbar->Status & CTRL_SCROLLBAR_RIGHT_DOWN) {
        if (pScrolbar->Value < pScrolbar->Max)
            pScrolbar->Value += vo;
    } else {
        return;
    }

    if (pScrolbar->Value < 0) pScrolbar->Value = 0;
    if (pScrolbar->Value > pScrolbar->Max) pScrolbar->Value = pScrolbar->Max;

    scrollOff -= pScrolbar->Value;
    if (scrollOff != 0) {
        RECT r;
        
        if (pScrolbar->pOnScroll != NULL) {
            (*(pScrolbar->pOnScroll))(pScrolbar->pView, scrollOff);
        }

        GetScrolbarTrackRect(pScrolbar, &r);
        UpdateViewRect(pScrolbar->pView, &r);
    }
}

static CBOOL _cdecl_ ScrollbarViewProc(VMSG *pMsg)
{  
    SCROLLBAR *pScrolbar = OBJ_FROM_VIEW(pMsg->pView);
    int xSize, x;
    long val;
    MOUSE_INF mi;
    KEY_INF ki;
    RECT r, r0, r1;

    xSize = GetScrollSize(pScrolbar);  
    x = GetScrolbarPos(pScrolbar);
        
    switch (pMsg->MsgID) {
    case TIMERM_OUT:
        if (pScrolbar->Status & (CTRL_FOCUSSED)) {
            WINDOW *pWin = GetParentWin(pMsg->pView);
            if (pWin != NULL) InformView(pWin->pClientView, pMsg);
        }

        pScrolbar->Timer ++;
        if (pScrolbar->Timer >= CTRL_SCROLLBAR_TIME) {
            pScrolbar->Timer = 0;             
            ScrollbarBtn(pScrolbar);
        }
        return (true);
    case VMSG_GETFOCUS:
        if ((pScrolbar->Status & (CTRL_FOCUSSED)) == 0) {
            WINDOW *pWin = GetParentWin(pMsg->pView);
            if ((pWin->Status & WIN_FOCUSSED) == 0) {
                VMSG msg;
                msg.pView = pWin->pMainView;
                msg.MsgID = VMSG_GETFOCUS;
                SendViewMsg(msg.pView, &msg);
            }
            
            pScrolbar->Status |= CTRL_FOCUSSED;
        }
        return (true);
    case VMSG_LOSTFOCUS:
        pScrolbar->Status &= ~(CTRL_FOCUSSED|CTRL_MOUSE_CATCH); return (true); 
    case MSM_LB_DOWN:
        if ((pScrolbar->Status & CTRL_FOCUSSED)) {
            pScrolbar->Status |= CTRL_MOUSE_ENTER;

            GetScrolbarR(pScrolbar, &r);
            GetScrolbarR0(pScrolbar, &r0);
            GetScrolbarR1(pScrolbar, &r1);

            if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r) == true) {
                pScrolbar->Status |= CTRL_MOUSE_CATCH;
                pScrolbar->Status |= CTRL_CATCH_MOVE;
                pScrolbar->ptCatch.x = pMsg->pt.x-r.left;
                pScrolbar->ptCatch.y = pMsg->pt.y-r.top;
                /* UpdateViewRect(pMsg->pView, &r); */
            } else if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r0) == true) {
                pScrolbar->Status |= CTRL_MOUSE_CATCH;
                pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
                ScrollbarBtn(pScrolbar);
                UpdateViewRect(pMsg->pView, &r0);  
            } else if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r1) == true) {
                pScrolbar->Status |= CTRL_MOUSE_CATCH;
                pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
                ScrollbarBtn(pScrolbar);
                UpdateViewRect(pMsg->pView, &r1);                   
            }
        }

        return (true);
    case MSM_LB_UP:
        pScrolbar->Status &= ~(CTRL_MOUSE_CATCH|CTRL_CATCH_MOVE);
        if (pScrolbar->Status & (CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN)) {
            pScrolbar->Status &= ~(CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN);
            UpdateView(pMsg->pView);
        } 
        if (pScrolbar->Status & (CTRL_FOCUSSED)) {
            VMSG msg;
            msg.MsgID = WINM_SCROLL;
            InformView(pScrolbar->pView->pParent, &msg);
        }
        return (true);
    case MSM_MS_ENTER:
        SetMouseCursor(ARROW);
        pScrolbar->Status |= CTRL_MOUSE_ENTER;
        return (true);
    case MSM_MS_LEAVE:
        pScrolbar->Status &= ~(CTRL_MOUSE_ENTER);
        if (pScrolbar->Status & (CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN)) {
            pScrolbar->Status &= ~(CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN);
            UpdateView(pMsg->pView);
        }
        return (true);
    case MSM_MS_MOVE:
        mi.raw = pMsg->vParam;
        if ((pScrolbar->Status & CTRL_MOUSE_CATCH) && (mi.inf.lbtn != 0)) { 
            if (xSize <= 0) return (true);
            if (pScrolbar->Status & CTRL_CATCH_MOVE) {
                int dx, dy, scrollOff;
                GetScrolbarR(pScrolbar, &r);
                dx = pMsg->pt.x - pScrolbar->ptCatch.x-r.left;
                dy = pMsg->pt.y - pScrolbar->ptCatch.y-r.top;  

                if (pScrolbar->Align & CTRL_ALIGN_VCENTER) x += dy;
                else x += dx;

                if (x < 0) x = 0;
                else if (x > xSize) x = xSize; 
                
                val = x;
                val = (val*(pScrolbar->Max)+((xSize+1)>>1));
                val /= xSize;

                if (val < 0) val = 0;
                if (val > pScrolbar->Max) val = pScrolbar->Max;
                
                scrollOff = pScrolbar->Value-((int)val);
                if (scrollOff != 0) {
                    pScrolbar->Value = (int)val;
                    if (pScrolbar->pOnScroll != NULL) {
                        (*(pScrolbar->pOnScroll))(pScrolbar->pView, scrollOff);
                    }

                    GetScrolbarTrackRect(pScrolbar, &r);
                    UpdateViewRect(pMsg->pView, &r);
                }
            } else {
                GetScrolbarR0(pScrolbar, &r0);
                GetScrolbarR1(pScrolbar, &r1);
                if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r0) == true) {
                    pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
                    UpdateViewRect(pMsg->pView, &r0);
                } else {
                    pScrolbar->Status &= ~CTRL_SCROLLBAR_LEFT_UP;
                    UpdateViewRect(pMsg->pView, &r0);
                }

                if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r1) == true) {
                    pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
                    UpdateViewRect(pMsg->pView, &r1);
                } else {
                    pScrolbar->Status &= ~CTRL_SCROLLBAR_RIGHT_DOWN;
                    UpdateViewRect(pMsg->pView, &r1);
                }
            }
        }        
        return (true); 
    case KEYM_KEY_DOWN:
        ki.raw = pMsg->vParam;
        switch (ki.inf.scan) {
        case SCANCODE_CURSORBLOCKLEFT:
        case SCANCODE_CURSORLEFT:
            if (pScrolbar->Align & CTRL_ALIGN_HCENTER) {
                pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
                ScrollbarBtn(pScrolbar);
            }
            return (true);
        case SCANCODE_CURSORBLOCKUP:
        case SCANCODE_CURSORUP:
            if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
                pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
                ScrollbarBtn(pScrolbar);
            }
            return (true);
        case SCANCODE_CURSORBLOCKRIGHT:
        case SCANCODE_CURSORRIGHT:
            if (pScrolbar->Align & CTRL_ALIGN_HCENTER) {
                pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
                ScrollbarBtn(pScrolbar);
            }
            return (true);
        case SCANCODE_CURSORBLOCKDOWN:
        case SCANCODE_CURSORDOWN:
            if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
                pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
                ScrollbarBtn(pScrolbar);
            }
            return (true);
        default:
            InformView(pScrolbar->pView->pParent, pMsg);
            return (true);
        }

    case KEYM_KEY_UP:
        pScrolbar->Status &= ~(CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN);
        UpdateView(pMsg->pView);
        return (true);
    default:
        return CtrlViewProc(pMsg, ScrolbarPaint, &(pScrolbar->Status));
    }
}

SCROLLBAR* CreateScrollbar(VIEW* pParent, PSCROLL pOnScroll, CWORD Style)
{
    VIEW   *pView;
    SCROLLBAR *pScrolbar;  

    if (pParent == NULL) 
        return (NULL);

    pView = CreateControl(0, 0, BOX_W, BOX_H, pParent, (VS_MOVABLE|VS_RESIZABLE),
                          ScrollbarViewProc, sizeof(SCROLLBAR));
    if (pView == NULL) return (NULL);
    
    pScrolbar = OBJ_FROM_VIEW(pView);
    pScrolbar->pView = pView;
    pScrolbar->ObjColor = ScrollbarColor;
    pScrolbar->pOnScroll = pOnScroll;
    pScrolbar->ptCatch.x = 0; pScrolbar->ptCatch.y = 0;
    pScrolbar->Status = 0;
    if (Style & CTRL_ALIGN_VCENTER)
        pScrolbar->Align = CTRL_ALIGN_VCENTER;
    else
        pScrolbar->Align = CTRL_ALIGN_HCENTER;
    pScrolbar->Value = 0;
    pScrolbar->Page = 1;
    pScrolbar->Max = 1;
    pScrolbar->sliderSize = 0;
    pScrolbar->btnSize = 0;
    pScrolbar->Timer = 0; 
    return (pScrolbar);
}

void DeleteScrollbar(SCROLLBAR *pScrolbar)
{
    if (pScrolbar == NULL) return;
    DeleteView(pScrolbar->pView);
} 

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

⌨️ 快捷键说明

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