2025-06-27 00:32:57 +08:00
|
|
|
|
#include "mywin_inc.h"
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
#define WIN_TYPE_TYPE "WIN_PageStruct"
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
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) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
|
|
|
|
|
|
if (msgLoop == 0) {
|
|
|
|
|
|
msgLoop = (void (*)(struct _WIN_WindowStruct *win,
|
|
|
|
|
|
WIN_MsgStruct *msg))PAGE_DefaultMsgLoop;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WIN_PageStruct *ret = mymalloc(sizeof(WIN_PageStruct));
|
|
|
|
|
|
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9>캯<EFBFBD><ECBAAF>
|
|
|
|
|
|
if (ret) {
|
|
|
|
|
|
mymemset(ret, 0, sizeof(WIN_PageStruct));
|
|
|
|
|
|
if (0 == WIN_CreatWindowExt((WIN_WindowStruct *)ret, base, msgLoop, x, y,
|
|
|
|
|
|
x_size, y_size)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|
|
|
|
|
myfree(ret);
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
((WIN_WindowStruct *)ret)->winType = WIN_TYPE_TYPE;
|
|
|
|
|
|
((WIN_WindowStruct *)ret)->deleteWindow =
|
|
|
|
|
|
(void (*)(struct _WIN_WindowStruct *win))WIN_DeletePage;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
|
ret->title = "<EFBFBD>б<EFBFBD>";
|
|
|
|
|
|
ret->itemHeight = WIN_GetFontHight();
|
|
|
|
|
|
ret->titleHeight = WIN_GetFontHight();
|
|
|
|
|
|
ret->itemIndent = 80;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
|
|
|
|
|
|
void WIN_DeletePage(WIN_PageStruct *page) {
|
|
|
|
|
|
// <20><><EFBFBD>ն<EFBFBD><D5B6>ڴ<EFBFBD>
|
|
|
|
|
|
if (page->item) {
|
|
|
|
|
|
myfree(page->item);
|
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD>
|
|
|
|
|
|
WIN_DeleteWindow((WIN_WindowStruct *)page);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ͼƬ
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ŀ
|
|
|
|
|
|
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];
|
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD>߶<EFBFBD>
|
|
|
|
|
|
void PAGE_SetTitleHeight(WIN_PageStruct *page, int height) {
|
|
|
|
|
|
page->titleHeight = height;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>
|
|
|
|
|
|
void PAGE_SetItemIndent(WIN_PageStruct *page, int indent) {
|
|
|
|
|
|
page->itemIndent = indent;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>߶<EFBFBD>
|
|
|
|
|
|
void PAGE_SetItemHeight(WIN_PageStruct *page, int height) {
|
|
|
|
|
|
page->itemHeight = height;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void PAGE_IndexAdd(WIN_PageStruct *page) {
|
|
|
|
|
|
page->index++;
|
|
|
|
|
|
if (page->index >= page->itemNum) {
|
|
|
|
|
|
page->index = 0;
|
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void PAGE_IndexSub(WIN_PageStruct *page) {
|
|
|
|
|
|
if (page->index > 0) {
|
|
|
|
|
|
page->index--;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
page->index = page->itemNum - 1;
|
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// Ĭ<>ϻ<EFBFBD><CFBB>ƺ<EFBFBD><C6BA><EFBFBD>
|
|
|
|
|
|
void PAGE_DefaultPaint(WIN_PageStruct *page) {
|
|
|
|
|
|
|
|
|
|
|
|
// ʹ<><CAB9>˫<EFBFBD><CBAB><EFBFBD>壬<EFBFBD><E5A3AC>ֹ<EFBFBD><D6B9>˸
|
|
|
|
|
|
// 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; // ÿҳ<C3BF><D2B3>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>
|
|
|
|
|
|
int item_size = 0; // <20><>Ŀ<EFBFBD><C4BF>ʵ<EFBFBD>ʸ߶<CAB8>
|
|
|
|
|
|
int item_index_now; // <20><>ǰҳ<C7B0><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int page_now; // <20><>ǰҳ
|
|
|
|
|
|
WIN_SetLcdBkColor(0xf8f8f8);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>ʾͼƬ
|
|
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|
|
|
|
|
WIN_SetFontMode(WIN_DRAWMODE_ALONE);
|
|
|
|
|
|
WIN_SetLcdColor(0);
|
|
|
|
|
|
WIN_DrawTxtHCenterAt(page->title, x_size / 2,
|
|
|
|
|
|
y_size / 2 - WIN_GetFontHight() / 2);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʾѡ<CABE><D1A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʾ<EFBFBD><CABE>Ŀ
|
|
|
|
|
|
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) {
|
|
|
|
|
|
// <20><>ʾͼ<CABE><CDBC>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><>ʾ<EFBFBD><CABE><EFBFBD>ߺ<EFBFBD><DFBA>ַ<EFBFBD>
|
|
|
|
|
|
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();
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// Ĭ<><C4AC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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) // <20>̰<EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
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, "<EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD>ã<EFBFBD>mem:%d,exmem:%d", mem_perused(),
|
|
|
|
|
|
exmem_perused());
|
|
|
|
|
|
MSGBOX_Tips((WIN_WindowStruct *)page, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", tips, "ȷ<EFBFBD><EFBFBD>");
|
|
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
// ģ<><C4A3><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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; // <20><>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
WIN_DefaultMsgLoop((WIN_WindowStruct *)page, msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
WIN_DefaultMsgLoop((WIN_WindowStruct *)page, msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|