#include "mywin_user_status_bar.h" #include "date.h" #include "mywin_inc.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(); } uint32_t 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; } }