Files
player/Project/Src/MyWin/Window/mywin_page.c

243 lines
6.8 KiB
C
Raw Normal View History

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