547 lines
18 KiB
C
547 lines
18 KiB
C
#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);
|
||
}
|