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

📄 uianiw.c

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

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

Revision 1.2  2008/05/28 01:40:57  HSL
增加窗口ID的定义.

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.14  2008/01/09 07:55:50  Lingzhaojun
提交周敏心电子书仿真、自动测试修改

Revision 1.13  2007/11/28 08:45:54  Lingzhaojun
状态栏文字支持滚动显示

Revision 1.12  2007/11/23 12:11:34  Lingzhaojun
提交键盘锁代码

Revision 1.11  2007/11/23 08:48:32  Lingzhaojun
提交键盘锁代码

Revision 1.10  2007/11/23 07:32:05  Huangshilin
no message

Revision 1.9  2007/11/15 07:34:58  Lingzhaojun
提交电池充电界面

Revision 1.8  2007/11/03 04:54:45  Caifeng
增加一个消息,处理动画速度

Revision 1.7  2007/11/03 03:20:51  Lingzhaojun
为发布公版SDK做各项修改

Revision 1.6  2007/10/26 07:57:49  Zhaojun
提交主界面修整

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:26  Lingzhaojun
GUI添加自动注释

   20070807. 加入对触摸屏的支持 lzj
   20070808. 加入动画暂停和动画继续播放 lzj
*********************************************************************/


#include "uianiw.h"



/*----------------------------------------------------------------------
Name  :  AnimationWinSetPic
Desc  :  设动画窗口的图片
Params:  wParam为图片的资源ID,lParam为张数,
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinSetPic(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ANIMATION *aniwObj = win->Data;
    UINT32*pNumber = (UINT32*)lParam;


    aniwObj->IconAni.BmpID = wParam;
    aniwObj->CurrPic = 0;
    aniwObj->TotalPic = *pNumber;

    WinStopTimer(aniwObj->TimerID);
#if defined( BOARD )
    aniwObj->TimerID = WinStartTimer(win, 10 * aniwObj->TickPerFrame);
#else
    aniwObj->TimerID = WinStartTimer(win, 2 * aniwObj->TickPerFrame);
#endif
    WindowInvalidateWindow(win);

    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  AnimationWinSetTxt
Desc  :  设置动画窗口的标题文本
Params:  wParam为文本资源ID
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinSetTxt(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ANIMATION *aniwObj = win->Data;

    aniwObj->TxtID = wParam;


    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  AnimationWinSetCB
Desc  :  设置动画窗口的回调函数
Params:  wParam为文本资源ID
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinSetCB(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ANIMATION *aniwObj = win->Data;

    if (lParam)
        aniwObj->callback = (ANICB)lParam;
    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  AnimationWinPaint
Desc  :  动画窗口画屏消息
Params:  更新动画
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ANIMATION *aniwObj = win->Data;
    UHRECT Rect;
    DispMode TranspLevel = WinGetTranStyle(win->style);

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


    if (win->style&WS_Transp) //透明情况下
    {
        Rect.x = win->x;
        Rect.y = win->y;
        Rect.w = win->w;
        Rect.h = win->h;
        if (win->Parent)
            DrawBmpIdEx(win->x, win->y, win->Parent->BmpID,  &Rect, TranspLevel); //画父窗口背景
    }

    //画动画窗背景
    DrawBmpIdEx(win->x, win->y, win->BmpID,  NULL, TranspLevel);

    //画动画帧
    DrawBmpIdEx(aniwObj->IconAni.X, aniwObj->IconAni.Y, (UINT16)(aniwObj->IconAni.BmpID + aniwObj->CurrPic), NULL, TranspLevel);
    //DrawPic(aniwObj->IconAni.X,aniwObj->IconAni.Y,aniwObj->IconAni.BmpID+aniwObj->CurrPic);
    TxtBox(win, aniwObj->TxtID, Font16X16, TopStyle);

    WIN_CLEARPAIT(win);
    return TRUE;
}



/*----------------------------------------------------------------------
Name  :  AnimationWinTick
Desc  :  动画窗口定时消息,每个定时周期切换到下一帧
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinTick(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{


    W_ANIMATION *aniwObj = win->Data;

    if (aniwObj->CurrPic < aniwObj->TotalPic - 1)
    {
        aniwObj->CurrPic++;
    }
    else
    {
        if (aniwObj->style&WES_AniwOnce)
        {
            //0913,HUANGSL, 窗口关闭之后,aniwObj,win 的数据不在可用,因此需要直接返回,
            //另外,在 WindowDestroy 的时候会 WinStopTimer , 此处不需调用.
            // WinStopTimer(aniwObj->TimerID);
            WindowDestroy(win);
            return TRUE;
            //MenuWindowTest(win);
        }
        aniwObj->CurrPic = 0;
    }

    WindowInvalidateWindow(win);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  AnimationWinTouch
Desc  :  动画窗口触摸消息
Params:  若动画窗口具有WES_AniTouchPause风格,则触摸时暂停,再触摸时继续
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinTouch(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ANIMATION *aniwObj = win->Data;


    if (wParam != TM_STATE_DOWN)   //触摸键按下
    {

        if (aniwObj->style&WES_AniTouchPause)
        {
            if (aniwObj->Pause)
                IAnimationWinResume(win , 0, NULL);
            else
                IAnimationWinPause(win , 0, NULL);
        }

    }

    WinSendCommand(win, EV_TouchPress);   //向父窗口发送comman消息
    return TRUE;
}

/*----------------------------------------------------------------------
Name  :  AnimationWinSetFocus
Desc  :  动画窗口得到焦点
Params:  若窗口具有WES_AniFouceLostPause消息,则得到焦点时动画子窗口自动继续动画
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinSetFocus(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ANIMATION *aniwObj = win->Data;

    if (aniwObj->style&WES_AniFouceLostPause)
        IAnimationWinResume(win , 0, NULL);

    return TRUE;
}




/*----------------------------------------------------------------------
Name  :  AnimationWinKey
Desc  :  动画窗口得到焦点
Params:  若窗口具有WES_AniFouceLostPause消息,则得到焦点时动画子窗口自动继续动画
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ANIMATION *aniwObj = win->Data;
    UINT16  keyPress = (UINT16)((wParam) >> 16);
    UINT16  KEY_EV = (UINT16)(wParam);

    if (keyPress)
        return FALSE;

    if (win->style&WES_AnyKeyClose)
    {
        WindowDestroy(win);
        return TRUE;
    }
//   if( win->style&WS_CHILDS )
    return WMPROC_UNHANDLE;

// return TRUE;
}



/*----------------------------------------------------------------------
Name  :  AnimationWinLostFocus
Desc  :  动画窗口失去焦点
Params:  若窗口具有WES_AniFouceLostPause消息,则失去焦点时动画子窗口自动停止
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinLostFocus(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ANIMATION *aniwObj = win->Data;

    if (aniwObj->style&WES_AniFouceLostPause)
        IAnimationWinPause(win , 0, NULL);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  AnimationWinSetSpeed
Desc  :  动画窗口调节速度
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinSetSpeed(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ANIMATION *aniwObj = win->Data;

    if (wParam)
        aniwObj->TickPerFrame = (UINT16)wParam;  /*播放周期,越大越慢*/

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  AnimationWinCreat
Desc  :  创建动画窗口
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 AnimationWinCreat(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{


    W_ANIMATION *aniwObj;

    aniwObj = MallocClass(W_ANIMATION);

    if (aniwObj)
    {
        aniwObj->IconAni.BmpID = win->BmpID;  /*动画图片*/
        aniwObj->IconAni.X = win->x;  /*动画图片坐标,目前和窗口坐标一致*/
        aniwObj->IconAni.Y = win->y;
        aniwObj->TxtID = win->CaptionID; /*作为为扩展,动画窗也可支持文本*/
        aniwObj->TimerID = EmptyTimer; /*定时器ID*/
        aniwObj->TotalPic = 5;   /*动画图片帧数目*/
        aniwObj->CurrPic = 0;    /*记录当前帧*/
        aniwObj->TickPerFrame = 3;  /*播放周期,越大越慢*/
        aniwObj->style = win->style;  /*窗口风格*/
        aniwObj->Pause = 0;    /*播放状态: False:正在播放 true:暂停*/
        win->Data = aniwObj;
        aniwObj->callback = NULL;
        return TRUE;
    }
    else
        return FALSE;
}




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

    W_ANIMATION *aniwObj = win->Data;

    if (aniwObj->callback)aniwObj->callback();
    WinStopTimer(aniwObj->TimerID);
    FreeClass(win->Data);

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  IAnimationWinPause
Desc  :  暂停动画,内部使用函数,触摸屏点击时或失去焦点后,可调用此函数暂停动画
Params:  wParam为图片的资源ID,lParam为张数,
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 IAnimationWinPause(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    W_ANIMATION *aniwObj = win->Data;

    if (aniwObj->Pause == FALSE)
    {
        aniwObj->Pause = TRUE;
        WinStopTimer(aniwObj->TimerID);
        aniwObj->TimerID = NULL; //080527,HANGSL,SET TIMER = NULL.
    }

    return TRUE;
}


/*----------------------------------------------------------------------
Name  :  IAnimationWinPause
Desc  :  暂停后继续动画,内部使用函数,触摸屏点击时或获得焦点后,可调用此函数继续动画
Params:
Return:  处理结果
Author:  Lingzj
Date  :  070830
----------------------------------------------------------------------*/
UINT32 IAnimationWinResume(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    W_ANIMATION *aniwObj = win->Data;

    if (aniwObj->Pause == TRUE)
    {
        aniwObj->Pause = FALSE;
        aniwObj->TimerID = WinStartTimer(win, 10 * aniwObj->TickPerFrame);
        WindowInvalidateWindow(win);
    }

    return TRUE;
}




/*动画类基本消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinAnimationProcMap , CW_TYPE_Animation)
ON_MESSAGE(WM_PAINT ,   AnimationWinPaint)
ON_MESSAGE(WM_TIMER,   AnimationWinTick)
ON_MESSAGE(WM_DESTROY ,  AnimationWinDestroy)
ON_MESSAGE(WM_CREATE,   AnimationWinCreat)
ON_MESSAGE(WM_SetPic,   AnimationWinSetPic)
ON_MESSAGE(WM_SetTxt,   AnimationWinSetTxt)
ON_MESSAGE(WM_TOUCH ,  AnimationWinTouch)
ON_MESSAGE(WM_SETFOCUS,  AnimationWinSetFocus)
ON_MESSAGE(WM_KILLFOCUS, AnimationWinLostFocus)
ON_MESSAGE(WM_SetSpeed, AnimationWinSetSpeed)
ON_MESSAGE(WM_SetAniCallback, AnimationWinSetCB)
END_MESSAGE_MAP()




/*继承一个动画类,用于有按键的动画*/
BEGIN_APPMESSAGE_MAP(WinAniKeyProcMap , CW_TYPE_Animation)

ON_MESSAGE(WM_KEY, AnimationWinKey)

END_MESSAGE_MAP()



⌨️ 快捷键说明

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