窗口框架使用二叉树

This commit is contained in:
2025-10-12 16:47:31 +08:00
parent e3d28917b8
commit f6d2ef948f
3 changed files with 85 additions and 38 deletions

View File

@@ -193,12 +193,8 @@ int WIN_CreatWindowExt(WIN_WindowStruct *win, WIN_WindowStruct *base,
void WIN_DeleteWindow(WIN_WindowStruct *win) {
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD>
// for (int i=0;i<win->chidWinNum;i++)
// {
// (win->chidWin[i])->deleteWindow(win->chidWin[i]);
// }
while (win->chidWinNum) {
(win->chidWin[0])->deleteWindow(win->chidWin[0]);
(win->chid)->deleteWindow(win->chid);
}
// <20>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE>
@@ -293,10 +289,12 @@ WIN_WindowStruct *WIN_GetWindowStructById(WIN_WindowStruct *win, u32 id) {
if (win->id == id) {
return win;
} else {
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
for (int i = win->chidWinNum; i > 0; i--) {
if (ret = WIN_GetWindowStructById(win->chidWin[i - 1], id), ret) {
if (ret = WIN_GetWindowStructById(prev, id), ret) {
return ret;
}
prev = prev->prev;
}
}
return ret;
@@ -304,16 +302,23 @@ WIN_WindowStruct *WIN_GetWindowStructById(WIN_WindowStruct *win, u32 id) {
// <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) {
WIN_WindowStruct *next = win->chid;
for (int i = 0; i < win->chidWinNum; i++) {
if (win->chidWin[i] == chidWin) {
win->chidWin[i] = 0; // ɾ<><C9BE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
for (; i < win->chidWinNum - 1; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
{
win->chidWin[i] = win->chidWin[i + 1];
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;
}
win->chidWinNum--; // <20>Ӵ<EFBFBD><D3B4>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>һ
return 0;
}
next = next->next;
}
return -1;
}
@@ -321,17 +326,27 @@ int WIN_DelFromChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
// <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;
WIN_WindowStruct *next = win->chid;
for (int i = 0; i < win->chidWinNum; i++) {
if (win->chidWin[i] == chidWin) {
t = win->chidWin[i];
win->chidWin[i] = 0; // ɾ<><C9BE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
for (; i < win->chidWinNum; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
{
win->chidWin[i] = win->chidWin[i + 1];
if (next == chidWin) {
t = next;
if(next != win->chid) {
next->prev->next = next->next;
} else {
win->chid = next->next;
}
win->chidWin[win->chidWinNum - 1] = t; // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
if(next->next){
next->next->prev = next->prev;
}else{
win->chid->prev = next->prev;
}
t->next = 0;
t->prev = win->chid->prev;
win->chid->prev->next = t;
win->chid->prev = t;
return 0;
}
next = next->next;
}
return -1;
}
@@ -339,7 +354,14 @@ int WIN_SetChidWinTop(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
// <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) {
win->chidWin[win->chidWinNum] = chidWin;
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;
win->chidWinNum++;
return 0;
} else {
@@ -349,9 +371,11 @@ int WIN_AddToChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
// <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) {
WIN_WindowStruct *next = win->chid;
for (int i = 0; i < win->chidWinNum; i++) {
if (win->chidWin[i] == chid)
if (next == chid)
return 1;
next = next->next;
}
return 0;
}
@@ -429,12 +453,13 @@ WIN_WindowStruct *WIN_GetCurrentWindow(void) {
// <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>˿ɿش<C9BF><D8B4><EFBFBD>
WIN_WindowStruct *WIN_FindTopWin(WIN_WindowStruct *win) {
WIN_WindowStruct *ret = 0;
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
if (win && (win->chidWinNum)) {
for (int i = win->chidWinNum; i > 0; i--) {
ret = WIN_FindTopWin(win->chidWin[i - 1]);
ret = WIN_FindTopWin(prev);
if (ret)
return ret;
prev = prev->prev;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
@@ -450,10 +475,12 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
RECT_Struct r2 = {0};
WIN_WindowStruct *top = 0;
WIN_WindowStruct *base = win->baseWin;
WIN_WindowStruct *next = win->chid;
WIN_WindowStruct *prev;
// <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++) {
top = win->chidWin[i];
top = next;
if ((top->keyShield == 1) || (top->keyChid == 1))
continue;
r1.x = 0;
@@ -467,10 +494,12 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
if (POS_RectIntersection(&r1, &r1, &r2)) {
return 1;
}
next = next->next;
}
while (base) {
prev = WIN_GetLastChidWin(base);
for (int i = base->chidWinNum; i > 0; i--) {
top = base->chidWin[i - 1];
top = prev;
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>
@@ -482,6 +511,7 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
if (POS_RectIntersection(&r1, &r1, &r2)) {
return 1;
}
prev = prev->prev;
}
base = base->baseWin;
}
@@ -490,8 +520,10 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
// <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) {
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
for (int i = win->chidWinNum - 1; i >= 0; i--) {
win->chidWin[i]->keyShield = power;
prev->keyShield = power;
prev = prev->prev;
}
return 1;
}
@@ -503,6 +535,7 @@ WIN_WindowStruct *WIN_FindTopWinByPos(WIN_WindowStruct *win, int x, int y) {
int win_y_s = 0;
int x_size = win->x_size;
int y_size = win->y_size;
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
WIN_GetWinPosOnLcd(win, &win_x_s, &win_y_s, &x_size, &y_size);
@@ -512,11 +545,12 @@ WIN_WindowStruct *WIN_FindTopWinByPos(WIN_WindowStruct *win, int x, int y) {
// <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--) {
t = WIN_FindTopWinByPos(win->chidWin[i], x, y);
t = WIN_FindTopWinByPos(prev, x, y);
if (t) {
ret = t; // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
break;
}
prev = prev->prev;
}
} else {
// ָ<><D6B8><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>
@@ -553,13 +587,15 @@ WIN_WindowStruct *WIN_GetWinByTitle(WIN_WindowStruct *win, char *title) {
WIN_WindowStruct *ret = 0;
if (win == 0)
win = WIN_GetBaseWindow();
WIN_WindowStruct *next = win->chid;
if (strcmp(win->winTitle, title) == 0) {
ret = win;
} else {
for (int i = 0; i < win->chidWinNum; i++) {
if (ret = WIN_GetWinByTitle(win->chidWin[i], title), ret)
if (ret = WIN_GetWinByTitle(next, title), ret)
break;
next = next->next;
}
}