Compare commits

...

2 Commits

Author SHA1 Message Date
653d3cfcc9 解决字体大小异常的bug 2025-10-12 17:01:37 +08:00
f6d2ef948f 窗口框架使用二叉树 2025-10-12 16:47:31 +08:00
5 changed files with 91 additions and 44 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;
}
}

View File

@@ -103,7 +103,7 @@ int WIN_AddFontData(WIN_FontBuffStruct *font, u8 size, int word, u8 *buff,
u32 buff_size) {
if (font) {
_font_data font_data = {0};
font_data.word = (size << 16) | word;
font_data.word = (size << 24) | word;
font_data.data = buff;
font_data.data_size = buff_size;
if (WIN_InsertFont(font, &font_data, font->buff_used / 2) == 0)
@@ -132,7 +132,7 @@ u8 *WIN_SearchFontData(WIN_FontBuffStruct *font, u8 size, int word,
u32 *buff_size) {
u8 *ret = 0;
if (font) {
int temp = (size << 16) | word; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int temp = (size << 24) | word; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < font->buff_used; i++) {
int index = i;
_font_data *font_data = 0;
@@ -261,7 +261,7 @@ static u32 WIN_DrawWordAtCommon(char *c, int x, int y) {
if (g_font == 0)
g_font = WIN_CreatFontBuff(FONT_NUM);
// <20><><EFBFBD><EFBFBD>utf8һ<38><D2BB><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ֽ<EFBFBD>
buff = WIN_GetFontData(g_font, (c[0] << 16) | (c[1] << 8) | c[2], &all_byte);
buff = WIN_GetFontData(g_font, (c[0] << 8) | (c[1] << 0), &all_byte);
wid = buff[all_byte - 5];
hit = buff[all_byte - 4];
@@ -334,7 +334,7 @@ static u32 WIN_DrawWordAtNormal(char *c, int x, int y) {
// <20><>ȡ<EFBFBD><C8A1>ģ
if (g_font == 0)
g_font = WIN_CreatFontBuff(FONT_NUM);
buff = WIN_GetFontData(g_font, (c[0] << 16) | (c[1] << 8) | c[2], &all_byte);
buff = WIN_GetFontData(g_font, (c[0] << 8) | (c[1] << 0), &all_byte);
wid = buff[all_byte - 5];
hit = buff[all_byte - 4];

View File

@@ -524,6 +524,8 @@ int WIN_Working(WIN_WindowStruct *win) {
WIN_MsgStruct msg = {0};
win->msgLoopEnter++;
WIN_WindowStruct *winCurrent_old = WIN_GetWinStruct()->winCurrent;
WIN_WindowStruct *prev;
WIN_WindowStruct *next;
WIN_GetWinStruct()->winCurrent = win;
void *msgData = 0;
while (QUEUE_Out(&win->winMsgQueue, &msg)) {
@@ -541,25 +543,27 @@ int WIN_Working(WIN_WindowStruct *win) {
continue;
// ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5>Ӵ<EFBFBD><D3B4><EFBFBD>ҲҪ<D2B2>ػ<EFBFBD>
prev = WIN_GetLastChidWin(win);
for (int i = win->chidWinNum; i > 0; i--) {
// <20>ж<EFBFBD><D0B6><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڵ<EFBFBD>
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RECT_Struct ret = {0};
RECT_Struct r1 = {0};
r1.x = win->chidWin[i - 1]->x;
r1.y = win->chidWin[i - 1]->y;
r1.x_size = win->chidWin[i - 1]->x_size;
r1.y_size = win->chidWin[i - 1]->y_size;
r1.x = prev->x;
r1.y = prev->y;
r1.x_size = prev->x_size;
r1.y_size = prev->y_size;
if (POS_RectIntersection(&ret, &r1, &r)) {
ret.x -= win->chidWin[i - 1]->x;
ret.y -= win->chidWin[i - 1]->y; // <20><>ȥ<EFBFBD><C8A5><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>꣬2020.2.26
WIN_SetInvalidRect(win->chidWin[i - 1], ret.x, ret.y, ret.x_size,
ret.x -= prev->x;
ret.y -= prev->y; // <20><>ȥ<EFBFBD><C8A5><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>꣬2020.2.26
WIN_SetInvalidRect(prev, ret.x, ret.y, ret.x_size,
ret.y_size);
if (POS_RectSub(&r, &r, &r1) == 0) {
// <20>ػ<EFBFBD><D8BB><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD>
break;
}
}
prev = prev->prev;
}
// <20><><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
@@ -604,7 +608,7 @@ int WIN_Working(WIN_WindowStruct *win) {
// <20>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
case MOVE_DATA_TOUCHIN:
if (win->baseWin) {
if (win != win->baseWin->chidWin[win->baseWin->chidWinNum - 1]) {
if (win != win->baseWin->chid->prev) {
// <20><><EFBFBD>Ƕ<EFBFBD><C7B6>˴<EFBFBD><CBB4>ڣ<EFBFBD><DAA3>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (WIN_SetChidWinTop(win->baseWin, win) == 0)
WIN_SetInvalid(win);
@@ -630,8 +634,10 @@ int WIN_Working(WIN_WindowStruct *win) {
} // while (QUEUE_Out (&win->winMsgQueue,&msg))
// Ȼ<><C8BB><EFBFBD>Ӵ<EFBFBD><D3B4>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
for (int i = 0; i < win->chidWinNum; i++) {
run |= WIN_Working(win->chidWin[i]);
next = win->chid;
while(next) {
run |= WIN_Working(next);
next = next->next;
}
WIN_GetWinStruct()->winCurrent = winCurrent_old;

View File

@@ -248,12 +248,17 @@ typedef struct _WIN_WindowStruct {
int chidWinMaxSize;
int chidWinNum;
struct _WIN_WindowStruct *baseWin;
struct _WIN_WindowStruct *chidWin[WIN_CHIDWIN_MAXNUM];
struct _WIN_WindowStruct *prev;
struct _WIN_WindowStruct *next;
struct _WIN_WindowStruct *chid;
void (*msgLoop)(struct _WIN_WindowStruct *win, WIN_MsgStruct *msg);
void (*deleteWindow)(struct _WIN_WindowStruct *win);
QUEUE_Struct winMsgQueue;
} WIN_WindowStruct;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ӵ<EFBFBD><D3B4>ڵĺ<DAB5>
#define WIN_GetLastChidWin(win) (win->chidWinNum > 0 ? win->chid->prev : 0)
// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ҫ<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><E1B9B9>
typedef struct {
int Touch_long; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -307,8 +307,8 @@ int WIN_GetWordData(u8 size, u8 type, unsigned char *buff, int word,
u8 uni[3] = {0};
if (word > 0x80) {
gbk[0] = (word >> 16) & 0xff;
gbk[1] = (word >> 8) & 0xff;
gbk[0] = (word >> 8) & 0xff;
gbk[1] = (word >> 0) & 0xff;
// gbk[2]=word&0xff;
} else {
gbk[0] = word;