2025-06-27 00:32:57 +08:00
|
|
|
|
#include "mywin_inc.h"
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
|
|
|
|
|
int WIN_StorTouchStruct(WIN_TouchStruct *t) {
|
|
|
|
|
static int press = 0;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>л<EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
|
|
|
|
|
if (WIN_GetWinStruct()->touchQueue.data == 0)
|
|
|
|
|
return -1;
|
|
|
|
|
if (WIN_GetWinStruct()->keyShield == 1)
|
|
|
|
|
return -2;
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if ((press != t->pressNum) || t->pressNum) {
|
|
|
|
|
press = t->pressNum;
|
|
|
|
|
if (QUEUE_In(&WIN_GetWinStruct()->touchQueue, t) == 1)
|
|
|
|
|
return -3;
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return -4;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
|
|
|
|
|
int WIN_StorKeyStruct(WIN_KeyStruct *k) {
|
|
|
|
|
static int press = 0;
|
|
|
|
|
// <20><><EFBFBD>л<EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
|
|
|
|
|
if (WIN_GetWinStruct()->keyQueue.data == 0)
|
|
|
|
|
return -1;
|
|
|
|
|
if (WIN_GetWinStruct()->keyShield == 1)
|
|
|
|
|
return -2;
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>һ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
if ((press != k->state) || k->state) {
|
|
|
|
|
press = k->state;
|
|
|
|
|
if (QUEUE_In(&WIN_GetWinStruct()->keyQueue, k) == 1)
|
|
|
|
|
return -1;
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>հ<EFBFBD><D5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_ClearKeyQueue(void) {
|
|
|
|
|
WIN_KeyStruct k = {0};
|
|
|
|
|
while (QUEUE_Out(&WIN_GetWinStruct()->keyQueue, &k)) {
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_ClearTouchQueue(void) {
|
|
|
|
|
WIN_KeyStruct k = {0};
|
|
|
|
|
while (QUEUE_Out(&WIN_GetWinStruct()->touchQueue, &k)) {
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
|
|
|
|
|
void WIN_KeyShieldOn(void) { WIN_GetWinStruct()->keyShield = 1; }
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
|
|
|
|
|
void WIN_KeyShieldOff(void) { WIN_GetWinStruct()->keyShield = 0; }
|
|
|
|
|
|
|
|
|
|
// Ĭ<>ϵ<EFBFBD><CFB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_DefaultMsgLoop(WIN_WindowStruct *win, WIN_MsgStruct *msg) {
|
|
|
|
|
switch (msg->msg) {
|
|
|
|
|
case WIN_MSG_PAINT:
|
|
|
|
|
WIN_DefaultPaint(win);
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_INIT:
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_KEY:
|
|
|
|
|
// if (win!= WIN_GetBaseWindow())
|
|
|
|
|
// win->deleteWindow(win);
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_TOUCH:
|
|
|
|
|
// if (win != WIN_GetBaseWindow())
|
|
|
|
|
// win->deleteWindow(win);
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_CHID:
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_DELETE:
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_MOVE:
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_EXTMSG:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>Ĵ<DEB8><C4B4>ڵ<EFBFBD><DAB5><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void *WIN_SetMsgCallBack(WIN_WindowStruct *win,
|
|
|
|
|
void (*msgLoop)(struct _WIN_WindowStruct *win,
|
|
|
|
|
WIN_MsgStruct *msg)) {
|
|
|
|
|
void *ret = win->msgLoop;
|
|
|
|
|
win->msgLoop = msgLoop;
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
|
|
|
|
|
void *WIN_SetMsgLoopCallBack(WIN_WindowStruct *win,
|
|
|
|
|
void (*msgLoop)(struct _WIN_WindowStruct *win,
|
|
|
|
|
WIN_MsgStruct *msg)) {
|
|
|
|
|
void *ret = 0;
|
|
|
|
|
if (win) {
|
|
|
|
|
ret = win->msgLoop;
|
|
|
|
|
win->msgLoop = msgLoop;
|
|
|
|
|
} else {
|
|
|
|
|
ret = WIN_GetBaseWindow()->msgLoop;
|
|
|
|
|
WIN_GetBaseWindow()->msgLoop = msgLoop;
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>洢<EFBFBD>ⲿ<EFBFBD><E2B2BF>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EEB6AF><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʧ<EFBFBD><CAA7>
|
|
|
|
|
int WIN_StorExtMsg(void *msgData, int size) {
|
|
|
|
|
int ret = -1;
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
|
|
|
|
|
if (WIN_GetWinStruct()->BlockWin[0]) {
|
|
|
|
|
msg.msg = WIN_MSG_EXTMSG;
|
|
|
|
|
msg.data.p = mymalloc(size);
|
|
|
|
|
mymemcpy(msg.data.p, msgData, size);
|
|
|
|
|
ret = WIN_SendMsg(0, WIN_GetWinStruct()->BlockWin[0], &msg);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Ϣ<EFBFBD><CFA2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int WIN_WinStorExtMsg(WIN_WindowStruct *win, void *msgData, int size) {
|
|
|
|
|
int ret = -1;
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
|
|
|
|
|
if (win) {
|
|
|
|
|
msg.msg = WIN_MSG_EXTMSG;
|
|
|
|
|
msg.data.p = mymalloc(size);
|
|
|
|
|
mymemcpy(msg.data.p, msgData, size);
|
|
|
|
|
ret = WIN_SendMsg(0, win, &msg);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int WIN_SendMsg(WIN_WindowStruct *win, WIN_WindowStruct *dscWin,
|
|
|
|
|
WIN_MsgStruct *msg) {
|
|
|
|
|
int ret = -1;
|
|
|
|
|
if (win)
|
|
|
|
|
msg->srcWin = win;
|
|
|
|
|
if (dscWin) // Ŀ<>괰<EFBFBD><EAB4B0>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵĴ<D9B5><C4B4>ڷ<EFBFBD><DAB7><EFBFBD>Ϣ
|
|
|
|
|
if (dscWin->memFree)
|
|
|
|
|
ret = -1;
|
|
|
|
|
else
|
|
|
|
|
ret = QUEUE_In(&dscWin->winMsgQueue, msg);
|
|
|
|
|
}
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|
|
|
|
if (ret != 0) {
|
|
|
|
|
// <20>ͷ<EFBFBD><CDB7><EFBFBD>Щ<EFBFBD><D0A9>Ϣ<EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
switch (msg->msg) {
|
|
|
|
|
case WIN_MSG_KEY:
|
|
|
|
|
case WIN_MSG_TOUCH:
|
|
|
|
|
case WIN_MSG_EXTMSG:
|
|
|
|
|
case WIN_MSG_MOVE:
|
|
|
|
|
myfree(msg->data.p);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int WIN_SendMsgToPrent(WIN_WindowStruct *win, u32 type, u32 data) {
|
|
|
|
|
WIN_MsgStruct msg1 = {0};
|
|
|
|
|
msg1.msg = WIN_MSG_CHID;
|
|
|
|
|
msg1.data.v = type;
|
|
|
|
|
msg1.data2.v = data;
|
|
|
|
|
return WIN_SendMsg(win, win->baseWin, &msg1);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_ClearMsgQueue(WIN_WindowStruct *win) {
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
while (QUEUE_Out(&win->winMsgQueue, &msg)) {
|
|
|
|
|
switch (msg.msg) {
|
|
|
|
|
// <20>ͷŹ<CDB7><C5B9><EFBFBD><EFBFBD><EFBFBD>Ϣʱ<CFA2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
case WIN_MSG_KEY:
|
|
|
|
|
case WIN_MSG_TOUCH:
|
|
|
|
|
case WIN_MSG_EXTMSG:
|
|
|
|
|
case WIN_MSG_MOVE:
|
|
|
|
|
myfree(msg.data.p);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
WIN_MsgStruct *WIN_CheckMsg(WIN_WindowStruct *win, u32 msgType) {
|
|
|
|
|
WIN_MsgStruct *msg = 0;
|
|
|
|
|
QUEUE_CheckStart(&win->winMsgQueue);
|
|
|
|
|
while (msg = QUEUE_Check(&win->winMsgQueue), msg) {
|
|
|
|
|
if (msg->msg == msgType) {
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_SendKeyMsg(WIN_WindowStruct *win, WIN_KeyStruct *k) {
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
if (win->keyShield == 0) {
|
|
|
|
|
msg.msg = WIN_MSG_KEY;
|
|
|
|
|
// Ҫ<><D2AA>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>һֱ<D2BB><D6B1>Ч,<2C><>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1>Ҫfree<65><65><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_KeyStruct));
|
|
|
|
|
mymemcpy(msg.data.p, k, sizeof(WIN_KeyStruct));
|
|
|
|
|
WIN_SendMsg(0, win, &msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((win->baseWin) && (win->baseWin != WIN_GetBaseWindow()) &&
|
|
|
|
|
(win->intercept == 0)) {
|
|
|
|
|
WIN_SendKeyMsg(win->baseWin, k);
|
|
|
|
|
} else if (win->baseWin) {
|
|
|
|
|
// <20><><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (WIN_GetWinStruct()->BlockWinNum == 0)
|
|
|
|
|
WIN_SendKeyMsg(WIN_GetBaseWindow(), k);
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĸ<DAB5><C4B8><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_SendTouchMsg(WIN_WindowStruct *win, int lcd_x, int lcd_y) {
|
|
|
|
|
WIN_TouchStruct t = {0};
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
if (win->keyShield == 0) {
|
|
|
|
|
msg.msg = WIN_MSG_TOUCH;
|
|
|
|
|
// Ҫ<><D2AA>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>һֱ<D2BB><D6B1>Ч,<2C><>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1>Ҫfree<65><65><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_TouchStruct));
|
|
|
|
|
int x, y, xs, ys;
|
|
|
|
|
WIN_GetWinPosOnLcd(win, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
t.x[0] = lcd_x - x;
|
|
|
|
|
t.y[0] = lcd_y - y;
|
|
|
|
|
mymemcpy(msg.data.p, &t, sizeof(WIN_TouchStruct));
|
|
|
|
|
WIN_SendMsg(0, win, &msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((win->baseWin) && (win->intercept == 0)) {
|
|
|
|
|
WIN_SendTouchMsg(win->baseWin, lcd_x, lcd_y);
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_SendTouchMove(WIN_WindowStruct *win, int move_x, int move_y) {
|
|
|
|
|
WIN_MoveStruct m = {0};
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
|
|
|
|
|
if (win->keyShield == 0) {
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_MOVED;
|
|
|
|
|
m.x_move = move_x;
|
|
|
|
|
m.y_move = move_y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, win, &msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((win->baseWin) && (win->intercept == 0)) {
|
|
|
|
|
WIN_SendTouchMove(win->baseWin, move_x, move_y);
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>㲥<EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
int WIN_TouchMsgBroad(WIN_WindowStruct *base) {
|
|
|
|
|
int have_msg = 0; // <20><><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
WIN_TouchStruct t = {0};
|
|
|
|
|
WIN_KeyStruct k = {0};
|
|
|
|
|
WIN_MoveStruct m = {0};
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
WIN_MsgBroadStruct *broad = &WIN_GetWinStruct()->msgBroad;
|
|
|
|
|
while (QUEUE_Out(&WIN_GetWinStruct()->touchQueue, &t) == 1) {
|
|
|
|
|
have_msg = 1;
|
|
|
|
|
// <20>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
broad->win = WIN_FindTopWinByPos(base, t.x[0], t.y[0]);
|
|
|
|
|
// while(broad->win&&broad->win->keyShield)
|
|
|
|
|
//broad->win=broad->win->baseWin;
|
|
|
|
|
if (broad->win) {
|
|
|
|
|
// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>ǰ<EFBFBD><C7B0>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²ų<C2B2><C5B3><EFBFBD>
|
|
|
|
|
if (broad->t_old.pressNum && t.pressNum) {
|
|
|
|
|
if (broad->win_old != broad->win) {
|
|
|
|
|
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD>
|
|
|
|
|
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (broad->win_old) {
|
|
|
|
|
int x, y, xs, ys;
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_MOVEOUT;
|
|
|
|
|
WIN_GetWinPosOnLcd(broad->win_old, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m.x_move = t.x[0] - x;
|
|
|
|
|
m.y_move = t.y[0] - y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, broad->win_old, &msg);
|
|
|
|
|
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_MOVEIN;
|
|
|
|
|
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m.x_move = t.x[0] - x;
|
|
|
|
|
m.y_move = t.y[0] - y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, broad->win, &msg);
|
|
|
|
|
broad->Touch_long = WIN_LONGTOUCH_CHECK; // <20>Ѿ<EFBFBD><D1BE>ƶ<EFBFBD><C6B6>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC>ⳤ<EFBFBD><E2B3A4>
|
|
|
|
|
} else {
|
|
|
|
|
// <20>ɿ<EFBFBD><C9BF><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ĵ<EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
broad->win_old = broad->win;
|
|
|
|
|
} // if (win_old!=win)
|
|
|
|
|
WIN_WindowStruct *win_move = 0;
|
|
|
|
|
if (win_move = WIN_FindPrent(broad->win_old, broad->win),
|
|
|
|
|
win_move != 0) {
|
|
|
|
|
// <20><><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ֵû<D6B5><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
|
|
|
|
|
if (POS_RoundPix(1, broad->t_old.x[0], broad->t_old.y[0], t.x[0],
|
|
|
|
|
t.y[0]) != 0) {
|
|
|
|
|
// <20><>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|
|
|
|
WIN_SendTouchMove(win_move, t.x[0] - broad->t_old.x[0],
|
|
|
|
|
t.y[0] - broad->t_old.y[0]);
|
|
|
|
|
broad->Touch_long =
|
|
|
|
|
WIN_LONGTOUCH_CHECK + 10; // <20>Ѿ<EFBFBD><D1BE>ƶ<EFBFBD><C6B6>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC>ⳤ<EFBFBD><E2B3A4>
|
|
|
|
|
} else {
|
|
|
|
|
// <20><><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ƶ<EFBFBD>,<2C><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
|
|
|
|
if (broad->Touch_long < WIN_LONGTOUCH_CHECK) {
|
|
|
|
|
broad->Touch_long++;
|
|
|
|
|
if (broad->Touch_long >= WIN_LONGTOUCH_CHECK) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_LONG;
|
|
|
|
|
int x, y, xs, ys;
|
|
|
|
|
WIN_GetWinPosOnLcd(
|
|
|
|
|
broad->win, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m.x_move = t.x[0] - x;
|
|
|
|
|
m.y_move = t.y[0] - y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, broad->win_old, &msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} // if (win_move=WIN_FindPrent(win_old,win),win_move!=0)
|
|
|
|
|
} // if (t_old.pressNum&&t.pressNum)
|
|
|
|
|
else {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (broad->Touch_long && (broad->Touch_long < WIN_LONGTOUCH_CHECK)) {
|
|
|
|
|
// <20><><EFBFBD>Ͷ̰<CDB6><CCB0><EFBFBD>Ϣ
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_SHORT;
|
|
|
|
|
int x, y, xs, ys;
|
|
|
|
|
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m.x_move = t.x[0] - x;
|
|
|
|
|
m.y_move = t.y[0] - y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, broad->win_old, &msg);
|
|
|
|
|
}
|
|
|
|
|
// <20><>Ļ<EFBFBD>ɿ<EFBFBD><C9BF>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⸴λ
|
|
|
|
|
broad->Touch_long = 0;
|
|
|
|
|
// <20><>Ļ<EFBFBD>ɿ<EFBFBD><C9BF>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ڼ们<DABC><E4BBAC><EFBFBD><EFBFBD>λ
|
|
|
|
|
broad->win_old = 0;
|
|
|
|
|
if (t.pressNum == 0) {
|
|
|
|
|
// <20><>Ļ<EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_TOUCHOUT;
|
|
|
|
|
int x, y, xs, ys;
|
|
|
|
|
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m.x_move = t.x[0] - x;
|
|
|
|
|
m.y_move = t.y[0] - y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, broad->win, &msg);
|
|
|
|
|
} else {
|
|
|
|
|
// <20>ɿ<EFBFBD><C9BF><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ĵ<EFBFBD>һ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_TOUCHIN;
|
|
|
|
|
int x, y, xs, ys;
|
|
|
|
|
WIN_GetWinPosOnLcd(broad->win, &x, &y, &xs,
|
|
|
|
|
&ys); // <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ϵľ<CFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m.x_move = t.x[0] - x;
|
|
|
|
|
m.y_move = t.y[0] - y;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, broad->win, &msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
broad->t_old.x[0] = t.x[0];
|
|
|
|
|
broad->t_old.y[0] = t.y[0];
|
|
|
|
|
broad->t_old.pressNum = t.pressNum;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
WIN_SendTouchMsg(broad->win, t.x[0], t.y[0]);
|
|
|
|
|
} // if (win)
|
|
|
|
|
else {
|
|
|
|
|
if (broad->t_old.pressNum == 0 && t.pressNum) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
msg.msg = WIN_MSG_MOVE;
|
|
|
|
|
msg.data.p = mymalloc(sizeof(WIN_MoveStruct));
|
|
|
|
|
m.moveType = MOVE_DATA_OUTSIDE;
|
|
|
|
|
m.x_move = 0;
|
|
|
|
|
m.y_move = 0;
|
|
|
|
|
mymemcpy(msg.data.p, &m, sizeof(WIN_MoveStruct));
|
|
|
|
|
WIN_SendMsg(0, base, &msg);
|
|
|
|
|
}
|
|
|
|
|
broad->t_old.x[0] = t.x[0];
|
|
|
|
|
broad->t_old.y[0] = t.y[0];
|
|
|
|
|
broad->t_old.pressNum = t.pressNum;
|
|
|
|
|
}
|
|
|
|
|
} // while (QUEUE_Out (&g_win_touchQueue,&t)==1)
|
|
|
|
|
|
|
|
|
|
return have_msg;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>㲥<EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
int WIN_KeyMsgBroad(WIN_WindowStruct *base) {
|
|
|
|
|
int have_msg = 0; // <20><><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
WIN_TouchStruct t = {0};
|
|
|
|
|
WIN_KeyStruct k = {0};
|
|
|
|
|
WIN_MoveStruct m = {0};
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
WIN_MsgBroadStruct *broad = &WIN_GetWinStruct()->msgBroad;
|
|
|
|
|
while (QUEUE_Out(&WIN_GetWinStruct()->keyQueue, &k) == 1) {
|
|
|
|
|
have_msg = 1;
|
|
|
|
|
WIN_WindowStruct *win_key = 0;
|
|
|
|
|
if (win_key = WIN_FindTopWin(base), win_key != 0) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>
|
|
|
|
|
if ((broad->k_old.key == k.key) && k.key) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>µ<EFBFBD>
|
|
|
|
|
if (k.state) {
|
|
|
|
|
if (broad->Key_long < WIN_LONGTOUCH_CHECK) {
|
|
|
|
|
broad->Key_long++;
|
|
|
|
|
if (broad->Key_long >= WIN_LONGTOUCH_CHECK) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
k.longPress |= k.key;
|
|
|
|
|
k.shortPress = 0;
|
|
|
|
|
k.firstPress = 0;
|
|
|
|
|
k.unPress = 0;
|
|
|
|
|
WIN_SendKeyMsg(win_key, &k);
|
|
|
|
|
} else {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
k.longPress = 0;
|
|
|
|
|
k.shortPress = 0;
|
|
|
|
|
k.firstPress = 0;
|
|
|
|
|
k.unPress = 0;
|
|
|
|
|
WIN_SendKeyMsg(win_key, &k);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>
|
|
|
|
|
broad->Key_long++;
|
|
|
|
|
if (broad->Key_long % WIN_LONGTOUCH_CHECK == 0) {
|
|
|
|
|
k.longPressNum = broad->Key_long / WIN_LONGTOUCH_CHECK;
|
|
|
|
|
if (k.longPressNum != broad->k_old.longPressNum) {
|
|
|
|
|
// <20>ٴδ<D9B4><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
broad->k_old.longPressNum = k.longPressNum;
|
|
|
|
|
k.longPress |= k.key;
|
|
|
|
|
k.shortPress = 0;
|
|
|
|
|
k.firstPress = 0;
|
|
|
|
|
k.unPress = 0;
|
|
|
|
|
WIN_SendKeyMsg(win_key, &k);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} // if (k.state)
|
|
|
|
|
else {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>±<EFBFBD>Ϊ<EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (broad->Key_long < WIN_LONGTOUCH_CHECK) {
|
|
|
|
|
// <20>̰<EFBFBD>
|
|
|
|
|
k.shortPress |= k.key;
|
|
|
|
|
k.longPress = 0;
|
|
|
|
|
k.firstPress = 0;
|
|
|
|
|
k.unPress = 0;
|
|
|
|
|
WIN_SendKeyMsg(win_key, &k);
|
|
|
|
|
} else {
|
|
|
|
|
// <20>ɿ<EFBFBD><C9BF>˰<EFBFBD><CBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
broad->k_old.longPressNum = 0;
|
|
|
|
|
}
|
|
|
|
|
k.unPress = k.key;
|
|
|
|
|
k.firstPress = 0;
|
|
|
|
|
k.longPress = 0;
|
|
|
|
|
k.shortPress = 0;
|
|
|
|
|
WIN_SendKeyMsg(win_key, &k);
|
|
|
|
|
broad->Key_long = 0;
|
|
|
|
|
k.key = 0;
|
|
|
|
|
}
|
|
|
|
|
} // if ((k_old.key==k.key)&&k.key)
|
|
|
|
|
else if ((broad->k_old.state == 0) && (k.state)) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD>
|
|
|
|
|
broad->Key_long = 0;
|
|
|
|
|
k.firstPress = k.key;
|
|
|
|
|
k.longPress = 0;
|
|
|
|
|
k.shortPress = 0;
|
|
|
|
|
WIN_SendKeyMsg(win_key, &k);
|
|
|
|
|
}
|
|
|
|
|
broad->k_old.key = k.key;
|
|
|
|
|
broad->k_old.state = k.state;
|
|
|
|
|
} // if (win_key =WIN_FindTopWin(win),win_key!=0)
|
|
|
|
|
}
|
|
|
|
|
return have_msg;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>㲥<EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|
|
|
|
int WIN_MsgBroad(WIN_WindowStruct *base) {
|
|
|
|
|
return WIN_KeyMsgBroad(base) | WIN_TouchMsgBroad(base);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int WIN_Working(WIN_WindowStruct *win) {
|
|
|
|
|
|
|
|
|
|
WIN_MoveStruct *m = 0;
|
|
|
|
|
RECT_Struct r = {0};
|
|
|
|
|
int run = 0; // <20><><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣû<CFA2><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
// <20>Լ<EFBFBD><D4BC>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
win->msgLoopEnter++;
|
|
|
|
|
WIN_WindowStruct *winCurrent_old = WIN_GetWinStruct()->winCurrent;
|
|
|
|
|
WIN_GetWinStruct()->winCurrent = win;
|
|
|
|
|
void *msgData = 0;
|
|
|
|
|
while (QUEUE_Out(&win->winMsgQueue, &msg)) {
|
|
|
|
|
run = 1;
|
|
|
|
|
// <20>ȸ<EFBFBD><C8B8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ȼ<EFBFBD><C8BB><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>Ϣָ<CFA2>룬<EFBFBD><EBA3AC>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұָ<D2B0><D6B8>
|
|
|
|
|
msgData = msg.data.p;
|
|
|
|
|
|
|
|
|
|
switch (msg.msg) {
|
|
|
|
|
// <20><>Щ<EFBFBD><D0A9><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ<EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>֮ǰҪ<C7B0><D2AA><EFBFBD><EFBFBD><EFBFBD>úû<C3BA><C3BB><EFBFBD>
|
|
|
|
|
case WIN_MSG_PAINT:
|
|
|
|
|
mymemcpy(&r, &win->invaldRect, sizeof(RECT_Struct));
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
|
|
|
|
|
if (win->invald == 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
// ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5>Ӵ<EFBFBD><D3B4><EFBFBD>ҲҪ<D2B2>ػ<EFBFBD>
|
|
|
|
|
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;
|
|
|
|
|
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.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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
|
|
|
|
|
WIN_TopWinPaint(win);
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>־
|
|
|
|
|
win->invald = 0;
|
|
|
|
|
// <20><>Ҫ<EFBFBD>ػ<EFBFBD><D8BB>Ĵ<EFBFBD><C4B4><EFBFBD>-1
|
|
|
|
|
if (WIN_GetWinStruct()->numOfWindowToPrint)
|
|
|
|
|
WIN_GetWinStruct()->numOfWindowToPrint--;
|
|
|
|
|
else
|
|
|
|
|
while (1)
|
|
|
|
|
; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
|
|
|
|
// <20><>ͼ<EFBFBD><CDBC><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (r.x_size <= 0 || r.y_size <= 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>û<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|
|
|
|
WIN_EnterPaint(win);
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|
|
|
|
WIN_SetWinInvalidRect(win, &r);
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
WIN_GetWinStruct()->lcd->enterLayerBuff();
|
|
|
|
|
break; // case WIN_MSG_PAINT:
|
|
|
|
|
} // switch (msg.msg)
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
|
|
|
|
|
win->msgLoop(win, &msg);
|
|
|
|
|
|
|
|
|
|
switch (msg.msg) {
|
|
|
|
|
// <20><>Щ<EFBFBD><D0A9><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ<EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>ʱʹ<CAB1><CAB9><EFBFBD><EFBFBD>malloc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŵ<CDB7>
|
|
|
|
|
case WIN_MSG_KEY:
|
|
|
|
|
case WIN_MSG_TOUCH:
|
|
|
|
|
case WIN_MSG_EXTMSG:
|
|
|
|
|
myfree(msgData);
|
|
|
|
|
break;
|
|
|
|
|
case WIN_MSG_MOVE:
|
|
|
|
|
m = msg.data.p;
|
|
|
|
|
switch (m->moveType) {
|
|
|
|
|
// <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]) {
|
|
|
|
|
// <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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
myfree(msgData);
|
|
|
|
|
break; // case WIN_MSG_MOVE:
|
|
|
|
|
// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ɣ<EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD>Ļ
|
|
|
|
|
case WIN_MSG_PAINT:
|
|
|
|
|
if (WIN_GetWinStruct()->numOfWindowToPrint == 0) // LCD_ExitLayerBuff();
|
|
|
|
|
WIN_GetWinStruct()->lcd->exitLayerBuff();
|
|
|
|
|
break;
|
|
|
|
|
// <20><>Щ<EFBFBD><D0A9><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ϣ<EFBFBD><CFA2>Ҫ<EFBFBD><D2AA><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
|
|
|
|
case WIN_MSG_DELETE:
|
|
|
|
|
if (win->baseWin) {
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
|
|
|
|
|
// WIN_SetInvalidRect(win->baseWin,win->x,win->y,win->x_size,win->y_size);
|
|
|
|
|
} // if (win->baseWin)
|
|
|
|
|
break;
|
|
|
|
|
} // switch (msg.msg)
|
|
|
|
|
} // 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]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WIN_GetWinStruct()->winCurrent = winCurrent_old;
|
|
|
|
|
if (win->msgLoopEnter)
|
|
|
|
|
win->msgLoopEnter--;
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if ((win->msgLoopEnter == 0) && (win->memFree)) {
|
|
|
|
|
win->memFree(win);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return run;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
|
|
|
|
void WIN_Delay(int ms) {
|
|
|
|
|
WIN_GetWinStruct()->delay_ms = ms;
|
|
|
|
|
WIN_Delay_ms(WIN_GetWinStruct()->delay_ms);
|
|
|
|
|
if (WIN_GetWinStruct()->runCallBack)
|
|
|
|
|
WIN_GetWinStruct()->runCallBack();
|
|
|
|
|
WIN_TimerWork();
|
|
|
|
|
while (WIN_MsgBroad(WIN_GetBaseWindow()))
|
|
|
|
|
;
|
|
|
|
|
while (WIN_Working(WIN_GetBaseWindow()))
|
|
|
|
|
;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int WIN_RunBlock(WIN_WindowStruct *win) {
|
|
|
|
|
WIN_WindowStruct *win_save = win;
|
|
|
|
|
|
|
|
|
|
// <20>Ƿ<C7B7><F1B3ACB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>ײ<EFBFBD><D7B2><EFBFBD>
|
|
|
|
|
if (WIN_GetWinStruct()->BlockWinNum >= WIN_BLOCK_MAXNUM) {
|
|
|
|
|
win->deleteWindow(win);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>ջ
|
|
|
|
|
for (int i = WIN_GetWinStruct()->BlockWinNum; i > 0; i--) {
|
|
|
|
|
WIN_GetWinStruct()->BlockWin[i] = WIN_GetWinStruct()->BlockWin[i - 1];
|
|
|
|
|
}
|
|
|
|
|
WIN_GetWinStruct()->BlockWin[0] = win;
|
|
|
|
|
WIN_GetWinStruct()->BlockWinNum++;
|
|
|
|
|
|
|
|
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|
|
|
|
while (WIN_GetWinStruct()->BlockWin[0] == win_save) {
|
|
|
|
|
WIN_Delay_ms(WIN_GetWinStruct()->delay_ms);
|
|
|
|
|
if (WIN_GetWinStruct()->runCallBack)
|
|
|
|
|
WIN_GetWinStruct()->runCallBack();
|
|
|
|
|
WIN_TimerWork();
|
|
|
|
|
while (WIN_MsgBroad(WIN_GetWinStruct()->BlockWin[0]))
|
|
|
|
|
;
|
|
|
|
|
// WIN_Working (WIN_GetBaseWindow());
|
|
|
|
|
while (WIN_Working(WIN_GetBaseWindow()))
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ش<EFBFBD><D8B4>ڵķ<DAB5><C4B7><EFBFBD>ֵ
|
|
|
|
|
return WIN_GetWinStruct()->BlockWinReturn;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
|
|
|
|
|
void WIN_SetInvalid(WIN_WindowStruct *win) {
|
|
|
|
|
WIN_SetInvalidRect(win, 0, 0, win->x_size, win->y_size);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB6A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
|
|
|
|
|
void WIN_SetInvalidWhenTop(WIN_WindowStruct *win) {
|
|
|
|
|
WIN_SetInvalidRectWhenTop(win, 0, 0, win->x_size, win->y_size);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20>Ѵ<EFBFBD><D1B4><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч,<2C>Դ<EFBFBD><D4B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD>
|
|
|
|
|
void WIN_SetInvalidRect(WIN_WindowStruct *win, int x, int y, int x_size,
|
|
|
|
|
int y_size) {
|
|
|
|
|
RECT_Struct *r;
|
|
|
|
|
if (win->memFree)
|
|
|
|
|
return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵĴ<D9B5><C4B4>ڷ<EFBFBD><DAB7><EFBFBD>Ϣ
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>paint<6E><74>Ϣ
|
|
|
|
|
WIN_MsgStruct msg = {0};
|
|
|
|
|
msg.msg = WIN_MSG_PAINT;
|
|
|
|
|
r = mymalloc(sizeof(RECT_Struct));
|
|
|
|
|
|
|
|
|
|
WIN_GetWinPosOnLcd(win, &r->x, &r->y, &r->x_size, &r->y_size);
|
|
|
|
|
RECT_Struct r_win = {0};
|
|
|
|
|
r_win.x = r->x;
|
|
|
|
|
r_win.y = r->y;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ڴ<EFBFBD><DAB4>ڷ<EFBFBD>Χ<EFBFBD><CEA7>
|
|
|
|
|
WIN_WindowStruct *t = win;
|
|
|
|
|
RECT_Struct r_now = {0};
|
|
|
|
|
do {
|
|
|
|
|
WIN_GetWinPosOnLcd(t, &r_now.x, &r_now.y, &r_now.x_size, &r_now.y_size);
|
|
|
|
|
|
|
|
|
|
POS_RectIntersection(r, r, &r_now);
|
|
|
|
|
t = t->baseWin;
|
|
|
|
|
} while (t);
|
|
|
|
|
r->x -= r_win.x;
|
|
|
|
|
r->y -= r_win.y;
|
|
|
|
|
RECT_Struct r_in = {0};
|
|
|
|
|
r_in.x = x;
|
|
|
|
|
r_in.y = y;
|
|
|
|
|
r_in.x_size = x_size;
|
|
|
|
|
r_in.y_size = y_size;
|
|
|
|
|
POS_RectIntersection(r, r, &r_in);
|
|
|
|
|
|
|
|
|
|
if (win->invald == 0) {
|
|
|
|
|
WIN_SendMsg(0, win, &msg);
|
|
|
|
|
mymemcpy(&win->invaldRect, r, sizeof(RECT_Struct));
|
|
|
|
|
win->invald = 1;
|
|
|
|
|
WIN_GetWinStruct()->numOfWindowToPrint++; // <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ƵĴ<C6B5><C4B4>ڼ<EFBFBD>1
|
|
|
|
|
} else {
|
|
|
|
|
POS_RectContain(&win->invaldRect, &win->invaldRect, r);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
myfree(r);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB6A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>Ч
|
|
|
|
|
void WIN_SetInvalidRectWhenTop(WIN_WindowStruct *win, int x, int y, int x_size,
|
|
|
|
|
int y_size) {
|
|
|
|
|
if (WIN_FindBlock(win) == 0) {
|
|
|
|
|
WIN_SetInvalidRect(win, x, y, x_size, y_size);
|
|
|
|
|
}
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|
|
|
|
void WIN_Move(WIN_WindowStruct *win, int x_move, int y_move) {
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
RECT_Struct r1 = {0};
|
|
|
|
|
RECT_Struct r2 = {0};
|
|
|
|
|
r1.x = win->x;
|
|
|
|
|
r1.y = win->y;
|
|
|
|
|
r1.x_size = win->x_size;
|
|
|
|
|
r1.y_size = win->y_size;
|
|
|
|
|
mymemcpy(&r2, &r1, sizeof(RECT_Struct));
|
|
|
|
|
win->x += x_move;
|
|
|
|
|
win->y += y_move;
|
|
|
|
|
r2.x = win->x;
|
|
|
|
|
r2.y = win->y;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
POS_RectContain(&r1, &r1, &r2);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
if (win->baseWin)
|
|
|
|
|
WIN_SetInvalidRect(win->baseWin, r1.x, r1.y, r1.x_size, r1.y_size);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// WIN_SetInvalid(win);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
void WIN_SetPos(WIN_WindowStruct *win, int x, int y) {
|
|
|
|
|
RECT_Struct r1 = {0};
|
|
|
|
|
RECT_Struct r2 = {0};
|
|
|
|
|
r1.x = win->x;
|
|
|
|
|
r1.y = win->y;
|
|
|
|
|
r1.x_size = win->x_size;
|
|
|
|
|
r1.y_size = win->y_size;
|
|
|
|
|
mymemcpy(&r2, &r1, sizeof(RECT_Struct));
|
|
|
|
|
win->x = x;
|
|
|
|
|
win->y = y;
|
|
|
|
|
r2.x = win->x;
|
|
|
|
|
r2.y = win->y;
|
|
|
|
|
|
|
|
|
|
POS_RectContain(&r1, &r1, &r2);
|
|
|
|
|
|
|
|
|
|
if (win->baseWin)
|
|
|
|
|
WIN_SetInvalidRect(win->baseWin, r1.x, r1.y, r1.x_size, r1.y_size);
|
|
|
|
|
|
|
|
|
|
// WIN_SetInvalid(win);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 18:46:13 +08:00
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4>ڳߴ<DAB3>
|
|
|
|
|
void WIN_SetSize(WIN_WindowStruct *win, int x_size, int y_size) {
|
|
|
|
|
RECT_Struct r1 = {0};
|
|
|
|
|
RECT_Struct r2 = {0};
|
|
|
|
|
r1.x = win->x;
|
|
|
|
|
r1.y = win->y;
|
|
|
|
|
r1.x_size = win->x_size;
|
|
|
|
|
r1.y_size = win->y_size;
|
|
|
|
|
mymemcpy(&r2, &r1, sizeof(RECT_Struct));
|
|
|
|
|
win->x_size = x_size;
|
|
|
|
|
win->y_size = y_size;
|
|
|
|
|
r2.x_size = win->x_size;
|
|
|
|
|
r2.y_size = win->y_size;
|
|
|
|
|
|
|
|
|
|
POS_RectContain(&r1, &r1, &r2);
|
|
|
|
|
|
|
|
|
|
if (win->baseWin)
|
|
|
|
|
WIN_SetInvalidRect(win->baseWin, r1.x, r1.y, r1.x_size, r1.y_size);
|
|
|
|
|
|
|
|
|
|
// WIN_SetInvalid(win);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|