#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->itemNumitems[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 (stepy_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;iitemNum;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->indexitemNum-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_sizey_step+4) y_size=itemNum*popup->y_step+4; for (int i=0;ibase->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); }