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

180 lines
5.4 KiB
C

#include "mywin_inc.h"
// 弹出式菜单
// 定义弹出式菜单类型
#define WIN_POPUP_TYPE "WIN_PopupStruct"
WIN_PopupStruct *WIN_CreatPopup(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))POPUP_DefaultMsgLoop;
}
WIN_PopupStruct *ret = mymalloc(sizeof(WIN_PopupStruct));
// 调用父类的构造函数
if (ret) {
mymemset(ret, 0, sizeof(WIN_PopupStruct));
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_POPUP_TYPE;
((WIN_WindowStruct *)ret)->bkcolor = 0x342f2a;
((WIN_WindowStruct *)ret)->color = 0xc2ae9b;
((WIN_WindowStruct *)ret)->intercept = 1; // 作为子窗口,接管按键消息
ret->y_step = 30;
}
}
return ret;
}
// 添加条目
void POPUP_AddItem(WIN_PopupStruct *popup, char *item) {
if (popup->itemNum < POPUP_ITEM_MAXNUM) {
mymemcpy(popup->items[popup->itemNum], item, strlen(item) + 1);
popup->itemNum++;
}
}
// 默认绘制函数
void POPUP_DefaultPaint(WIN_PopupStruct *popup) {
int x = 0;
int y = 0;
int x_size = ((WIN_WindowStruct *)popup)->x_size;
int y_size = ((WIN_WindowStruct *)popup)->y_size;
char txt_buff[20] = {0};
WIN_PaintBackGround((WIN_WindowStruct *)popup);
// 绘制半透明背景
WIN_SetLcdColor(0x342f2a);
WIN_FillRectByColorAlpha(x, y, x_size, y_size, 16);
// 显示选择框
x += 2;
y += 2;
x_size -= 4;
y_size -= 4;
int step = WIN_GetFontHight();
if (step < popup->y_step)
step = popup->y_step;
WIN_SetLcdColor(0xa100a1);
WIN_FillRectByColorAlpha(x, y + step * popup->index, x_size, step, 16);
// 显示条目
WIN_SetFontMode(WIN_DRAWMODE_ALONE);
WIN_SetLcdColor(((WIN_WindowStruct *)popup)->color);
for (int i = 0; i < popup->itemNum; i++) {
WIN_DrawTxtCenterAtRect(popup->items[i], x, y + i * step, x_size, step);
}
// 绘制边框
WIN_SetLcdColor(0);
WIN_DrawRect(0, 0, ((WIN_WindowStruct *)popup)->x_size,
((WIN_WindowStruct *)popup)->y_size);
}
// 默认消息处理函数
void POPUP_DefaultMsgLoop(WIN_PopupStruct *popup, WIN_MsgStruct *msg) {
WIN_MoveStruct *m = 0;
WIN_KeyStruct *k = 0;
switch (msg->msg) {
case WIN_MSG_PAINT:
POPUP_DefaultPaint(popup);
break;
case WIN_MSG_KEY:
k = msg->data.p;
if (k->shortPress & KEY_VALUE_DOWN) {
if (popup->index < popup->itemNum - 1)
popup->index++;
else
popup->index = 0;
WIN_SetInvalid((WIN_WindowStruct *)popup);
} else if (k->shortPress & KEY_VALUE_UP) {
if (popup->index > 0)
popup->index--;
else
popup->index = popup->itemNum - 1;
WIN_SetInvalid((WIN_WindowStruct *)popup);
} else if (k->shortPress & KEY_VALUE_ENTER) {
// 确定,返回所选项目索引
WIN_SetBlockWinReturn(popup->index, 0, 0);
((WIN_WindowStruct *)popup)->deleteWindow((WIN_WindowStruct *)popup);
} else if (k->shortPress & KEY_VALUE_HOME) {
// 返回,什么也没选
WIN_SetBlockWinReturn(-1, 0, 0);
((WIN_WindowStruct *)popup)->deleteWindow((WIN_WindowStruct *)popup);
}
break;
case WIN_MSG_MOVE:
m = msg->data.p;
switch (m->moveType) {
case MOVE_DATA_SHORT:
popup->index = m->y_move / popup->y_step;
if (popup->index > popup->itemNum - 1)
popup->index = popup->itemNum - 1;
// 确定,返回所选项目索引
WIN_SetBlockWinReturn(popup->index, 0, 0);
((WIN_WindowStruct *)popup)->deleteWindow((WIN_WindowStruct *)popup);
break;
case MOVE_DATA_OUTSIDE:
// 返回,什么也没选
WIN_SetBlockWinReturn(-1, 0, 0);
((WIN_WindowStruct *)popup)->deleteWindow((WIN_WindowStruct *)popup);
break;
case MOVE_DATA_TOUCHIN:
popup->index = m->y_move / popup->y_step;
if (popup->index > popup->itemNum - 1)
popup->index = popup->itemNum - 1;
WIN_SetInvalid((WIN_WindowStruct *)popup);
default:
break;
}
break;
default:
WIN_DefaultMsgLoop((WIN_WindowStruct *)popup, msg);
break;
}
}
// 在指定位置弹出菜单
int POPUP_SelectItem(WIN_WindowStruct *base, char **item, int itemNum, int x,
int y) {
int x_size = 0;
int y_size = itemNum * WIN_GetFontHight() + 4;
WIN_PopupStruct *popup = WIN_CreatPopup(base, 0, x, y, x_size, y_size);
if (y_size < itemNum * popup->y_step + 4)
y_size = itemNum * popup->y_step + 4;
for (int i = 0; i < itemNum; i++) {
int len = strlen(item[i]);
POPUP_AddItem(popup, item[i]);
if (x_size < len)
x_size = len;
}
x_size = (x_size + 1) * WIN_GetFontWidth() / 2 + 4;
if (x + x_size > base->x_size)
x -= x + x_size - base->x_size;
if (y + y_size > base->y_size)
y -= y + y_size - base->y_size;
((WIN_WindowStruct *)popup)->x = x;
((WIN_WindowStruct *)popup)->y = y;
((WIN_WindowStruct *)popup)->x_size = x_size;
((WIN_WindowStruct *)popup)->y_size = y_size;
popup->y_step = y_size / itemNum;
// 设置弹出框的背景
WIN_SetBackPic((WIN_WindowStruct *)popup);
WIN_ShowWindow((WIN_WindowStruct *)popup);
return WIN_RunBlock((WIN_WindowStruct *)popup);
}