#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->itemNumitems[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;iitemNum;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_moveindex,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->indexitemNum-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_moveindex,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;iitemNum*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); }