Files
player/Project/Src/MyWinApp/mywin_user_status_bar.c

393 lines
8.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mywin_inc.h"
#include "mywin_user_status_bar.h"
#include "date.h"
//状态栏继承自MYWIN框架
//用户界面,根据具体显示用途编写,没有通用性
#define WIN_STATUSBAR_TYPE "WIN_StatusBarStruct"
WIN_StatusBarStruct *WIN_CreatStatusBar (WIN_WindowStruct *base,
void (*msgLoop)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg),
int x,int y,int x_size,int y_size)
{
//重设消息循环
if (msgLoop==0)
{
msgLoop=(void (*)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg))STATUSBAR_DefaultMsgLoop;
}
WIN_StatusBarStruct *ret=mymalloc (sizeof ( WIN_StatusBarStruct));
//调用父类的构造函数
if (ret)
{
mymemset (ret,0,sizeof ( WIN_StatusBarStruct));
if (0==WIN_CreatWindowExt((WIN_WindowStruct *)ret,base,msgLoop,x,y,x_size,y_size))
{
//创建失败
myfree (ret);
ret=0;
}
else
{
((WIN_WindowStruct *)ret)->winType=WIN_STATUSBAR_TYPE;
//((WIN_WindowStruct *)ret)->keyShield=1;//屏蔽按键和触摸消息
//构造一个
ret->img_xsize=40;
ret->backColor=0;
ret->color=0xffffffff;
mymemcpy (ret->stat.time,"示例时间 00:00",15);
mymemcpy (ret->stat.mode,"示例模式",9);
ret->timerIdGet=WIN_CreatTimer ((WIN_WindowStruct *)ret,100);
//WIN_SetAsTopWin ((WIN_WindowStruct *)ret);//窗口置顶
ret->y_size_def=y_size;
ret->app_y_step=30;
}
}
return ret;
}
//状态信息更新
void STATUSBAR_StateUpdata (WIN_StatusBarStruct *statusbar,STATUSBAR_DataStruct *s)
{
int temp=statusbar->stat.mode_x;
//使用内存复制的方法复制结构体
mymemcpy (& statusbar->stat,s,sizeof (STATUSBAR_DataStruct));
if (strlen(statusbar->stat.mode)>8)
{
//字符串过长时使用滚动显示
if (statusbar->timerId==0)
{
statusbar->timerId=WIN_CreatTimer ((WIN_WindowStruct *)statusbar,100);
statusbar->stat.mode_x=WIN_GetFontWidth()*4/2;
}
else
{
statusbar->stat.mode_x=temp;
}
}
else
{
if (statusbar->timerId)
{
WIN_DeleteTimer(statusbar->timerId);
statusbar->timerId=0;
}
}
}
//设置资源文件
void STATUSBAR_SetRes (WIN_StatusBarStruct *statusbar,STATUSBAR_ResStruct *r)
{
//使用内存复制的方法复制结构体
mymemcpy (& statusbar->res,r,sizeof (STATUSBAR_ResStruct));
}
//设置背景图片
void STATUSBAR_SetBackPic (WIN_StatusBarStruct *statusbar,WIN_PicStruct *pic)
{
if (pic)
{
mymemcpy(&statusbar->pic,pic,sizeof(WIN_PicStruct));
}
else
{
mymemset(&statusbar->pic,0,sizeof(WIN_PicStruct));
}
}
void STATUSBAR_ScanApp(WIN_StatusBarStruct *bar)
{
for(int i=0;i<APPM_LIST_MAXLEN;i++)
{
app_struct *app=appm_get(i);
if(app)
{
bar->app_item[bar->app_num].app=app;
bar->app_num++;
}
}
}
void STATUSBAR_ClearApp(WIN_StatusBarStruct *bar)
{
bar->app_num=0;
}
//默认绘制函数
void STATUSBAR_DefaultPaint (WIN_StatusBarStruct *statusbar)
{
int x=0;
int y=0;
int x_size=((WIN_WindowStruct *)statusbar)->x_size;
// int y_size=((WIN_WindowStruct *)statusbar)->y_size;
int y_size=20;
int tag_xsize=0;//绘制目标的宽度
//显示背景
WIN_SetLcdBkColor (statusbar->backColor);
//如果有图片就显示图片
if (statusbar->pic.data)
{
WIN_FillRect (0,0,((WIN_WindowStruct *)statusbar)->x_size,((WIN_WindowStruct *)statusbar)->y_size,
statusbar->pic.data,((WIN_WindowStruct *)statusbar)->x,((WIN_WindowStruct *)statusbar)->y,statusbar->pic.xsize,statusbar->pic.ysize);
}
else
{
WIN_Clear();
}
u32 font_type =WIN_SetFontSize (16);
WIN_SetLcdColor (statusbar->color);
//显示时间
WIN_SetFontMode (WIN_DRAWMODE_ALONE);
WIN_SetLcdBkColor (statusbar->color);
if (statusbar->stat.time[0])
{
WIN_DrawTxtAt (statusbar->stat.time,x,y_size/2-WIN_GetFontHight()/2);
}
//显示模式
if (statusbar->stat.mode[0])
{
WIN_DrawTxtHCenterAt (statusbar->stat.mode,x_size/2,y_size/2-WIN_GetFontHight()/2);
}
//显示电池百分比,从右向左绘制
if (statusbar->stat.betty[0])
{
tag_xsize=strlen(statusbar->stat.betty)*WIN_GetFontWidth()/2;
WIN_DrawTxtAt (statusbar->stat.betty,x_size-tag_xsize-1,y_size/2-WIN_GetFontHight()/2);
x_size-=tag_xsize;
}
int y_step=statusbar->app_y_step;
x=15;
y=statusbar->y_size_def+10;
x_size=((WIN_WindowStruct *)statusbar)->x_size;
char txt[20]={0};
for(int i=0;i<statusbar->app_num;i++)
{
int txt_y=y+(y_step-WIN_GetFontHight())/2;
STATUSBAR_AppStruct *app_item=&statusbar->app_item[i];
RECT_Struct *rect=0;
WIN_DrawTxtAt(app_item->app->app_info->name,x,txt_y);
if(app_item->app->run_state)
WIN_DrawTxtAt("活动中",x+x_size*1/4,txt_y);
rect=&app_item->enter;
rect->x_size=x_size/4;
rect->y_size=y_step;
rect->x=x+x_size*2/4;rect->y=y;
WIN_DrawTxtAt("打开",rect->x,txt_y);
rect=&app_item->exit;
rect->x=x+x_size*3/4;rect->y=y;
rect->x_size=x_size/4;
rect->y_size=y_step;
WIN_DrawTxtAt("删除",rect->x,txt_y);
y+=y_step;
WIN_DrawHLine(10,y,x_size-1-10);
}
WIN_SetFontSize (font_type);
}
int STATUSBAR_AppButton(WIN_StatusBarStruct *bar,WIN_MoveStruct *m)
{
WIN_WindowStruct *win=(WIN_WindowStruct *)bar;
for(int i=0;i<bar->app_num;i++)
{
STATUSBAR_AppStruct *app_item=&bar->app_item[i];
RECT_Struct *rect=0;
rect=&app_item->enter;
if(POS_InRect(rect->x,rect->y,rect->x_size,rect->y_size,m->x_move,m->y_move))
{
//打开编号为i的app
WIN_SetSize (win,win->x_size,bar->y_size_def);
bar->dis=0;
app_run(app_item->app);
return 0;
}
rect=&app_item->exit;
if(POS_InRect(rect->x,rect->y,rect->x_size,rect->y_size,m->x_move,m->y_move))
{
//退出编号为i的app
if(app_exit(app_item->app) !=0)
{
MSGBOX_TipsTime ((WIN_WindowStruct *)bar,"错误","删除进程失败","确定",5*1000);
}
WIN_SetSize (win,win->x_size,bar->y_size_def);
bar->dis=0;
return 0;
}
}
return -1;
}
int STATUSBAR_TouchMove(WIN_StatusBarStruct *statusbar,WIN_MoveStruct *m)
{
WIN_WindowStruct *win=(WIN_WindowStruct *)statusbar;
int y_max=WIN_GetWinStruct()->lcd->getLcdSizeY();
switch(m->moveType)
{
case MOVE_DATA_SHORT:
STATUSBAR_AppButton(statusbar,m);
break;
case MOVE_DATA_MOVED:
if(statusbar->mov_start)
{
int y_temp=win->y_size+m->y_move;
if(y_temp<statusbar->y_size_def) y_temp=statusbar->y_size_def;
WIN_SetSize (win,win->x_size,y_temp);
}
break;
case MOVE_DATA_TOUCHIN:
if(statusbar->mov_start==0)
{
//在屏幕边缘的滑动用于改变窗口大小
//if(m->y_move<20||m->y_move>y_max-20)
{
statusbar->mov_start=1;
if (statusbar->dis==0)
{
statusbar->dis=1;
WIN_SetSize (win,win->x_size,100);
}
else
{
statusbar->dis=0;
}
}
}
break;
case MOVE_DATA_TOUCHOUT:
case MOVE_DATA_MOVEOUT:
if(statusbar->mov_start)
{
if(statusbar->dis==1)
{
if(win->y_size>200)
{
WIN_SetSize (win,win->x_size,y_max);
}
else
{
WIN_SetSize (win,win->x_size,statusbar->y_size_def);
statusbar->dis=0;
}
}
else
{
if(win->y_size<y_max-100)
{
WIN_SetSize (win,win->x_size,statusbar->y_size_def);
}
else
{
WIN_SetSize (win,win->x_size,y_max);
statusbar->dis=1;
}
}
statusbar->mov_start=0;
}
break;
}
return 0;
}
//默认消息处理函数
void STATUSBAR_DefaultMsgLoop (WIN_StatusBarStruct *statusbar,WIN_MsgStruct *msg)
{
WIN_MoveStruct *m=0;
WIN_TouchStruct *t=0;
STATUSBAR_DataStruct *s=0;
switch (msg->msg)
{
case WIN_MSG_PAINT:
STATUSBAR_DefaultPaint(statusbar);
break;
case WIN_MSG_KEY:
break;
case WIN_MSG_MOVE:
m=msg->data.p;
STATUSBAR_TouchMove(statusbar,m);
break;
case WIN_MSG_TIMER:
if (msg->data.v==statusbar->timerId)
{
}
else if (msg->data.v==statusbar->timerIdGet)
{
int Hours=0;int Minutes=0;int Seconds;
STATUSBAR_DataStruct *statu=mymalloc (sizeof (STATUSBAR_DataStruct));
mymemset (statu,0,sizeof (STATUSBAR_DataStruct));
date_rtc_get_time (&Hours,&Minutes,&Seconds);
if (statusbar->sec!=Seconds)
{
//更新状态栏
statusbar->sec=Seconds;
int a=mem_perused(),b=exmem_perused();
sprintf (statu->time,"%02d:%02d:%02d", Hours,Minutes,Seconds);
sprintf (statu->mode,"mem:%02d.%02d,exm:%02d.%02d",a/100,a%100,
b/100,b%100);
sprintf (statu->betty,"电量:100%%");
STATUSBAR_StateUpdata (statusbar,statu);
STATUSBAR_ClearApp(statusbar);
STATUSBAR_ScanApp(statusbar);
WIN_SetInvalidWhenTop ((WIN_WindowStruct *)statusbar);
}
myfree(statu);
}
break;
//状态栏接收的外部消息是为 STATUSBAR_Struct 类型的结构体
case WIN_MSG_EXTMSG:
s=msg->data.p;
STATUSBAR_StateUpdata (statusbar,s);
WIN_SetInvalid ((WIN_WindowStruct *)statusbar);
break;
default:
WIN_DefaultMsgLoop((WIN_WindowStruct *)statusbar,msg);
break;
}
}