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

📄 uiguage.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*  Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File :  uiguage.h
Desc :  进度条,指示条
Author :  GUI Develop Group.lzj
Date :  2007-08-10
Notes :
$Log: uiguage.c,v $
Revision 1.2  2008/06/19 04:43:20  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.8  2007/12/03 07:25:43  Hanjiang
音量进度条显示的数字直接调用系统全局变量,原用百分比计算会有误差,数字变化不连续

Revision 1.7  2007/11/27 09:04:32  Lingzhaojun
修改音量显示不准确

Revision 1.6  2007/10/30 11:42:36  Chenmeiyou
修正了EQ滑动条问题

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

Revision 1.4  2007/10/08 04:02:23  Lingzhaojun
去除GUI的VC编译警告

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

   20070807。 试验对垂直,水平指示条的兼容

*********************************************************************/
#include "uiguage.h"



extern WINDOW_PROCREG WinBmpProcMap[];
extern PWINDOW gGuiDspCurrUpdateWindow;
/*时间型进度表图片*/
WinPicDescp GuagePicListTime[] =
{
    {Icon_GuageBack, BID_TimeGuageBack,   20, 200},
    {Icon_GuagePassed, BID_TimeGuage174_314_224, 21, 201},
    {Icon_Guage,  BID_Guage,     8 + 30, 200 + 5},
    EndWinPicDescp()
};

/*垂直型EQ条图片*/
WinPicDescp GuagePicListEQ[] =
{
    {Icon_GuageBack, BID_EQback,   220, 20},
    {Icon_Guage,  BID_EQSelect,  220, 20},
    EndWinPicDescp()
};

/*音量型图片*/
WinPicDescp GuagePicListVol[] =
{
    {Icon_GuageBack,  BID_MusicVol10_180,   220, 20},
    {Icon_GuagePassed,  BID_MusicVolBack  ,   220, 20},
    EndWinPicDescp()
};



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

    W_Guage*WguageObj = (W_Guage *)win->Data;
    UINT16*pID = lParam;
    IconType Type = wParam;
    IMAGE_BMPDATA BmpSize;

    PicDescp *Bmp = (PicDescp*)lParam;
    //Type=Type&0x0000FFFF;
    PROCHANDLE procHandle = GuiDspGetWindowResProc(gGuiDspCurrUpdateWindow , win->id);
    switch (Type)
    {
        case Icon_GuageBack:
            WguageObj->IconBackground.BmpID = Bmp->BmpID;
            WguageObj->IconBackground.X = Bmp->X;
            WguageObj->IconBackground.Y = Bmp->Y;
            GetBmpHeadWidth(procHandle, WguageObj->IconBackground.BmpID, &BmpSize);
            WguageObj->IconPassedH = BmpSize.h;
            WguageObj->IconPassedW = BmpSize.w;
            WguageObj->IconPassed.X = WguageObj->IconBackground.X;
            WguageObj->IconPassed.Y = WguageObj->IconBackground.Y;
            break;

        case Icon_GuagePassed:
            WguageObj->IconPassed.BmpID = Bmp->BmpID;
            WguageObj->IconPassed.X = Bmp->X;
            WguageObj->IconPassed.Y = Bmp->Y;
            GetBmpHeadWidth(procHandle, WguageObj->IconPassed.BmpID, &BmpSize);
            WguageObj->IconPassedH = BmpSize.h;
            WguageObj->IconPassedW = BmpSize.w;

            break;

        case Icon_Guage:
            WguageObj->Iconguage.BmpID = Bmp->BmpID;
            WguageObj->Iconguage.X = Bmp->X;
            WguageObj->Iconguage.Y = Bmp->Y;
            break;

        default:

            break;


    }


    WindowInvalidateWindow(win);

    return TRUE;

}




/*----------------------------------------------------------------------
Name  :  GuageWinPaint
Desc  :  进度条画屏,集中处理所有画图操作
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_Guage*WguageObj = (W_Guage *)win->Data;
    UHRECT srcRect;
    DispMode TranspLevel = WinGetTranStyle(win->style);


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


    /*先画背景*/
    //DrawPicture(WguageObj->IconBackground);
    DrawBmpIdEx(WguageObj->IconBackground.X, WguageObj->IconBackground.Y, WguageObj->IconBackground.BmpID, NULL, TranspLevel);


    srcRect.x = 0;
    srcRect.y = 0;

    if (win->style&WES_GuageApeak) //垂直型指示条
    {
        srcRect.w = WguageObj->IconPassedW;
        srcRect.h = (WguageObj->IconPassedH - 6) * WguageObj->percent / MaxGuage;//cmy:要减去滑动块的厚度
        WguageObj->Iconguage.Y = srcRect.h + win->y;
    }
    else
    {
        if (win->style&WES_GuageVol) //音量进度条的图标左右都未靠齐
            srcRect.w = 26 + (WguageObj->IconPassedW - 47) * WguageObj->percent / MaxGuage;
        else
            srcRect.w = WguageObj->IconPassedW * WguageObj->percent / MaxGuage;
        srcRect.h = WguageObj->IconPassedH;
        WguageObj->Iconguage.X = srcRect.w + win->x;
    }


    /*画逝去填充部分*/
    if (win->style&WES_GuageFill)
        DrawBmpIdEx(WguageObj->IconPassed.X, WguageObj->IconPassed.Y, WguageObj->IconPassed.BmpID, &srcRect, TranspLevel);


    /*画进度点滑块*/

    if (win->style&WES_GuageSlider)
    {
        //DrawPicture(WguageObj->Iconguage);
        DrawBmpIdEx(WguageObj->Iconguage.X, WguageObj->Iconguage.Y, WguageObj->Iconguage.BmpID, NULL, TranspLevel);
    }


    /*音量数值*/
    if (win->style&WES_GuageVol)
    {
        ColorDesc color = {COLOR_WHITE, COLOR_RED, DSPM_Normal};
        char zero[] = "00";  //huangsl, for 0结束符.
        zero[0] += (char)gpSysConfig->OutputVolume / 10;
        zero[1] += (char)gpSysConfig->OutputVolume % 10;
        DrawStringAsiiEx((UINT16)(win->x + win->w - 8) , (UINT16)(win->y + 2) , 20 , zero, Font16X16 , &color , 0);
    }


    WIN_CLEARPAIT(win);

    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  GuageWinTouch
Desc  :  进度条对触摸屏的响应
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinTouch(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_Guage*WguageObj = (W_Guage *)win->Data;
    PUHPOINT touchPoint = (PUHPOINT)lParam;
    UINT16 percent;

    if (wParam == TM_STATE_DOWN)
    {


        if (win->style&WES_GuageApeak) //垂直型指示条
        {
            if (touchPoint->y > (WguageObj->IconPassed.Y + WguageObj->IconPassedH))
                touchPoint->y = WguageObj->IconPassed.Y + WguageObj->IconPassedH;
            if (touchPoint->y < WguageObj->IconPassed.Y)
                touchPoint->y = WguageObj->IconPassed.Y;

            percent = (touchPoint->y - WguageObj->IconPassed.Y) * MaxGuage / WguageObj->IconPassedH;
        }
        else
        {
            if (touchPoint->x > (WguageObj->IconPassed.X + WguageObj->IconPassedW))
                touchPoint->x = WguageObj->IconPassed.X + WguageObj->IconPassedW;
            if (touchPoint->x < WguageObj->IconPassed.X)
                touchPoint->x = WguageObj->IconPassed.X;

            percent = (touchPoint->x - WguageObj->IconPassed.X) * MaxGuage / WguageObj->IconPassedW;
        }

        /*重新设置进度*/
        WindowSendMessage(win, WM_GuageUpdate, percent, NULL);
        WinSendCommand(win, EV_TouchPress);   //向父窗口发送comman消息
    }


    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  GuageWinKey
Desc  :  进度条对按键的响应
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    UINT16  keyPress = (UINT16)((wParam) >> 16);
    UINT16  KEY_EV = (UINT16)(wParam);

    if (keyPress)
        return FALSE;


    switch (KEY_EV)
    {


        case KE_EXIT_RELEASE:
        case KE_RETURN_RELEASE:
        case KE_MENU_RELEASE:
            //for  example
            WindowDestroy(win->Parent);
            break;
    }






    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  GuageWinTick
Desc  :  进度条Tick消息,目前未用
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinTick(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    /* W_Guage*WguageObj=(W_Guage *)win->Data;

     if(Ts<999)
      Ts=Ts+25;
     else
      WindowDestroy(win);


     //WindowSendMessage( win, WM_GuageUpdate, Ts, NULL);



    */
    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  GuageWinSetpolar
Desc  :  设置进度滑块两级的坐标,
Params:  使用wParam参数设置,
   高位为终点X坐标,低16位为起点X坐标
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinSetpolar(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Guage*WguageObj = (W_Guage *)win->Data;


    WguageObj->endpoint = wParam >> 16;
    WguageObj->startpoint = wParam & 0x00ff;
    return TRUE;


}



/*----------------------------------------------------------------------
Name  :  GuageWinSetPermillage
Desc  :  进度条更新进度千分比指示,wParam为更新的进度(最大为1000)
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinSetPermillage(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_Guage*WguageObj = (W_Guage *)win->Data;

    if (wParam > MaxGuage) wParam = MaxGuage;
    WguageObj->percent = wParam;

    if (win->style&WES_GuageEQ)
        WindowInvalidateWindow(win->Parent);
    else
        WindowInvalidateWindow(win);
    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  GuageWinCreat
Desc  :  进度条创建消息
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinCreat(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_Guage*WguageObj = NULL;
    UINT16 i;

    WguageObj = MallocClass(W_Guage);
    if (NULL == WguageObj)
        return FALSE;


    WguageObj->IconBackground.BmpID = win->BmpID; /*进度条背景图片*/
    WguageObj->IconBackground.X = win->x;
    WguageObj->IconBackground.Y = win->y;
    WguageObj->IconPassed.BmpID = 0;    /*进度逝去区填充图标*/
    WguageObj->Iconguage.BmpID = 0;     /*进度条块*/

    WguageObj->percent = 382;      /*当前进度千分比*/
    //WguageObj->lastPosition=0;      /*保存了上一次进度条位置*/
    //WguageObj->startpoint=0;       /*起点位置*/
    //WguageObj->endpoint=300-2;      /*终点位置*/
    win->Data = WguageObj;


    if (win->style&WES_GuageTime)     /*时间型进度条*/
    {
        i = 0;
        GuagePicListTime[0].pic.X = win->x;
        GuagePicListTime[0].pic.Y = win->y;
        GuagePicListTime[1].pic.X = win->x + 1;
        GuagePicListTime[1].pic.Y = win->y + 1;
        GuagePicListTime[2].pic.X = win->x + 1;
        GuagePicListTime[2].pic.Y = win->y;

        while (GuagePicListTime[i].IconType != IconMax)
        {
            GuageWinSetPic(win,  GuagePicListTime[i].IconType, &(GuagePicListTime[i].pic));
            i++;
        }
    }

    if (win->style&WES_GuageEQ)      /*EQ型指示条*/
    {
        i = 0;
        GuagePicListEQ[0].pic.X = win->x;
        GuagePicListEQ[0].pic.Y = win->y;
        GuagePicListEQ[1].pic.X = win->x;
        GuagePicListEQ[1].pic.Y = win->y;
        while (GuagePicListEQ[i].IconType != IconMax)
        {
            GuageWinSetPic(win,  GuagePicListEQ[i].IconType, &(GuagePicListEQ[i].pic));
            i++;
        }

    }

    if (win->style&WES_GuageVol)     /*音量型指示条*/
    {
        win->style |= WES_GuageFill;
        i = 0;
        GuagePicListVol[0].pic.X = win->x;
        GuagePicListVol[0].pic.Y = win->y;
        GuagePicListVol[1].pic.X = win->x;
        GuagePicListVol[1].pic.Y = win->y;
        while (GuagePicListVol[i].IconType != IconMax)
        {
            GuageWinSetPic(win,  GuagePicListVol[i].IconType, &(GuagePicListVol[i].pic));
            i++;
        }

    }




    return TRUE;
}


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

    W_Guage*WguageObj = (W_Guage *)win->Data;

    FreeClass(WguageObj);



    return TRUE;
}

/*----------------------------------------------------------------------
Name  :  GuageWinGetPercent
Desc  :  获取进度条当前地千分比,通常当触摸屏重设了进度后由父窗口调用
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 GuageWinGetPercent(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_Guage*WguageObj = (W_Guage *)win->Data;

    return  WguageObj->percent;
}




/*进度条基本类消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinGuageProcMap , CW_TYPE_Guage)
ON_MESSAGE(WM_PAINT ,  GuageWinPaint)
ON_MESSAGE(WM_DESTROY ,   GuageWinDestroy)
ON_MESSAGE(WM_CREATE,  GuageWinCreat)
ON_MESSAGE(WM_GuageUpdate, GuageWinSetPermillage)   /*设置进度条的位置(千分比)*/
ON_MESSAGE(WM_GetPercent, GuageWinGetPercent)    /*获取进度条的位置(千分比)*/
ON_MESSAGE(WM_TOUCH,  GuageWinTouch)
ON_MESSAGE(WM_SetPic,  GuageWinSetPic)
ON_MESSAGE(WM_KEY,   GuageWinKey)
END_MESSAGE_MAP()











⌨️ 快捷键说明

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