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

📄 uiscrollbar.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*  Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File :  uiscrollbar.c
Desc :  滚动条

Author : GUI Develop Group.lzj
Date : 2007-08-10
Notes :
$Log: uiscrollbar.c,v $
Revision 1.2  2008/06/19 04:43:21  Administrator
代码整理!

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.1.1.1  2008/03/06 13:29:09  Lingzhaojun
no message

Revision 1.4  2007/10/15 02:58:09  Lingzhaojun
添加GUI控件注释

Revision 1.3  2007/10/08 02:04:27  Lingzhaojun
GUI添加自动注释

*********************************************************************/
#include "uiscrollbar.h"


/*----------------------------------------------------------------------
Name  :  ScrollbarPaint
Desc  :  滚动条画屏
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;
    UINT16 x, y, x1, y1;
    DispMode TranspLevel = WinGetTranStyle(win->style);

    if (!(WIN_NEEDPAIT(win)))
        return TRUE;


    //画背景
    x = win->x;
    y = win->y;
    x1 = win->x + win->w;
    y1 = win->y + win->h;
    while (y < y1 - WscrollObj->ScrollHight)
    {
        DrawBmpIdEx(x, y, WscrollObj->Iconback, NULL, TranspLevel);
        y = y + WscrollObj->ScrollHight;
    }
    DrawBmpIdEx(x, (UINT16)(y1 - WscrollObj->ScrollHight), WscrollObj->Iconback, NULL, TranspLevel);

    //画上下按钮
    DrawBmpIdEx(win->x, win->y, WscrollObj->IconUp, NULL, TranspLevel);
    DrawBmpIdEx(win->x, (UINT16)(win->y + win->h - WscrollObj->TopHight), WscrollObj->IconDown, NULL, TranspLevel);


    //画滑块
    if (WscrollObj->Percent > MaxScroll)
        WscrollObj->Percent = MaxScroll;

    x = win->x + (win->w - WscrollObj->ScrollWeight) / 2;
    y = win->y + WscrollObj->TopHight + (win->h - 2 * WscrollObj->TopHight - WscrollObj->ScrollLen) * WscrollObj->Percent / MaxScroll;
    WscrollObj->CurPositionY = y;
    y1 = y + WscrollObj->ScrollLen;

    while (y < y1 - WscrollObj->ScrollHight)
    {
        DrawBmpIdEx(x, y, WscrollObj->IconScroll, NULL, TranspLevel);
        y = y + WscrollObj->ScrollHight;
    }
    DrawBmpIdEx(x, (UINT16)(y1 - WscrollObj->ScrollHight), WscrollObj->IconScroll, NULL, TranspLevel);

    WIN_CLEARPAIT(win);
    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  ScrollbarKey
Desc  :  滚动条对按键的响应
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{


    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  ScrollbarTouch
Desc  :  滚动条对触摸屏的响应
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarTouch(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;
    PUHPOINT touchPoint = (PUHPOINT)lParam;
    UINT16 y0, y1;

    //上下按钮
    if ((touchPoint->y < win->y + WscrollObj->TopHight)
            && (touchPoint->y > win->y)
            && (wParam == TM_STATE_DOWN))
        return ScrollbarCommand(win, EV_ScrollUp, NULL);

    if ((touchPoint->y > win->y + win->h - WscrollObj->TopHight)
            && (touchPoint->y < win->y + win->h)
            && (wParam == TM_STATE_DOWN))
        return ScrollbarCommand(win, EV_ScrollDown, NULL);


    if ((wParam == TM_STATE_DOWN) || (wParam == TM_STATE_MOVE))
    {


        //触及滚动条,拖动
        if (touchPoint->y < WscrollObj->CurPositionY)
        {

            y0 = win->y + WscrollObj->TopHight;
            y1 = win->y + win->h - WscrollObj->TopHight - WscrollObj->ScrollLen;
            WscrollObj->Percent = (touchPoint->y - y0) * MaxScroll / (y1 - y0);
        }
        else if (touchPoint->y > WscrollObj->CurPositionY + WscrollObj->ScrollLen)
        {

            y0 = win->y + WscrollObj->TopHight;
            y1 = win->y + win->h - WscrollObj->TopHight - WscrollObj->ScrollLen;
            WscrollObj->Percent = (touchPoint->y - WscrollObj->ScrollLen - y0 + 1) * MaxScroll / (y1 - y0);

        }
        else //拖动滚动条
        {

        }



        WinSendCommand(win, EV_ScrollChange);

        WindowInvalidateWindow(win);
    }





    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  ScrollbarCommand
Desc  :  滚动条command消息处理,
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarCommand(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    INT16U  cwID = WM_CMD_GETCWID(wParam);
    INT16U  cwEvent = WM_CMD_GETEVENT(wParam);
    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;

    switch (cwEvent)
    {

        case EV_ScrollUp:
            {

                if (WscrollObj->Percent > 5)
                    WscrollObj->Percent = WscrollObj->Percent - 5;
                else
                    WscrollObj->Percent = 0;

                WinSendCommand(win, EV_ScrollChange);
                WindowInvalidateWindow(win);
            }
            break;

        case EV_ScrollDown:
            {

                if (WscrollObj->Percent < MaxScroll - 5)
                    WscrollObj->Percent = WscrollObj->Percent + 5;
                else
                    WscrollObj->Percent = MaxScroll;


                WinSendCommand(win, EV_ScrollChange);
                WindowInvalidateWindow(win);
            }
            break;

    }

    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  ScrollbarSetPercent
Desc  :  滚动条设置滚动条的位置
Params:  wParam:位置百分比
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarSetPercent(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;


    if (wParam > MaxScroll)
        wParam = MaxScroll;

    WscrollObj->Percent = wParam;
    WindowInvalidateWindow(win);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  ScrollbarSetScrollLen
Desc  :  设置滚动条的长度百分比
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarSetScrollLen(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;

    if (wParam > 100)
        wParam = 100;


    WscrollObj->ScrollLen = (win->h - 2 * WscrollObj->TopHight) * wParam / 100;
    WindowInvalidateWindow(win);



    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  ScrollbarSetPic
Desc  :  滚动条设置图片
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarSetPic(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{


    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  ScrollbarCreate
Desc  :  滚动条创建
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarCreate(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ScrollBar *WscrollObj = NULL;

    WscrollObj = MallocClass(W_ScrollBar);
    if (NULL == WscrollObj)
        return FALSE;


    if (win->style&WES_ScrollSimple)      /*风格一,无箭头*/
    {
        WscrollObj->IconScroll = win->BmpID;   /*滚动条图标*/
        WscrollObj->Iconback = win->BmpID + 1; /*滚动条背景图标*/
        WscrollObj->IconUp = 0;      /*滚动条顶部按钮图标*/
        WscrollObj->IconDown = 0;      /*滚动条底部按钮图标*/
        WscrollObj->Percent = 0;      /*当前滚动条的位置百分率*/
        WscrollObj->ScrollHight = 20;     /*滚动条高度*/
        WscrollObj->ScrollWeight = 4;     /*滚动条宽度*/
        WscrollObj->ScrollLen = WscrollObj->ScrollHight + 7; /*滚动条长度*/
        WscrollObj->TopHight = 0;      /*上箭头高度*/
    }
    else if (win->style&WES_ScrollDefault)   /*风格二*/
    {
        //win->BmpID=BID_Scroll;
        WscrollObj->IconScroll = win->BmpID;
        WscrollObj->Iconback = win->BmpID + 1;
        WscrollObj->IconUp = BID_ScrollTop;
        WscrollObj->IconDown = BID_Scrollbutton;
        WscrollObj->Percent = 0;
        WscrollObj->ScrollHight = 20;
        WscrollObj->ScrollWeight = 8;
        WscrollObj->ScrollLen = WscrollObj->ScrollHight + 7;
        WscrollObj->TopHight = 11;
    }




    win->Data = WscrollObj;


    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  ScrollbarDestroy
Desc  :  滚动条关闭
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 ScrollbarDestroy(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;

    FreeClass(WscrollObj);


    return TRUE;
}






/*----------------------------------------------------------------------
Name  :  GetScrollPercent
Desc  :  滚动条获取位置的百分比
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GetScrollPercent(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ScrollBar *WscrollObj = (W_ScrollBar *)win->Data;


    return WscrollObj->Percent;
}










/*滚动条消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinScrollProcMap , CW_TYPE_SCROLLBAR)
ON_MESSAGE(WM_PAINT ,  ScrollbarPaint)
ON_MESSAGE(WM_COMMAND,  ScrollbarCommand)
ON_MESSAGE(WM_DESTROY , ScrollbarDestroy)
ON_MESSAGE(WM_CREATE,  ScrollbarCreate)
ON_MESSAGE(WM_SetPic,  ScrollbarSetPic)
ON_MESSAGE(WM_TOUCH ,  ScrollbarTouch)
ON_MESSAGE(WM_SetPercent , ScrollbarSetPercent)
ON_MESSAGE(WM_SetScrollLen, ScrollbarSetScrollLen)
ON_MESSAGE(WM_GetPercent, GetScrollPercent)
END_MESSAGE_MAP()






#if 0
/*
Name: WindowCreateScroll
Desc: 滚动条窗口创建函数
*/

WINDOW* WindowCreateScroll(
    WINDOW    *parent,  //父窗口
    INT32U    style,   //风格
    WIN_ID    id ,   //窗口 ID


    INT16S    x,    //窗口ID
    INT16S    y,
    INT16S    w,
    INT16S    h,
    INT16U    captionId,
    INT16U    bmpId,

    PCHILD_WINDOW  childList,   //子窗口列表.
    PWINDOW_PROCREG  procRegList ,  //消息处理列表.

    void    *privateData  //私有数据
)
{
    WINDOW*win = NULL;
    UINT16 i = 0;

    //两个按钮子窗口
    CHILD_WINDOW ChildButton[] =
    {
        {CW_TYPE_Button, WID_ButtonTop, 0, 0, 12, 11, (WS_TICK | WS_CHILDS | WS_ACTIVE | WS_BEFOCUS), 0, BID_ScrollTop},
        {CW_TYPE_Button, WID_ButtonBottom, 0, 0, 12, 11, (WS_TICK | WS_CHILDS | WS_ACTIVE | WS_BEFOCUS), 0, BID_Scrollbutton},
        CWIN_LASTITEM
    };



    if (style&WES_ScrollDefault)
    {
        ChildButton[0].x = x;
        ChildButton[0].y = y;

        ChildButton[1].x = x;
        ChildButton[1].y = y + h - ChildButton[1].h;

        /*创建对话框窗口*/
        win = WindowCreate(parent ,
                           style | WS_TICK,
                           id,
                           x, y,
                           w, h,
                           0,
                           bmpId,
                           0,
                           ChildButton,
                           WinScrollProcMap,
                           NULL);

    }



    return win;



}

#endif

⌨️ 快捷键说明

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