📄 uianiw.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 + -