硬汉嵌入式论坛

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

[emWin] 更新窗口时有屏闪

[复制链接]

268

主题

597

回帖

1401

积分

至尊会员

积分
1401
发表于 2017-5-3 10:19:00 | 显示全部楼层 |阅读模式
IMG_2116.JPG

如图,左上角白色窗口使用了存储设备进行绘制。
该窗口是单独用GUI_CreateDialogBox()再创建的一个窗口h_track。在h_track的WM_INIT_DIALOG消息里面,
调用track_display_init()创建了存储设备,源代码见后面。
然后在h_track的WM_PAINT消息里面调用track_display()用于实时显示2D轨迹。
由于是在WM_PAINT里面实时显示,然后就在主循环里面每200ms调用一次无效化h_track进行显示。
同时,调用add_track()增加一些轨迹。
现在的实际效果就是,白色框h_track会有些屏闪,而且如果在GUI_Init()之后使用WM_SetCreateFlags(WM_CF_MEMDEV);时,会闪的更厉害更明显。
不知道是不是存储设备没用好还是哪里的问题,按说,MCU驱动这个7寸屏应该是没什么压力的吧,而且还是16bit的,这个窗口大小也只有320*280.
把窗口高小成200*100时,屏闪也差不多,并没有什么变化。
这个会是些什么原因呢?


static void track_display_init(void)
{
    h_mem_track = GUI_MEMDEV_CreateEx(0,0,WIN1_H,WIN1_V,GUI_MEMDEV_HASTRANS);
    GUI_MEMDEV_Select(h_mem_track);
    GUI_SetBkColor(GUI_WHITE);
    GUI_Clear();
   
    GUI_SetFont(&GUI_Font24_ASCII);
    GUI_SetColor(GUI_BLACK);
    //GUI_SetBkColor(GUI_WHITE);
    GUI_DispStringAt("X:",10,0);
    GUI_DispStringAt("Y:",100,0);
    GUI_MEMDEV_Select(0);
}


void add_track(int x0,int y0,int x1,int y1)
{
    char coord[8];
   
    GUI_MEMDEV_Select(h_mem_track);

    GUI_SetFont(&GUI_Font24B_ASCII);
   
    GUI_SetBkColor(GUI_WHITE);
    GUI_SetColor(GUI_BLACK);
    GUI_DispStringAt("hello world",20+x1,50+y1);
   
//    GUI_SetColor(GUI_RED);
    sprintf(coord,"%d",x1);
    GUI_DispStringAt("      ",20,0);
    GUI_DispStringAt(coord,20,0);
    sprintf(coord,"%d",y1);
    GUI_DispStringAt("      ",120,0);
    GUI_DispStringAt(coord,120,0);
   
    GUI_MEMDEV_Select(0);
}

static void track_display(void)
{   
    GUI_MEMDEV_Select(0);
    GUI_MEMDEV_WriteAt(h_mem_track,WIN1_X0,WIN1_Y0);
}
源代码主要就是这3个函数了,然后就是在主循环里面

while(1)
    {
        GUI_Delay(200);        

        add_track(x0,y0,x1,y1);

        WM_InvalidateWindow(h_track);
   
        x0 = x1;
        y0 = y1;
        
        if(x1>200 || y1>200)
        {
            add_dec = 1;
        }

        if(x1<3 || y1<4)
        {
            add_dec = 0;
        }
        
        if(add_dec)
        {
            x1 -= 3;
            y1 -= 4;
        }
        else
        {
            x1 += 3;
            y1 += 4;
        }
    }
回复

使用道具 举报

4

主题

41

回帖

53

积分

初级会员

积分
53
发表于 2017-5-3 14:04:56 | 显示全部楼层
改到gui的定时器试试,另外你看下那个大桶的例子 ,是怎么实现的坐标这块,那是两个,你可以把第一个那个overview的注释掉,单看details
http://www.armbbs.cn/forum.php?mod=viewthread&tid=5596
回复

使用道具 举报

268

主题

597

回帖

1401

积分

至尊会员

积分
1401
 楼主| 发表于 2017-5-3 15:51:05 | 显示全部楼层

回 szduan 的帖子

szduan:改到gui的定时器试试,另外你看下那个大桶的例子 ,是怎么实现的坐标这块,那是两个,你可以把第一个那个overview的注释掉,单看details
http://www.armbbs.cn/forum.php?mod=viewthread&tid=5596 (2017-05-03 14:04) 
定时器应该也没法显示的
用的这种存储设备画2D库的方法就只能在WM_PAINT里面显示。
我在主循环里面调用显示都是空白的,没有内容
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 08:01 , Processed in 0.360172 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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