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