#include "mywin_inc.h" // 定义页面类型 #define WIN_TYPE_TYPE "WIN_PageStruct" WIN_PageStruct *WIN_CreatPage(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))PAGE_DefaultMsgLoop; } WIN_PageStruct *ret = mymalloc(sizeof(WIN_PageStruct)); // 调用父类的构造函数 if (ret) { mymemset(ret, 0, sizeof(WIN_PageStruct)); 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_TYPE_TYPE; ((WIN_WindowStruct *)ret)->deleteWindow = (void (*)(struct _WIN_WindowStruct *win))WIN_DeletePage; // 构造一个 ret->title = "列表"; ret->itemHeight = WIN_GetFontHight(); ret->titleHeight = WIN_GetFontHight(); ret->itemIndent = 80; } } return ret; } // 销毁页面 void WIN_DeletePage(WIN_PageStruct *page) { // 回收堆内存 if (page->item) { myfree(page->item); } // 调用父类的销毁函数 WIN_DeleteWindow((WIN_WindowStruct *)page); } // 设置页面的背景图片 void PAGE_SetBackPic(WIN_PageStruct *page, WIN_PicStruct *pic) { if (pic) { page->pic.data = pic->data; page->pic.xsize = pic->xsize; page->pic.ysize = pic->ysize; } else { page->pic.data = 0; page->pic.xsize = 0; page->pic.ysize = 0; } } // 设置列表框显示的条目 void PAGE_SetItem(WIN_PageStruct *page, const PAGE_ItemStruct *item, int itemNum) { if (page->item) { myfree(page->item); } page->itemNum = itemNum; page->item = mymalloc((sizeof(PAGE_ItemStruct *) * page->itemNum)); for (int i = 0; i < page->itemNum; i++) { page->item[i] = (PAGE_ItemStruct *)&item[i]; } } // 设置标题高度 void PAGE_SetTitleHeight(WIN_PageStruct *page, int height) { page->titleHeight = height; } // 设置条目缩进 void PAGE_SetItemIndent(WIN_PageStruct *page, int indent) { page->itemIndent = indent; } // 设置条目高度 void PAGE_SetItemHeight(WIN_PageStruct *page, int height) { page->itemHeight = height; } // 索引增加 void PAGE_IndexAdd(WIN_PageStruct *page) { page->index++; if (page->index >= page->itemNum) { page->index = 0; } } // 索引减少 void PAGE_IndexSub(WIN_PageStruct *page) { if (page->index > 0) { page->index--; } else { page->index = page->itemNum - 1; } } // 默认绘制函数 void PAGE_DefaultPaint(WIN_PageStruct *page) { // 使用双缓冲,防止闪烁 // LCD_LayerBufferOn(); int x = 0; int y = 0; int x_size = ((WIN_WindowStruct *)page)->x_size; int y_size = page->titleHeight; int one_page_num = 0; // 每页显示的条目数 int item_size = 0; // 条目的实际高度 int item_index_now; // 当前页面的索引 int page_now; // 当前页 WIN_SetLcdBkColor(0xf8f8f8); // 如果有图片就显示图片 if (page->pic.data) { WIN_FillRect(0, 0, ((WIN_WindowStruct *)page)->x_size, ((WIN_WindowStruct *)page)->y_size, page->pic.data, 0, 0, page->pic.xsize, page->pic.ysize); } else { WIN_Clear(); } // 显示标题 WIN_SetFontMode(WIN_DRAWMODE_ALONE); WIN_SetLcdColor(0); WIN_DrawTxtHCenterAt(page->title, x_size / 2, y_size / 2 - WIN_GetFontHight() / 2); // 显示选中栏 y += y_size; y_size = ((WIN_WindowStruct *)page)->y_size - y_size; one_page_num = y_size / page->itemHeight; item_size = y_size / one_page_num; item_index_now = page->index % one_page_num; WIN_SetLcdColor(0x8080a0); WIN_FillRectByColor(x, y + item_index_now * item_size, x_size, item_size); // 显示条目 page_now = page->index / one_page_num; for (int i = 0; i < one_page_num; i++) { item_index_now = page_now * one_page_num + i; int img_xsize = 0; int img_ysize = 0; if (item_index_now < page->itemNum) { // 显示图标 if (page->item[item_index_now]->image) { WIN_GetImageSize(page->item[item_index_now]->image, &img_xsize, &img_ysize); if (img_xsize > page->itemIndent) img_xsize = page->itemIndent; if (img_ysize > item_size) img_ysize = item_size; WIN_DrawImag(x + page->itemIndent / 2 - img_xsize / 2, item_size / 2 - img_ysize / 2 + y + i * item_size, img_xsize, img_ysize, page->item[item_index_now]->image); } // 显示横线和字符 WIN_SetLcdColor(0x808080); WIN_DrawHLine(x + page->itemIndent, y + i * item_size + item_size - 2, x_size - 1); WIN_SetLcdColor(0); WIN_DrawTxtAt(page->item[item_index_now]->str, x + page->itemIndent, y + i * item_size + item_size / 2 - WIN_GetFontHight() / 2); } } // LCD_LayerBuffShow(); } // 默认消息处理函数 void PAGE_DefaultMsgLoop(WIN_PageStruct *page, WIN_MsgStruct *msg) { WIN_MoveStruct *m = 0; WIN_TouchStruct *t = 0; WIN_KeyStruct *k = 0; switch (msg->msg) { case WIN_MSG_PAINT: PAGE_DefaultPaint(page); break; case WIN_MSG_KEY: k = msg->data.p; if (k->shortPress & KEY_VALUE_UP) // 短按 { PAGE_IndexSub(page); } else if (k->shortPress & KEY_VALUE_DOWN) { PAGE_IndexAdd(page); } else if (k->shortPress & KEY_VALUE_ENTER) { static char tips[20] = {0}; sprintf(tips, "内存使用:mem:%d,exmem:%d", mem_perused(), exmem_perused()); MSGBOX_Tips((WIN_WindowStruct *)page, "警告", tips, "确定"); } if (k->shortPress) { WIN_SetInvalidRect((WIN_WindowStruct *)page, 0, page->titleHeight, ((WIN_WindowStruct *)page)->x_size, ((WIN_WindowStruct *)page)->y_size - page->titleHeight); } break; case WIN_MSG_TOUCH: t = msg->data.p; if (page->touchIn) { page->touchIn = 0; // 模拟上键按下 if (t->y[0] < ((WIN_WindowStruct *)page)->y_size / 2) { PAGE_IndexSub(page); } else { PAGE_IndexAdd(page); } WIN_SetInvalidRect((WIN_WindowStruct *)page, 0, page->titleHeight, ((WIN_WindowStruct *)page)->x_size, ((WIN_WindowStruct *)page)->y_size - page->titleHeight); } break; case WIN_MSG_MOVE: m = msg->data.p; switch (m->moveType) { case MOVE_DATA_TOUCHOUT: page->touchIn = 1; // 标识触屏已经按下 break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)page, msg); break; } default: WIN_DefaultMsgLoop((WIN_WindowStruct *)page, msg); break; } }