硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7484|回复: 10
收起左侧

[emWin] 结束对话框 留下的残影消除不掉

[复制链接]

12

主题

46

回帖

82

积分

初级会员

积分
82
发表于 2013-12-7 16:33:11 | 显示全部楼层 |阅读模式
a.jpg

b.jpg

窗口多了总是遇到这类问题,用回调函数刷新也弄不掉这个残留下来残影,有什么好点的方法处理这些界面的 显示呀。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2013-12-7 16:38:05 | 显示全部楼层
桌面窗口做回调函数了没有,感觉你这种情况是桌面窗口没有做回调
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
 楼主| 发表于 2013-12-7 16:48:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:桌面窗口做回调函数了没有,感觉你这种情况是桌面窗口没有做回调 (2013-12-07 16:38)
每种小工具我都是用的单独的窗口,桌面用绘制用垂直颜色梯度填充的圆角矩形。都用回调函数写的,每次数据更新 就用了个标志位来确定数据是否更新了,更新了就初始一下hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);,都是回调函数写的,把我搞晕了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2013-12-7 17:07:01 | 显示全部楼层
把你的函数框架贴出来,我想看看你的桌面回调函数是怎么写的,具体功能不用写
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
 楼主| 发表于 2013-12-7 17:26:35 | 显示全部楼层
#include "DIALOG.h"
#include "data_temp.h"
temp next;
extern const GUI_FONT GUI_FontHZ_Song_16;
/**********************************************************************
重绘背景色
**********************************************************************/
void Back(WM_MESSAGE * pMsg) {
  switch (pMsg->MsgId) {
  case WM_PAINT:
GUI_DrawGradientRoundedV(0,  0, 399,  239, 0, 0xff5555, 0x880000);//刷新一下
   break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}
void data_init(void)
{

GUI_DrawGradientRoundedV(0,  0, 399,  239, 0, 0xff5555, 0x880000);//刷新一下
GUI_SetTextMode(GUI_TEXTMODE_TRANS);
GUI_SetFont(&GUI_Font8x16);
       if((next.page>=0) && (next.page<=9))
   {
    GUI_DispDecAt(next.page,322+16,2,1);
   }
else
   if((next.page>=10) && (next.page<=99))
   {
    GUI_DispDecAt(next.page,322+8,2,2);
   }
else
    GUI_DispDecAt(next.page,322,2,3);
   
  
    GUI_DispStringAt(&quot0=",333,30);
GUI_DispHexAt(next.P0[next.page-data_min],333+24,30,2); //在指定位置显示16进制文件
GUI_DispStringAt(&quot1=",333,30+16);
GUI_DispHexAt(next.P1[next.page-data_min],333+24,30+16,2);
GUI_DispStringAt(&quot1=",333,30+32);
GUI_DispHexAt(next.P2[next.page-data_min],333+24,30+32,2);
GUI_DispStringAt(&quot1=",333,30+48);
GUI_DispHexAt(next.P3[next.page-data_min],333+24,30+48,2);
GUI_SetFont(&GUI_FontHZ_Song_16);
  GUI_DispStringAt("页",322+24,2);
//CHECKBOX_Init();
}

void page_init(WM_MESSAGE * pMsg) {
  int NCode;
  int Id;
  WM_HWIN hItem;
  switch (pMsg->MsgId) {
  case WM_PAINT:
  data_init();
   break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

// CHECKBOX_Init();
/*****************************************************************************************************
页面切换,参数x
x=0时页面加一
x=1时页面减一
x!=1andx!=2的时候初始化显示
******************************************************************************************************/
void swit_page(char x)
{
GUI_SetTextMode(GUI_TM_TRANS);//显示透明文本
if(x==0)
{
  next.page++;
  if(next.page>data_max)
  next.page=data_min;
}
else
{
if(x==1)
{
next.page--;
if(next.page<=0)
{
  next.page=data_max;
}
}
}  

WM_SetCallback(WM_HBKWIN, &page_init);
//data_init();
next.flag=2; //换页的时候不更新数据
next.SPINBOX_flag=2;//换页的时候读取一次数据
}
/*****************************************************************************************************
指定位数据转换
x指定io口
z的值范围
y=0 0x00 0x01
y=1 0x00 0x02
y=2 0x00 0x04
y=3 0x00 0x08
y=4 0x00 0x10
y=5 0x00 0x20
y=6 0x00 0x40
y=7 0x00 0x80
*****************************************************************************************************/
void bit_Trans(unsigned char *x,unsigned char y)
{
  
unsigned char z;
if(next.flag!=2) //换页的时候不更新数据
{
  z=*x&1<<y; //x&0x01  x&0x02  x&0x04  x&0x08
  if(z>0)
  {
   *x=*x-(1<<y);
  }
else
  *x=*x+(1<<y);
}
}
/*****************************************************************************************************
数据保存保存P0,P1,P2,P3的IO口变化
参数一:哪个IO口
x=0时P0口
X=1时P1口
x=2时P2口
x=3时P3口
参数二:IO口的位
y=0时1111 1110 最低位
y=1时1111 1101
y=2时1111 1011
.
.
.
y=8时0111 1111
函数功能:每进入一次这个函数,指定的位取反
******************************************************************************************************/
void IO_var(unsigned char x,unsigned char y)
{
  switch(x)
  {
  case 0:
    //next.P0[next.page-data_max]=0;
    bit_Trans(&next.P0[next.page-data_min] , y); //P0口任意位取反   
  break;
  case 1:
    bit_Trans(&next.P1[next.page-data_min] , y);
  break;
  case 2:
    bit_Trans(&next.P2[next.page-data_min] , y);
  break;

  case 3:
    bit_Trans(&next.P3[next.page-data_min] , y);
  break;
  
  }
WM_SetCallback(WM_HBKWIN, &page_init);
//data_init(); //读取页面显示,io口状态
  
}

/*********************************************************************************************************
时间临时保存
参数一:小工具句柄
参数二:指向要保存的时间数组
返回值为设置spinbox小工具的值说明保存成功
*********************************************************************************************************
/*
unsigned char Divided[data_max];//分
unsigned char Seconds[data_max];//秒
unsigned char VellusHair[data_max];//十毫秒
*/
unsigned char Time_prese(WM_HWIN  hobj,unsigned char *Time)
{
         *Time=(unsigned char)SPINBOX_GetValue(hobj);
   return *Time;
}

/*********************************************************************************************************
每当换页的时候读取缓存区数据一次数据并显示
参数一:小工具句柄
参数二:指向要保存的时间数组*********************************************************************************************************
/*
unsigned char Divided[data_max];//分
unsigned char Seconds[data_max];//秒
unsigned char VellusHair[data_max];//十毫秒
*/
void read_Time(WM_HWIN  hobj,unsigned char *Time)
{
       SPINBOX_SetValue(hobj ,*Time);
}
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
 楼主| 发表于 2013-12-7 17:30:28 | 显示全部楼层

回 eric2013 的帖子

eric2013:桌面窗口做回调函数了没有,感觉你这种情况是桌面窗口没有做回调 (2013-12-07 16:38)
void page_init(WM_MESSAGE * pMsg)就是 桌面的回调
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2013-12-7 17:36:06 | 显示全部楼层
桌面窗口的回调也做了WM_SetCallback(WM_HBKWIN, &page_init);,你是不是每次点开好几个窗口
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
 楼主| 发表于 2013-12-7 22:07:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:桌面窗口的回调也做了WM_SetCallback(WM_HBKWIN, &page_init);,你是不是每次点开好几个窗口 (2013-12-07 17:36)
嗯桌面回调是WM_SetCallback(WM_HBKWIN, &page_init);,开了4个窗口,小工具用了 了40个。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107262
QQ
发表于 2013-12-8 09:39:38 | 显示全部楼层

回 qq923830375 的帖子

qq923830375:嗯桌面回调是WM_SetCallback(WM_HBKWIN, &page_init);,开了4个窗口,小工具用了 了40个。 (2013-12-07 22:07) 
用串口每隔一段时间打印下动态内存剩余,估计是动态内存不够造成的
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
 楼主| 发表于 2013-12-9 10:57:34 | 显示全部楼层

回 eric2013 的帖子

eric2013:用串口每隔一段时间打印下动态内存剩余,估计是动态内存不够造成的 (2013-12-08 09:39)
我在vc6.0上面写的,应该不存在 动态内存的 问题吧。
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
 楼主| 发表于 2013-12-9 16:42:02 | 显示全部楼层

回 qq923830375 的帖子

qq923830375:我在vc6.0上面写的,应该不存在 动态内存的 问题吧。 (2013-12-09 10:57)
如果 窗口不透明他就会把残留下来的压在下面就看不到了,弄成透明的 就看得到了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-23 14:18 , Processed in 0.249555 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表