Files
player/Project/Src/MyWin/Window/mywin_msgbox.c
2025-07-06 18:46:13 +08:00

547 lines
18 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"
// 消息对话框继承自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);
}