优化窗口移动的逻辑,显示还是有问题,需要继续优化

This commit is contained in:
2021-08-16 23:36:56 +08:00
parent 398d16f69f
commit 2eb96d763e
16 changed files with 13476 additions and 13390 deletions
+3
View File
@@ -16,6 +16,7 @@ task run_loop;//
void main_app()
{
char str[64];
LCDx_Init();
EPPROM_SLOWWRITE_INIT();
@@ -34,6 +35,8 @@ void main_app()
while(1)
{
LCD_set_dot(t0.pix_x, t0.pix_y, RED);
sprintf(str,"%04d\n%04d\n%04d",t0.pix_x,t0.pix_y,t0.c);
LCD_ShowString(0, 0, &str, 16, RED, BLUE);
/*
switch(run_loop.sw)
{
+85 -55
View File
@@ -7,6 +7,7 @@
#include "windows.h"
#include "touch.h"
extern touch_device t0;
//接口
//设置屏幕像素坐标
void Inteface_SetCursor(uint16_t Xpos, uint16_t Ypos)
@@ -35,6 +36,8 @@ UI *UI_Init(COLOR_16 background)
ui->windows=NULL;
ui->last_windows=NULL;
ui->refresh_ui_flag=1;
ui->moveed_windwos=NULL;
ui->First_click_flag==0;
/*
ui->touch=(touch_device*)malloc(sizeof(touch_device));
if(ui->touch!=NULL)
@@ -314,76 +317,103 @@ void UI_Server(UI *ui)
int t_x,t_y;
//touch
//temp_touch=ui->touch;
if(TP_XY(&t_x, &t_y))//Touch_Server(temp_touch))
if(t0.c)//TP_XY(&t_x, &t_y))
{
temp_window=NULL;
temp_windows_stack=ui->last_windows; //获取ui中最前端的窗口 从前往后扫描
do
if(t0.d)
{
if(temp_windows_stack!=NULL) //如果有窗口就开始扫描
t_x=t0.pix_x;
t_y=t0.pix_y;
temp_window=NULL;
if(ui->moveed_windwos==NULL)
{
flag=1; //检查到有窗口 需要循环一次以检查是否有下一个窗口
//
temp_window=temp_windows_stack->window; //取出这个窗口
hit_flag=Chack(temp_window,t_x,t_y); //检查触摸是否命中 直接返回命中窗口的位置
if(hit_flag) // 命中继续
if(ui->First_click_flag==0)
{
if(temp_windows_stack!=ui->last_windows) //检查是否最前端的窗口 如果不是就放最前面
ui->First_click_flag=1;
temp_windows_stack=ui->last_windows; //获取ui中最前端的窗口 从前往后扫描
do
{
if(temp_windows_stack!=ui->windows) //检查是否最后端的窗口 因为显示是从最后端往前显示的 所以ui有最后端窗口的入口
if(temp_windows_stack!=NULL) //如果有窗口就开始扫描
{
temp_windows_stack->up->next=temp_windows_stack->next; //取出这个节点 把节点的上下补上链接
temp_windows_stack->next->up=temp_windows_stack->up;
flag=1; //检查到有窗口 需要循环一次以检查是否有下一个窗口
//
temp_window=temp_windows_stack->window; //取出这个窗口
hit_flag=Chack(temp_window,t_x,t_y); //检查触摸是否命中 直接返回命中窗口的位置
if(hit_flag) // 命中继续
{
if(temp_windows_stack!=ui->last_windows) //检查是否最前端的窗口 如果不是就放最前面
{
if(temp_windows_stack!=ui->windows) //检查是否最后端的窗口 因为显示是从最后端往前显示的 所以ui有最后端窗口的入口
{
temp_windows_stack->up->next=temp_windows_stack->next; //取出这个节点 把节点的上下补上链接
temp_windows_stack->next->up=temp_windows_stack->up;
}else
{
ui->windows=temp_windows_stack->next; //如果是最后端的窗口 则取出这个节点后入口就变下一个节点了
ui->windows->up=NULL; //倒数第二变最后端 在走就没了 所以要清空指针
}
temp_windows_stack->next=NULL; //取出的节点要放在最前端 所以 无法再往前 清空往前的指针
temp_windows_stack->up=ui->last_windows; //上一个指针就是原来的最后一个
ui->last_windows->next=temp_windows_stack; //原来的最后一个指向现在的最后一个
ui->last_windows=temp_windows_stack; //更新ui中的最后一个的入口
ui->refresh_ui_flag=1; //发生了变化 刷新ui的显示
}
//检查标中窗口的什么位置
switch(hit_flag)
{
case CLOSE:
Close_Windows_Stack(ui,temp_windows_stack);
ui->refresh_ui_flag=1; //发生了变化 刷新ui的显示
break;
case BAR:
ui->moveed_windwos=temp_window;
ui->move_x=t_x-temp_window->x;
ui->move_y=t_y-temp_window->y;
break;
case BODY:
//ui->background=temp_windows_stack->window->background;
//ui->refresh_ui_flag=1;
break;
}
flag=0; //结束扫描 防止穿透当前窗口
}
temp_windows_stack=temp_windows_stack->up; //往前扫描
}else
{
ui->windows=temp_windows_stack->next; //如果是最后端的窗口 则取出这个节点后入口就变下一个节点了
ui->windows->up=NULL; //倒数第二变最后端 在走就没了 所以要清空指针
flag=0; //一个窗口都没有 直接结束循环
}
temp_windows_stack->next=NULL; //取出的节点要放在最前端 所以 无法再往前 清空往前的指针
temp_windows_stack->up=ui->last_windows; //上一个指针就是原来的最后一个
ui->last_windows->next=temp_windows_stack; //原来的最后一个指向现在的最后一个
ui->last_windows=temp_windows_stack; //更新ui中的最后一个的入口
ui->refresh_ui_flag=1; //发生了变化 刷新ui的显示
}
//检查标中窗口的什么位置
switch(hit_flag)
{
case CLOSE:
Close_Windows_Stack(ui,temp_windows_stack);
ui->refresh_ui_flag=1; //发生了变化 刷新ui的显示
break;
case BAR:
if(ui->window_move_lock==0)
{
ui->window_move_x=t_x;
ui->window_move_y=t_y;
}
Set_Windows_XY_BY_ACC(temp_windows_stack->window,t_x-ui->window_move_x,t_y-ui->window_move_y);
ui->window_move_x=t_x;
ui->window_move_y=t_y;
ui->refresh_ui_flag=1; //发生了变化 刷新ui的显示
break;
case BODY:
//ui->background=temp_windows_stack->window->background;
//ui->refresh_ui_flag=1;
break;
}
flag=0; //结束扫描 防止穿透当前窗口
}while(flag);
}
temp_windows_stack=temp_windows_stack->up; //往前扫描
}else
{
flag=0; //一个窗口都没有 直接结束循环
temp_window=ui->moveed_windwos;
temp_window->x=t_x-ui->move_x;
temp_window->y=t_y-ui->move_y;
ui->refresh_ui_flag=1;
//发生了变化 刷新ui的显示
}
}while(flag);
ui->window_move_lock=1;
}
}else
{
ui->window_move_lock=0;
if(ui->First_click_flag==1)
{
ui->First_click_flag=0;
}
if(ui->moveed_windwos!=NULL)
{
ui->moveed_windwos=NULL;
}
}
//display
if(ui->refresh_ui_flag==1)
+8 -4
View File
@@ -18,6 +18,8 @@ typedef struct
uint16_t high;
COLOR_16 background;
char title[16];
}window;
@@ -38,11 +40,13 @@ typedef struct
uint16_t high;
windows_stack *windows;
windows_stack *last_windows;
//touch_device *touch; //Ò»¸öUI¹ÒÔØÒ»¸ö´¥¿ØÉ豸
int window_move_x;
int window_move_y;
window *moveed_windwos;//¼Ç¼ÕýÔÚ±»Òƶ¯µÄ´°¿Ú
int move_x;
int move_y;
uint8_t move_lock:1;
uint8_t First_click_flag:1;
uint8_t refresh_ui_flag:1;
uint8_t window_move_lock:1;
}UI;
void Inteface_SetCursor(uint16_t Xpos, uint16_t Ypos);