Files
player/Project/Src/MyWin/MyWinCore/mywin.c

747 lines
20 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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
2025-06-27 00:32:57 +08:00
#define WIN_WINDOW_TYPE "WIN_WindowStruct"
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static WIN_Struct g_win_struct = {0};
int WIN_Init(void) {
// <20><><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><CABC>
WIN_InitCfg();
// <20><>Ļ<EFBFBD><C4BB>ʼ<EFBFBD><CABC>
WIN_GetWinStruct()->lcd->Init();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>
WIN_GetWinStruct()->baseWin.x = 0;
WIN_GetWinStruct()->baseWin.y = 0;
WIN_GetWinStruct()->baseWin.x_size = WIN_GetWinStruct()->lcd->getLcdSizeX();
WIN_GetWinStruct()->baseWin.y_size = WIN_GetWinStruct()->lcd->getLcdSizeY();
WIN_GetWinStruct()->baseWin.baseWin = 0;
WIN_GetWinStruct()->baseWin.chidWinMaxSize = WIN_CHIDWIN_MAXNUM;
WIN_GetWinStruct()->baseWin.id = WIN_GetWinStruct()->winId++;
WIN_GetWinStruct()->baseWin.winType = WIN_WINDOW_TYPE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 color = WIN_GetWinStruct()->lcd->getLcdBkColor();
WIN_GetWinStruct()->baseWin.color = COLOR565TO888(color);
color = WIN_GetWinStruct()->lcd->getLcdBkColor();
WIN_GetWinStruct()->baseWin.bkcolor = COLOR565TO888(color);
WIN_GetWinStruct()->baseWin.msgLoop = WIN_DefaultMsgLoop;
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
QUEUE_Init(&WIN_GetWinStruct()->baseWin.winMsgQueue, sizeof(WIN_MsgStruct),
50);
WIN_MsgStruct msg = {0};
msg.msg = WIN_MSG_INIT;
WIN_SendMsg(0, &WIN_GetWinStruct()->baseWin, &msg);
// <20><><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
QUEUE_Init(&WIN_GetWinStruct()->touchQueue, sizeof(WIN_TouchStruct), 50);
QUEUE_Init(&WIN_GetWinStruct()->keyQueue, sizeof(WIN_KeyStruct), 50);
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WIN_ShowWindow(&WIN_GetWinStruct()->baseWin);
return 0;
}
// <20><><EFBFBD>ش<EFBFBD><D8B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WIN_Struct *WIN_GetWinStruct(void) { return &g_win_struct; }
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
void *WIN_SetRunCallBack(void (*callback)(void)) {
void *ret = g_win_struct.runCallBack;
if (callback)
g_win_struct.runCallBack = callback;
return ret;
}
// <20><>ȡ<EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>е<EFBFBD><D0B5><EFBFBD>,
// <20><>ȡ֮<C8A1><D6AE>Ҫ<EFBFBD>ͷ<EFBFBD>g_win_struct.ExtData ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
void *WIN_GetExtData(u32 *datasize) {
WIN_IRQ_DISABLE();
void *ret = g_win_struct.ExtData;
*datasize = g_win_struct.ExtDataSize;
g_win_struct.ExtData = 0;
g_win_struct.ExtDataSize = 0;
WIN_IRQ_ENABLE();
return ret;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻߳<DFB3><CCBB>ж<EFBFBD><D0B6>е<EFBFBD><D0B5><EFBFBD>
int WIN_PlaceExtData(void *data, u32 size) {
int ret = -1;
void *buff = mymalloc(size);
mymemcpy(buff, data, size);
WIN_IRQ_DISABLE();
if (g_win_struct.ExtData == 0) {
g_win_struct.ExtData = buff;
g_win_struct.ExtDataSize = size;
ret = 0;
} else {
ret = -1;
myfree(buff);
}
WIN_IRQ_ENABLE();
return ret;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĺ<D0B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>߳<EFBFBD>֮<EFBFBD><D6AE>֪ͨ<CDA8><D6AA><EFBFBD>ڵ<EFBFBD><DAB5>ú<EFBFBD><C3BA><EFBFBD>
int WIN_RunInWindow(const char *title, void (*fun)(void *ptr), void *ptr) {
int ret = -1;
WIN_IRQ_DISABLE();
WIN_WindowStruct *win = WIN_GetWinByTitle(0, (char *)title);
if (win) {
WIN_MsgStruct msg = {0};
msg.msg = WIN_MSG_RUN;
msg.data.p = fun;
msg.data2.p = ptr;
ret = WIN_SendMsg(0, win, &msg);
}
WIN_IRQ_ENABLE();
return ret;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD> ,<2C><><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_RunMsgFunction(WIN_MsgStruct *msg) {
int ret = -1;
if (msg->msg == WIN_MSG_RUN) {
if (msg->data.p) {
((void (*)(void *t))msg->data.p)(msg->data2.p);
ret = 0;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>ڶ<EFBFBD><DAB6>д<EFBFBD><D0B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ش<EFBFBD><D8B4>ڵ<EFBFBD>ָ<EFBFBD><D6B8>
2025-06-27 00:32:57 +08:00
WIN_WindowStruct *WIN_CreatWindow(WIN_WindowStruct *base,
2025-07-06 18:46:13 +08:00
void (*msgLoop)(struct _WIN_WindowStruct *win,
WIN_MsgStruct *msg),
int x, int y, int x_size, int y_size) {
if (base == 0)
base = WIN_GetBaseWindow(); // û<>и<EFBFBD><D0B8><EFBFBD><EFBFBD>ڣ<EFBFBD>Ĭ<EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>
WIN_WindowStruct *ret = mymalloc(sizeof(WIN_WindowStruct));
mymemset(ret, 0, sizeof(WIN_WindowStruct));
u16 color = WIN_GetWinStruct()->lcd->getLcdBkColor();
ret->bkcolor = COLOR565TO888(color);
color = WIN_GetWinStruct()->lcd->getLcdColor();
ret->color = COLOR565TO888(color);
ret->chidWinMaxSize = WIN_CHIDWIN_MAXNUM;
ret->x = x;
ret->y = y;
ret->x_size = x_size;
ret->y_size = y_size;
ret->id = WIN_GetWinStruct()->winId++; // <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>ΨһID
ret->winType = WIN_WINDOW_TYPE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ret->baseWin = base; // ע<><EFBFBD><E1B8B8><EFBFBD><EFBFBD>
if (msgLoop)
ret->msgLoop = msgLoop; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
ret->msgLoop = WIN_DefaultMsgLoop; // <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ret->deleteWindow = WIN_DeleteWindow; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD>
if (WIN_AddToChidList(base, ret) == 0) {
QUEUE_Init(&ret->winMsgQueue, sizeof(WIN_MsgStruct), 50);
WIN_MsgStruct msg = {0};
msg.msg = WIN_MSG_INIT;
WIN_SendMsg(0, ret, &msg);
return ret;
} else {
myfree(ret);
return 0;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>,<2C><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
int WIN_CreatWindowExt(WIN_WindowStruct *win, WIN_WindowStruct *base,
void (*msgLoop)(struct _WIN_WindowStruct *win,
WIN_MsgStruct *msg),
int x, int y, int x_size, int y_size) {
if (base == 0)
base = WIN_GetBaseWindow(); // û<>и<EFBFBD><D0B8><EFBFBD><EFBFBD>ڣ<EFBFBD>Ĭ<EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>
mymemset(win, 0, sizeof(WIN_WindowStruct));
u16 color = WIN_GetWinStruct()->lcd->getLcdBkColor();
win->bkcolor = COLOR565TO888(color);
color = WIN_GetWinStruct()->lcd->getLcdColor();
win->color = COLOR565TO888(color);
win->chidWinMaxSize = WIN_CHIDWIN_MAXNUM;
win->x = x;
win->y = y;
win->x_size = x_size;
win->y_size = y_size;
win->id = WIN_GetWinStruct()->winId++; // <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>ΨһID
win->winType = WIN_WINDOW_TYPE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
win->baseWin = base; // ע<><EFBFBD><E1B8B8><EFBFBD><EFBFBD>
if (msgLoop)
win->msgLoop = msgLoop; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
win->msgLoop = WIN_DefaultMsgLoop; // <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
win->deleteWindow = WIN_DeleteWindow; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD>
if (WIN_AddToChidList(base, win) == 0) {
QUEUE_Init(&win->winMsgQueue, sizeof(WIN_MsgStruct), 50);
WIN_MsgStruct msg = {0};
msg.msg = WIN_MSG_INIT;
WIN_SendMsg(0, win, &msg);
return 1;
} else {
return 0;
}
}
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
void WIN_DeleteWindow(WIN_WindowStruct *win) {
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD>
while (win->chidWinNum) {
2025-10-12 16:47:31 +08:00
(win->chid)->deleteWindow(win->chid);
2025-07-06 18:46:13 +08:00
}
// <20>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE>
WIN_DelFromChidList(win->baseWin, win);
WIN_MsgStruct msg = {0};
// <20><>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>
msg.msg = WIN_MSG_CHID;
msg.data.v = CHID_DELETE;
msg.data2.v = win->id;
WIN_SendMsg(win, win->baseWin, &msg);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
WIN_ClearMsgQueue(win);
// <20><><EFBFBD><EFBFBD>delete<74><65>Ϣ
msg.msg = WIN_MSG_DELETE;
WIN_SendMsg(0, win, &msg);
// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD>ô<EFBFBD><C3B4>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD><EFBFBD><EFBFBD>
WIN_Working(win);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
WIN_SetInvalidRect(win->baseWin, win->x, win->y, win->x_size, win->y_size);
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>
WIN_WinDeleteTimer(win);
// ȡ<><C8A1><EFBFBD>ö<EFBFBD>
WIN_ResetAsTopWin(win);
// <20><><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>
QUEUE_Delete(&win->winMsgQueue);
// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>
if (g_win_struct.BlockWin[0] == win) {
WIN_SetBlockWinReturn(-1, 0, 0);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־
if (win->invald) {
win->invald = 0;
g_win_struct.numOfWindowToPrint--;
}
// printf ("deleteWin:%s\r\n",win->winType);
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڴ<EFBFBD><DAB4>ڵ<EFBFBD><DAB5><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
if (win->msgLoopEnter) {
win->memFree = myfree;
} else {
myfree(win);
}
}
// <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ö<EFBFBD>,<2C><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ӳɹ<D3B3>
int WIN_SetAsTopWin(WIN_WindowStruct *win) {
int i = 0;
// for (i=0;g_win_struct.TopWin[i];i++);
i = g_win_struct.TopWinNum;
if (i < WIN_TOP_MAXNUM) {
g_win_struct.TopWin[i] = win;
g_win_struct.TopWinNum++;
return 1;
} else {
return 0;
}
}
// <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>ɹ<EFBFBD>
int WIN_ResetAsTopWin(WIN_WindowStruct *win) {
int i = 0;
for (i = 0; i < g_win_struct.TopWinNum; i++) {
if (g_win_struct.TopWin[i] == win) {
g_win_struct.TopWin[i] = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
g_win_struct.TopWinNum--;
for (; i < g_win_struct.TopWinNum; i++) {
g_win_struct.TopWin[i] = g_win_struct.TopWin[i + 1];
}
return 1;
}
}
return 0;
}
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>id<69>Ż<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
WIN_WindowStruct *WIN_GetWindowStructById(WIN_WindowStruct *win, u32 id) {
WIN_WindowStruct *ret = 0;
if (win == 0)
win = WIN_GetBaseWindow();
if (win->id == id) {
return win;
} else {
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
2025-07-06 18:46:13 +08:00
for (int i = win->chidWinNum; i > 0; i--) {
2025-10-12 16:47:31 +08:00
if (ret = WIN_GetWindowStructById(prev, id), ret) {
2025-07-06 18:46:13 +08:00
return ret;
}
2025-10-12 16:47:31 +08:00
prev = prev->prev;
2025-07-06 18:46:13 +08:00
}
}
return ret;
}
// <20><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int WIN_DelFromChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *next = win->chid;
2025-07-06 18:46:13 +08:00
for (int i = 0; i < win->chidWinNum; i++) {
2025-10-12 16:47:31 +08:00
if (next == chidWin) {
if(next != win->chid) {
next->prev->next = next->next;
} else {
win->chid = next->next;
}
if(next->next){
next->next->prev = next->prev;
}else{
win->chid->prev = next->prev;
2025-07-06 18:46:13 +08:00
}
win->chidWinNum--; // <20>Ӵ<EFBFBD><D3B4>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>һ
return 0;
}
2025-10-12 16:47:31 +08:00
next = next->next;
2025-07-06 18:46:13 +08:00
}
return -1;
}
// <20><>ָ<EFBFBD><D6B8><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
int WIN_SetChidWinTop(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
WIN_WindowStruct *t = 0;
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *next = win->chid;
2025-07-06 18:46:13 +08:00
for (int i = 0; i < win->chidWinNum; i++) {
2025-10-12 16:47:31 +08:00
if (next == chidWin) {
t = next;
if(next != win->chid) {
next->prev->next = next->next;
} else {
win->chid = next->next;
}
if(next->next){
next->next->prev = next->prev;
}else{
win->chid->prev = next->prev;
2025-07-06 18:46:13 +08:00
}
2025-10-12 16:47:31 +08:00
t->next = 0;
t->prev = win->chid->prev;
win->chid->prev->next = t;
win->chid->prev = t;
2025-07-06 18:46:13 +08:00
return 0;
}
2025-10-12 16:47:31 +08:00
next = next->next;
2025-07-06 18:46:13 +08:00
}
return -1;
}
// <20><><EFBFBD>Ӵ<EFBFBD><D3B4>ڵ<EFBFBD><DAB5>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
int WIN_AddToChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
if (win->chidWinNum < win->chidWinMaxSize) {
2025-10-12 16:47:31 +08:00
chidWin->next = 0;
if(win->chid == 0){
win->chid = chidWin;
}else{
chidWin->prev = win->chid->prev;
win->chid->prev->next = chidWin;
}
win->chid->prev = chidWin;
2025-07-06 18:46:13 +08:00
win->chidWinNum++;
return 0;
} else {
return -1;
}
}
// <20>ж<EFBFBD>Ŀ<EFBFBD><EFBFBD><EAB4B0><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڣ<EFBFBD><DAA3>Ƿ<EFBFBD><C7B7><EFBFBD>1
int WIN_CheckChidWin(WIN_WindowStruct *win, WIN_WindowStruct *chid) {
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *next = win->chid;
2025-07-06 18:46:13 +08:00
for (int i = 0; i < win->chidWinNum; i++) {
2025-10-12 16:47:31 +08:00
if (next == chid)
2025-07-06 18:46:13 +08:00
return 1;
2025-10-12 16:47:31 +08:00
next = next->next;
2025-07-06 18:46:13 +08:00
}
return 0;
}
// <20>ҵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>С
void WIN_GetWinPosOnLcd(WIN_WindowStruct *win, int *x, int *y, int *x_size,
int *y_size) {
*x = 0;
*y = 0;
*x_size = win->x_size;
*y_size = win->y_size;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB>ô<EFBFBD><C3B4>ڵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
WIN_WindowStruct *t = win;
do {
*x += t->x;
*y += t->y;
t = t->baseWin;
} while (t);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>ֵ
void WIN_SetBlockWinReturn(int ret, void *data, int datasize) {
g_win_struct.BlockWinReturn = ret;
// <20>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB6AA><EFBFBD><EFBFBD>
if (g_win_struct.BlockWinData)
myfree(g_win_struct.BlockWinData);
if (data && datasize) {
g_win_struct.BlockWinData = mymalloc(datasize);
mymemcpy(g_win_struct.BlockWinData, data, datasize);
g_win_struct.BlockWinDataSize = datasize;
} else {
g_win_struct.BlockWinData = 0;
g_win_struct.BlockWinDataSize = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>󴰿ڷ<F3B4B0BF><DAB7><EFBFBD>
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ջ<EFBFBD><D5BB>ջ
if (g_win_struct.BlockWinNum) {
g_win_struct.BlockWinNum--;
for (int i = 0; i < g_win_struct.BlockWinNum; i++) {
g_win_struct.BlockWin[i] = g_win_struct.BlockWin[i + 1];
}
g_win_struct.BlockWin[g_win_struct.BlockWinNum] = 0;
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
int WIN_GetBlockWinReturn(int *ret, void *buff, int buffsize) {
int size = buffsize;
if (size > g_win_struct.BlockWinDataSize)
size = g_win_struct.BlockWinDataSize;
*ret = g_win_struct.BlockWinReturn;
if (g_win_struct.BlockWinData) {
mymemcpy(buff, g_win_struct.BlockWinData, size);
myfree(g_win_struct.BlockWinData);
// <20><><EFBFBD><EFBFBD>free(g_win_struct.BlockWinData)֮<><D6AE><EFBFBD>ں<EFBFBD><DABA><EFBFBD>WIN_SetBlockWinReturn<72>ٴ<EFBFBD>free<65><65>bug
// 2020.8.3
g_win_struct.BlockWinData = 0;
}
return size;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
WIN_WindowStruct *WIN_GetBaseWindow(void) {
return &WIN_GetWinStruct()->baseWin;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD>
WIN_WindowStruct *WIN_GetCurrentWindow(void) {
return WIN_GetWinStruct()->winCurrent;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>˿ɿش<C9BF><D8B4><EFBFBD>
WIN_WindowStruct *WIN_FindTopWin(WIN_WindowStruct *win) {
WIN_WindowStruct *ret = 0;
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
2025-07-06 18:46:13 +08:00
if (win && (win->chidWinNum)) {
for (int i = win->chidWinNum; i > 0; i--) {
2025-10-12 16:47:31 +08:00
ret = WIN_FindTopWin(prev);
2025-07-06 18:46:13 +08:00
if (ret)
return ret;
2025-10-12 16:47:31 +08:00
prev = prev->prev;
2025-07-06 18:46:13 +08:00
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
if (win && (win->keyShield == 0) && (win->keyChid == 0))
return win;
else
return 0;
}
// <20><><EFBFBD><EFBFBD>win<69>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>1
int WIN_FindBlock(WIN_WindowStruct *win) {
RECT_Struct r1 = {0};
RECT_Struct r2 = {0};
WIN_WindowStruct *top = 0;
WIN_WindowStruct *base = win->baseWin;
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *next = win->chid;
WIN_WindowStruct *prev;
2025-07-06 18:46:13 +08:00
// <20>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1>ڵ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ں<EFBFBD><DABA><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < win->chidWinNum; i++) {
2025-10-12 16:47:31 +08:00
top = next;
2025-07-06 18:46:13 +08:00
if ((top->keyShield == 1) || (top->keyChid == 1))
continue;
r1.x = 0;
r1.y = 0;
r1.x_size = win->x_size;
r1.y_size = win->y_size;
r2.x = top->x;
r2.y = top->y;
r2.x_size = top->x_size;
r2.y_size = top->y_size;
if (POS_RectIntersection(&r1, &r1, &r2)) {
return 1;
}
2025-10-12 16:47:31 +08:00
next = next->next;
2025-07-06 18:46:13 +08:00
}
while (base) {
2025-10-12 16:47:31 +08:00
prev = WIN_GetLastChidWin(base);
2025-07-06 18:46:13 +08:00
for (int i = base->chidWinNum; i > 0; i--) {
2025-10-12 16:47:31 +08:00
top = prev;
2025-07-06 18:46:13 +08:00
if (top == win) {
// ֻ<>Ƚ<EFBFBD><C8BD>ڴ˴<DAB4><CBB4><EFBFBD>֮ǰ<D6AE>Ĵ<EFBFBD><C4B4><EFBFBD>
// <20><>û<EFBFBD>б<EFBFBD><D0B1>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><E4B8B8><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڵ<EFBFBD>
win = base;
break;
}
WIN_GetWinPosOnLcd(top, &r1.x, &r1.y, &r1.x_size, &r1.y_size);
WIN_GetWinPosOnLcd(win, &r2.x, &r2.y, &r2.x_size, &r2.y_size);
if (POS_RectIntersection(&r1, &r1, &r2)) {
return 1;
}
2025-10-12 16:47:31 +08:00
prev = prev->prev;
2025-07-06 18:46:13 +08:00
}
base = base->baseWin;
}
return 0;
}
// <20><><EFBFBD>κͽӴ<CDBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڵİ<DAB5><C4B0><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Ϣ
int WIN_SetChildWinkeyShield(WIN_WindowStruct *win, int power) {
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
2025-07-06 18:46:13 +08:00
for (int i = win->chidWinNum - 1; i >= 0; i--) {
2025-10-12 16:47:31 +08:00
prev->keyShield = power;
prev = prev->prev;
2025-07-06 18:46:13 +08:00
}
return 1;
}
// ͨ<><CDA8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>˿ɿصĴ<D8B5><C4B4><EFBFBD><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>0
WIN_WindowStruct *WIN_FindTopWinByPos(WIN_WindowStruct *win, int x, int y) {
WIN_WindowStruct *ret = win;
int win_x_s = 0;
int win_y_s = 0;
int x_size = win->x_size;
int y_size = win->y_size;
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
2025-07-06 18:46:13 +08:00
WIN_GetWinPosOnLcd(win, &win_x_s, &win_y_s, &x_size, &y_size);
WIN_WindowStruct *t = 0;
if (((x >= win_x_s) && (x < win_x_s + x_size)) &&
((y >= win_y_s) && (y < win_y_s + y_size)) && (win->keyShield == 0)) {
// <20>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ң<EFBFBD><D2A3><EFBFBD>ΪԽ<CEAA><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Խǰ<D4BD><C7B0>
for (int i = win->chidWinNum - 1; i >= 0; i--) {
2025-10-12 16:47:31 +08:00
t = WIN_FindTopWinByPos(prev, x, y);
2025-07-06 18:46:13 +08:00
if (t) {
ret = t; // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
break;
}
2025-10-12 16:47:31 +08:00
prev = prev->prev;
2025-07-06 18:46:13 +08:00
}
} else {
// ָ<><D6B8><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>
ret = 0;
}
return ret;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĹ<DAB5>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>û<EFBFBD>й<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>0
WIN_WindowStruct *WIN_FindPrent(WIN_WindowStruct *win1,
WIN_WindowStruct *win2) {
while ((win1) && (win2)) {
if (win1 == win2)
return win1;
win1 = win1->baseWin;
win2 = win2->baseWin;
}
return 0;
}
// <20><><EFBFBD>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1><EFBFBD>
void WIN_SetWinTitle(WIN_WindowStruct *win, char *title) {
int len = strlen(title);
if (len > WIN_WINTITLE_MAXLEN - 1) {
len = WIN_WINTITLE_MAXLEN - 1;
}
mymemcpy(win->winTitle, title, len);
win->winTitle[len] = 0;
}
// <20><><EFBFBD>ݴ<EFBFBD><DDB4>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WIN_WindowStruct *WIN_GetWinByTitle(WIN_WindowStruct *win, char *title) {
WIN_WindowStruct *ret = 0;
if (win == 0)
win = WIN_GetBaseWindow();
2025-10-12 16:47:31 +08:00
WIN_WindowStruct *next = win->chid;
2025-07-06 18:46:13 +08:00
if (strcmp(win->winTitle, title) == 0) {
ret = win;
} else {
for (int i = 0; i < win->chidWinNum; i++) {
2025-10-12 16:47:31 +08:00
if (ret = WIN_GetWinByTitle(next, title), ret)
2025-07-06 18:46:13 +08:00
break;
2025-10-12 16:47:31 +08:00
next = next->next;
2025-07-06 18:46:13 +08:00
}
}
return ret;
}
// <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<43>Ļ<C4BB><EEB6AF><EFBFBD><EFBFBD>,<2C><><EFBFBD>л<EFBFBD><D0BB>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>
void WIN_EnterPaint(WIN_WindowStruct *win) {
int x = 0;
int y = 0;
int x_size = win->x_size;
int y_size = win->y_size;
WIN_GetWinPosOnLcd(win, &x, &y, &x_size, &y_size);
WIN_GetWinStruct()->lcd->setWindow(x, y, x_size, y_size);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>˾<EFBFBD><CBBE>λᱻ<CEBB><E1B1BB><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>֮<EFBFBD><D6AE>
void WIN_SetWinInvalidRect(WIN_WindowStruct *win, RECT_Struct *r) {
if (r == 0)
r = &win->invaldRect;
RECT_Struct out = {0};
POS_RectIntersection(&out, r, &win->invaldRect);
int x = out.x;
int y = out.y;
int x_size = out.x_size;
int y_size = out.y_size;
g_win_struct.Invalid_x = x;
g_win_struct.Invalid_y = y;
g_win_struct.Invalid_x_size = x_size;
g_win_struct.Invalid_y_size = y_size;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WIN_GetWinInvalidRect(WIN_WindowStruct *win, RECT_Struct *r) {
r->x = g_win_struct.Invalid_x;
r->y = g_win_struct.Invalid_y;
r->x_size = g_win_struct.Invalid_x_size;
r->y_size = g_win_struct.Invalid_y_size;
}
// <20>ڴ<EFBFBD><DAB4>ڻ<EFBFBD><DABB><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><E8B2BB>Ҫ<EFBFBD><D2AA><EFBFBD>ƶ<EFBFBD><C6B6>˴<EFBFBD><CBB4><EFBFBD>
void WIN_TopWinPaint(WIN_WindowStruct *win) {
RECT_Struct r1 = {0};
RECT_Struct r2 = {0};
RECT_Struct rout = {0};
WIN_GetWinPosOnLcd(win, &r1.x, &r1.y, &r1.x_size, &r1.y_size);
for (int i = 0; i < g_win_struct.TopWinNum; i++) {
WIN_GetWinPosOnLcd(g_win_struct.TopWin[i], &r2.x, &r2.y, &r2.x_size,
&r2.y_size);
if (POS_RectIntersection(&rout, &r1, &r2) == 1) {
// <20><>Ҫˢ<D2AA><EFBFBD><C2B6>˴<EFBFBD><CBB4><EFBFBD>
WIN_SetInvalidRect(g_win_struct.TopWin[i], rout.x - r2.x, rout.y - r2.y,
rout.x_size, rout.y_size);
}
}
}
// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵĻ<CFB5><C4BB>ƺ<EFBFBD><C6BA><EFBFBD>
void WIN_DefaultPaint(WIN_WindowStruct *win) {
WIN_PaintBackGround(win);
// WIN_SetLcdColor (win->color);
// WIN_Clear();
// WIN_DrawHLine(0,0,LCD_GetWindowSizeX()-1);
// WIN_DrawVLine(0,0,LCD_GetWindowSizeY()-1);
// WIN_DrawHLine(0,LCD_GetWindowSizeY()-1,LCD_GetWindowSizeX()-1);
// WIN_DrawVLine(LCD_GetWindowSizeX()-1,0,LCD_GetWindowSizeY()-1);
}
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
void WIN_ShowWindow(WIN_WindowStruct *win) {
// <20>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч<EFBFBD><D0A7>
WIN_SetInvalid(win);
// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
// WIN_Working (win);
}
// <20><><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
void WIN_PaintBackGround(WIN_WindowStruct *win) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>ʾͼƬ
WIN_SetLcdBkColor(win->bkcolor);
WIN_PicStruct *pic = 0;
if (win->drawBackPic) {
win->drawBackPic();
} else if (pic = WIN_GetPicNoAlpha(win->pic_path), pic) {
WIN_DrawPic(pic, 0, 0, ((WIN_WindowStruct *)win)->x_size,
((WIN_WindowStruct *)win)->y_size);
} else if (WIN_DrawPic(&win->pic, 0, 0, ((WIN_WindowStruct *)win)->x_size,
((WIN_WindowStruct *)win)->y_size)) {
} else {
WIN_Clear();
}
}
void WIN_SetColor(WIN_WindowStruct *win, u32 color) { win->color = color; }
void WIN_SetBkColor(WIN_WindowStruct *win, u32 bkcolor) {
win->bkcolor = bkcolor;
}
// <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ͼƬ·<C6AC><C2B7>
void WIN_SetBackPicPath(WIN_WindowStruct *win, char *path) {
if (path) {
int len = strlen(path);
if (len + 1 > WIN_FILE_PATH_MAXLEN)
printf("%s:err,pic path too long\r\n", __func__);
mymemcpy(&win->pic_path, path, len + 1);
WIN_PicStruct *pic = WIN_GetPic(win->pic_path);
if (pic)
mymemcpy(&win->pic, pic, sizeof(WIN_PicStruct));
} else {
int len = strlen(path);
mymemset(&win->pic_path, 0, len + 1);
}
}
// <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ͼƬ
void WIN_SetBackPic(WIN_WindowStruct *win) {
WIN_PicStruct pic = {0};
WIN_WindowStruct *base = win->baseWin;
WIN_PicStruct *pic_base = WIN_GetPic(base->pic_path);
if (pic_base) {
int x = win->x;
int y = win->y;
if ((y < pic_base->ysize) && (x < pic_base->xsize)) {
pic.data = pic_base->data + pic_base->xsize * y + x;
pic.xsize = pic_base->xsize;
pic.ysize = pic_base->ysize - y - 1;
}
mymemcpy(&win->pic, &pic, sizeof(WIN_PicStruct));
} else {
mymemset(&win->pic, 0, sizeof(WIN_PicStruct));
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void *WIN_SetBackFun(WIN_WindowStruct *win, void (*fun)(void)) {
void *ret = win->drawBackPic;
if (fun) {
win->drawBackPic = fun;
}
return ret;
2025-06-27 00:32:57 +08:00
}