243 lines
6.8 KiB
C
243 lines
6.8 KiB
C
#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;
|
||
}
|
||
}
|