#include "mywin_inc.h" //定义按钮类型 #define WIN_BUTTON_TYPE "WIN_ButtonStruct" //在堆中创建一个按钮 WIN_ButtonStruct *WIN_CreatButton (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))BUTTON_DefaultMsgLoop; } WIN_ButtonStruct *ret=mymalloc (sizeof ( WIN_ButtonStruct)); //调用父类的构造函数 if (ret) { mymemset (ret,0,sizeof ( WIN_ButtonStruct)); 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_BUTTON_TYPE; ((WIN_WindowStruct *)ret)->keyChid=1;//作为子窗口被创建 //构造一个 } } return ret; } //设置按键的字符 void BUTTON_SetKeyString (WIN_ButtonStruct *button,char *key) { button->key=key; } //默认绘制函数 void BUTTON_DefaultPaint (WIN_ButtonStruct *button) { int x_size=((WIN_WindowStruct *)button)->x_size; int y_size=((WIN_WindowStruct *)button)->y_size; WIN_PaintBackGround((WIN_WindowStruct *)button); if (button->press) { WIN_SetLcdBkColor (0x80808080); } else { WIN_SetLcdBkColor (0xffffffff); } // WIN_Clear(); if (button->press) WIN_SetLcdColor (~0xff00ff); else WIN_SetLcdColor (0xff00ff); if (y_size>WIN_GetFontHight()) { WIN_DrawTxtHCenterAt(button->key,x_size/2,y_size/2-WIN_GetFontHight()/2); } else { WIN_DrawTxtHCenterAt(button->key,x_size/2,0); } WIN_SetLcdColor(0xff0000); WIN_DrawHLine(0,y_size-2,x_size-1); } //默认消息处理函数 void BUTTON_DefaultMsgLoop (WIN_ButtonStruct *button,WIN_MsgStruct *msg) { WIN_MoveStruct *m=0; switch (msg->msg) { case WIN_MSG_PAINT: BUTTON_DefaultPaint(button); break; case WIN_MSG_INIT: WIN_SetBackPic((WIN_WindowStruct *)button); break; case WIN_MSG_KEY: break; case WIN_MSG_TOUCH: break; case WIN_MSG_CHID: break; case WIN_MSG_DELETE: 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: button->press=0; WIN_SetInvalid ((WIN_WindowStruct *)button); break; case MOVE_DATA_TOUCHOUT: if (button->press) WIN_SendMsgToPrent((WIN_WindowStruct *)button,CHID_USER,BUTTON_PRESSED); button->press=0; WIN_SetInvalid ((WIN_WindowStruct *)button); break; case MOVE_DATA_TOUCHIN: button->press=1; WIN_SetInvalid ((WIN_WindowStruct *)button); break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)button,msg); break; } break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)button,msg); break; } }