#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); }