#include "mywin_inc.h" // 消息对话框,继承自MYWIN框架 // 定义消息对话框类型 #define WIN_MSGBOX_TYPE "WIN_MsgboxStruct" // 在堆中创建一个消息对话框, WIN_MsgboxStruct *WIN_CreatMsgbox(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))MSGBOX_defaultMsgLoop; } WIN_MsgboxStruct *ret = mymalloc(sizeof(WIN_MsgboxStruct)); // 调用父类的构造函数 if (ret) { mymemset(ret, 0, sizeof(WIN_MsgboxStruct)); 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_MSGBOX_TYPE; ((WIN_WindowStruct *)ret)->intercept = 1; // 作为子窗口,接管按键消息 ((WIN_WindowStruct *)ret)->color = 0xffffff; // 构造一个消息框 ret->key = "确定"; ret->msg = "这是默认提示消息"; ret->title = "提示"; ret->titleTxtColor = 0xc2ae9b; ret->titleRectColor = 0; ret->tipRectColor = 0x342f2a; ret->butRectColor = 0x221f18; ret->y_step = 30; } } return ret; } // 创建消息框,根据消息内容自动确定尺寸 WIN_MsgboxStruct *WIN_CreatMsgboxAuto( WIN_WindowStruct *base, void (*msgLoop)(struct _WIN_WindowStruct *win, WIN_MsgStruct *msg), char *msg) { int x, y; int txt_xsize = 0; int txt_ysize = 0; WIN_GetTxtRectSize(msg, &txt_xsize, &txt_ysize); txt_xsize += 4 + WIN_GetFontWidth(); txt_ysize += 4 + WIN_GetFontHight() * 5; if (base) { if (txt_xsize > base->x_size) txt_xsize = base->x_size; txt_ysize += (txt_xsize / base->x_size) * WIN_GetFontHight(); // 单行超过屏幕大小时,最多允许单个行超过屏幕大小 if (txt_ysize > base->y_size) txt_ysize = base->y_size; x = (base->x_size - txt_xsize) / 2; y = (base->y_size - txt_ysize) / 2; } else { if (txt_xsize > WIN_GetBaseWindow()->x_size) txt_xsize = WIN_GetBaseWindow()->x_size; txt_ysize += (txt_xsize / WIN_GetBaseWindow()->x_size) * WIN_GetFontHight(); // 单行超过屏幕大小时,最多允许单个行超过屏幕大小 if (txt_ysize > WIN_GetBaseWindow()->y_size) txt_ysize = WIN_GetBaseWindow()->y_size; x = (WIN_GetBaseWindow()->x_size - txt_xsize) / 2; y = (WIN_GetBaseWindow()->y_size - txt_ysize) / 2; } WIN_MsgboxStruct *msgbox = WIN_CreatMsgbox(base, msgLoop, x, y, txt_xsize, txt_ysize); // 设置背景 WIN_SetBackPic((WIN_WindowStruct *)msgbox); return msgbox; } // 消息对话框设置标题 void MSGBOX_SetTitle(WIN_MsgboxStruct *msgbox, char *title) { msgbox->title = title; } // 消息对话框设置内容 void MSGBOX_SetMsg(WIN_MsgboxStruct *msgbox, char *msg) { msgbox->msg = msg; } // 消息对话框设置按键 void MSGBOX_SetKey(WIN_MsgboxStruct *msgbox, char *key) { msgbox->key = key; } void MSGBOX_SetKey2(WIN_MsgboxStruct *msgbox, char *key) { msgbox->key2 = key; } // 添加条目 void MSGBOX_AddItem(WIN_MsgboxStruct *msgbox, char *item) { if (msgbox->itemNum < POPUP_ITEM_MAXNUM) { mymemcpy(msgbox->items[msgbox->itemNum], item, strlen(item) + 1); msgbox->itemNum++; } } // 消息框的绘制函数 void MSGBOX_DefaultPaint(WIN_MsgboxStruct *msgbox) { int x = 0; int y = 0; int x_size = ((WIN_WindowStruct *)msgbox)->x_size; int y_size = WIN_GetFontHight() * 2; WIN_PaintBackGround((WIN_WindowStruct *)msgbox); WIN_SetFontMode(WIN_DRAWMODE_ALONE); // 绘制标题 WIN_SetLcdColor(msgbox->titleRectColor); WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16); WIN_SetLcdColor(msgbox->titleTxtColor); WIN_DrawTxtHCenterAt(msgbox->title, x_size / 2, y + y_size / 2 - WIN_GetFontHight() / 2); // 绘制提示 y = y + y_size; y_size = ((WIN_WindowStruct *)msgbox)->y_size - y_size - WIN_GetFontHight() * 2; WIN_SetLcdColor(msgbox->tipRectColor); WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16); WIN_SetLcdColor(((WIN_WindowStruct *)msgbox)->color); // WIN_DrawTxtHCenterAt // (msgbox->msg,LCD_GetWindowSizeX()/2,y+y_size/2-WIN_GetFontHight()/2); WIN_DrawTxtCenterAtRect(msgbox->msg, x, y, x_size, y_size); // 绘制按钮 y += y_size; y_size = WIN_GetFontHight() * 2; if (msgbox->press == 1) { WIN_SetLcdColor(msgbox->tipRectColor); } else { WIN_SetLcdColor(msgbox->butRectColor); } WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16); WIN_SetLcdColor(((WIN_WindowStruct *)msgbox)->color); if ((msgbox->key) && (msgbox->key2 == 0)) { WIN_DrawTxtHCenterAt(msgbox->key, ((WIN_WindowStruct *)msgbox)->x_size / 2, y + y_size / 2 - WIN_GetFontHight() / 2); } else { WIN_DrawTxtHCenterAt(msgbox->key, ((WIN_WindowStruct *)msgbox)->x_size / 4, y + y_size / 2 - WIN_GetFontHight() / 2); WIN_DrawTxtHCenterAt(msgbox->key2, ((WIN_WindowStruct *)msgbox)->x_size * 3 / 4, y + y_size / 2 - WIN_GetFontHight() / 2); } // 绘制边框 WIN_SetLcdColor(((WIN_WindowStruct *)msgbox)->bkcolor); WIN_DrawRect(0, 0, ((WIN_WindowStruct *)msgbox)->x_size, ((WIN_WindowStruct *)msgbox)->y_size); } // 消息框选择时的绘制函数 void MSGBOX_SelectPaint(WIN_MsgboxStruct *msgbox) { int x = 0; int y = 0; int x_size = ((WIN_WindowStruct *)msgbox)->x_size; int y_size = WIN_GetFontHight() * 2; WIN_PaintBackGround((WIN_WindowStruct *)msgbox); WIN_SetFontMode(WIN_DRAWMODE_ALONE); // 绘制标题 WIN_SetLcdColor(msgbox->titleRectColor); WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16); WIN_SetLcdColor(msgbox->titleTxtColor); WIN_DrawTxtHCenterAt(msgbox->title, x_size / 2, y + y_size / 2 - WIN_GetFontHight() / 2); // 绘制提示 y = y + y_size; y_size = ((WIN_WindowStruct *)msgbox)->y_size - y_size - WIN_GetFontHight() * 2; // 绘制半透明背景 WIN_SetLcdColor(msgbox->tipRectColor); WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16); // 绘制选中框 WIN_SetLcdColor(0xa100a1); WIN_FillRectByColorAlpha(x, y + msgbox->index * msgbox->y_step, x_size, msgbox->y_step, 16); // 绘制字体 WIN_SetLcdColor(((WIN_WindowStruct *)msgbox)->color); for (int i = 0; i < msgbox->itemNum; i++) { WIN_DrawTxtHCenterAt(msgbox->items[i], x + x_size / 2, y + i * msgbox->y_step + msgbox->y_step / 2 - WIN_GetFontHight() / 2); } // 绘制按钮 y += y_size; y_size = WIN_GetFontHight() * 2; if (msgbox->press == 1) { WIN_SetLcdColor(msgbox->tipRectColor); } else { WIN_SetLcdColor(msgbox->butRectColor); } WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16); WIN_SetLcdColor(((WIN_WindowStruct *)msgbox)->color); if ((msgbox->key) && (msgbox->key2 == 0)) { WIN_DrawTxtHCenterAt(msgbox->key, ((WIN_WindowStruct *)msgbox)->x_size / 2, y + y_size / 2 - WIN_GetFontHight() / 2); } else { WIN_DrawTxtHCenterAt(msgbox->key, ((WIN_WindowStruct *)msgbox)->x_size / 4, y + y_size / 2 - WIN_GetFontHight() / 2); WIN_DrawTxtHCenterAt(msgbox->key2, ((WIN_WindowStruct *)msgbox)->x_size * 3 / 4, y + y_size / 2 - WIN_GetFontHight() / 2); } // 绘制边框 WIN_SetLcdColor(((WIN_WindowStruct *)msgbox)->bkcolor); WIN_DrawRect(0, 0, ((WIN_WindowStruct *)msgbox)->x_size, ((WIN_WindowStruct *)msgbox)->y_size); } // 消息框的消息处理函数 void MSGBOX_defaultMsgLoop(WIN_MsgboxStruct *msgbox, WIN_MsgStruct *msg) { WIN_MoveStruct *m = 0; WIN_KeyStruct *k = 0; switch (msg->msg) { case WIN_MSG_PAINT: MSGBOX_DefaultPaint(msgbox); break; case WIN_MSG_INIT: break; case WIN_MSG_KEY: k = msg->data.p; // 收到确定或返回键 if ((k->shortPress & KEY_VALUE_ENTER) || (k->shortPress & KEY_VALUE_HOME)) { if (k->shortPress & KEY_VALUE_ENTER) { WIN_SetBlockWinReturn(0, 0, 0); } else if (k->shortPress & KEY_VALUE_HOME) { WIN_SetBlockWinReturn(1, 0, 0); } ((WIN_WindowStruct *)msgbox)->deleteWindow((WIN_WindowStruct *)msgbox); } else if ((k->firstPress & KEY_VALUE_ENTER) || (k->firstPress & KEY_VALUE_HOME)) { msgbox->press = 1; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); } else if ((k->unPress & KEY_VALUE_ENTER) || (k->unPress & KEY_VALUE_HOME)) { msgbox->press = 0; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); } break; case WIN_MSG_TOUCH: break; case WIN_MSG_CHID: break; case WIN_MSG_DELETE: break; case WIN_MSG_TIMER: // 定时器时间到 ((WIN_WindowStruct *)msgbox)->deleteWindow((WIN_WindowStruct *)msgbox); break; case WIN_MSG_MOVE: m = msg->data.p; switch (m->moveType) { case MOVE_DATA_MOVEIN: break; case MOVE_DATA_MOVED: break; case MOVE_DATA_LONG: break; case MOVE_DATA_MOVEOUT: case MOVE_DATA_OUTSIDE: msgbox->press = 0; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); break; case MOVE_DATA_TOUCHOUT: if (msgbox->press) { int x_size = ((WIN_WindowStruct *)msgbox)->x_size; if (m->x_move < x_size / 2) { // 返回确定 WIN_SetBlockWinReturn(msgbox->index, 0, 0); } else { // 返回取消 WIN_SetBlockWinReturn(-1, 0, 0); } ((WIN_WindowStruct *)msgbox)->deleteWindow((WIN_WindowStruct *)msgbox); } break; case MOVE_DATA_TOUCHIN: msgbox->press = 1; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)msgbox, msg); break; } break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)msgbox, msg); break; } } // 消息框选择时的消息处理函数 void MSGBOX_SelectMsgLoop(WIN_MsgboxStruct *msgbox, WIN_MsgStruct *msg) { WIN_MoveStruct *m = 0; WIN_KeyStruct *k = 0; switch (msg->msg) { case WIN_MSG_PAINT: MSGBOX_SelectPaint(msgbox); break; case WIN_MSG_INIT: break; case WIN_MSG_KEY: k = msg->data.p; // 选择条目 if (k->shortPress & KEY_VALUE_DOWN) { if (msgbox->index < msgbox->itemNum - 1) msgbox->index++; else msgbox->index = 0; WIN_SetInvalid((WIN_WindowStruct *)msgbox); } else if (k->shortPress & KEY_VALUE_UP) { if (msgbox->index > 0) msgbox->index--; else msgbox->index = msgbox->itemNum - 1; WIN_SetInvalid((WIN_WindowStruct *)msgbox); } // 收到确定或返回键 else if ((k->shortPress & KEY_VALUE_ENTER) || (k->shortPress & KEY_VALUE_HOME)) { if (k->shortPress & KEY_VALUE_ENTER) { WIN_SetBlockWinReturn(msgbox->index, 0, 0); } else if (k->shortPress & KEY_VALUE_HOME) { WIN_SetBlockWinReturn(-1, 0, 0); } ((WIN_WindowStruct *)msgbox)->deleteWindow((WIN_WindowStruct *)msgbox); } else if ((k->firstPress & KEY_VALUE_ENTER) || (k->firstPress & KEY_VALUE_HOME)) { msgbox->press = 1; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); } else if ((k->unPress & KEY_VALUE_ENTER) || (k->unPress & KEY_VALUE_HOME)) { msgbox->press = 0; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); } break; case WIN_MSG_TOUCH: break; case WIN_MSG_CHID: break; case WIN_MSG_DELETE: break; case WIN_MSG_TIMER: // 定时器时间到 ((WIN_WindowStruct *)msgbox)->deleteWindow((WIN_WindowStruct *)msgbox); break; case WIN_MSG_MOVE: m = msg->data.p; switch (m->moveType) { case MOVE_DATA_MOVEIN: break; case MOVE_DATA_MOVED: break; case MOVE_DATA_LONG: break; case MOVE_DATA_MOVEOUT: case MOVE_DATA_OUTSIDE: msgbox->press = 0; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); break; case MOVE_DATA_TOUCHOUT: if (msgbox->press) { int y_start = WIN_GetFontHight() * 2; int y_end = ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2; if (m->y_move > y_end) { int x_size = ((WIN_WindowStruct *)msgbox)->x_size; if (m->x_move < x_size / 2) { // 返回确定 WIN_SetBlockWinReturn(msgbox->index, 0, 0); } else { // 返回取消 WIN_SetBlockWinReturn(-1, 0, 0); } ((WIN_WindowStruct *)msgbox) ->deleteWindow((WIN_WindowStruct *)msgbox); } else if (m->y_move > y_start) { msgbox->index = (m->y_move - y_start) / msgbox->y_step; WIN_SetInvalid((WIN_WindowStruct *)msgbox); } } break; case MOVE_DATA_TOUCHIN: msgbox->press = 1; WIN_SetInvalidRect( (WIN_WindowStruct *)msgbox, 0, ((WIN_WindowStruct *)msgbox)->y_size - WIN_GetFontHight() * 2, ((WIN_WindowStruct *)msgbox)->x_size, WIN_GetFontHight() * 2); break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)msgbox, msg); break; } break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)msgbox, msg); break; } } // 弹出提示框 int MSGBOX_Tips(WIN_WindowStruct *base, char *title, char *msg, char *key) { WIN_MsgboxStruct *msgbox = WIN_CreatMsgboxAuto(base, 0, msg); if (title) MSGBOX_SetTitle(msgbox, title); if (msg) MSGBOX_SetMsg(msgbox, msg); if (key) MSGBOX_SetKey(msgbox, key); WIN_ShowWindow((WIN_WindowStruct *)msgbox); return WIN_RunBlock((WIN_WindowStruct *)msgbox); } // 弹出询问框,按键确定返回0,取消返回1 int MSGBOX_Inquiry(WIN_WindowStruct *base, char *title, char *msg, char *key, char *key2) { WIN_MsgboxStruct *msgbox = WIN_CreatMsgboxAuto(base, 0, msg); if (title) MSGBOX_SetTitle(msgbox, title); if (msg) MSGBOX_SetMsg(msgbox, msg); if (key) MSGBOX_SetKey(msgbox, key); if (key2) MSGBOX_SetKey2(msgbox, key2); WIN_ShowWindow((WIN_WindowStruct *)msgbox); return WIN_RunBlock((WIN_WindowStruct *)msgbox); } // 弹出提示框,在一段时间后自动退出 int MSGBOX_TipsTime(WIN_WindowStruct *base, char *title, char *msg, char *key, u32 ms) { WIN_MsgboxStruct *msgbox = WIN_CreatMsgboxAuto(base, 0, msg); if (title) MSGBOX_SetTitle(msgbox, title); if (msg) MSGBOX_SetMsg(msgbox, msg); if (key) MSGBOX_SetKey(msgbox, key); WIN_CreatTimer((WIN_WindowStruct *)msgbox, ms); WIN_ShowWindow((WIN_WindowStruct *)msgbox); return WIN_RunBlock((WIN_WindowStruct *)msgbox); } // 弹出选择框,按键确定返回序号,取消返回-1 int MSGBOX_Select(WIN_WindowStruct *base, char *title, char **item, int itemNum, char *key, char *key2) { int x, y, x_size, y_size; int txt_lenMax = 0; WIN_MsgboxStruct *msgbox = WIN_CreatMsgbox(base, (void (*)(struct _WIN_WindowStruct *win, WIN_MsgStruct *msg))MSGBOX_SelectMsgLoop, x, y, x_size, y_size); if (title) MSGBOX_SetTitle(msgbox, title); if (key) MSGBOX_SetKey(msgbox, key); if (key2) MSGBOX_SetKey2(msgbox, key2); // 添加条目,同时记录最大长度 for (int i = 0; i < itemNum; i++) { int len = strlen(item[i]); MSGBOX_AddItem(msgbox, item[i]); if (txt_lenMax < len) txt_lenMax = len; } // 计算窗口尺寸 x_size = txt_lenMax * WIN_GetFontWidth() / 2 + 4 + WIN_GetFontWidth(); y_size = msgbox->itemNum * msgbox->y_step + WIN_GetFontHight() * 4; // 调整显示位置在正中间 if (base) { if (x_size > base->x_size) x_size = base->x_size; y_size += (x_size / base->x_size) * WIN_GetFontHight(); // 单行超过屏幕大小时,最多允许单个行超过屏幕大小 if (y_size > base->y_size) y_size = base->y_size; x = (base->x_size - x_size) / 2; y = (base->y_size - y_size) / 2; } else { if (x_size > WIN_GetBaseWindow()->x_size) x_size = WIN_GetBaseWindow()->x_size; y_size += (x_size / WIN_GetBaseWindow()->x_size) * WIN_GetFontHight(); // 单行超过屏幕大小时,最多允许单个行超过屏幕大小 if (y_size > WIN_GetBaseWindow()->y_size) y_size = WIN_GetBaseWindow()->y_size; x = (WIN_GetBaseWindow()->x_size - x_size) / 2; y = (WIN_GetBaseWindow()->y_size - y_size) / 2; } ((WIN_WindowStruct *)msgbox)->x = x; ((WIN_WindowStruct *)msgbox)->y = y; ((WIN_WindowStruct *)msgbox)->x_size = x_size; ((WIN_WindowStruct *)msgbox)->y_size = y_size; // 设置背景 WIN_SetBackPic((WIN_WindowStruct *)msgbox); WIN_ShowWindow((WIN_WindowStruct *)msgbox); return WIN_RunBlock((WIN_WindowStruct *)msgbox); }