优化窗口移动的逻辑,显示还是有问题,需要继续优化
This commit is contained in:
+85
-55
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user