硬汉嵌入式论坛

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

[emWin] stemwin5.22 刷屏不干净

[复制链接]

4

主题

12

回帖

24

积分

新手上路

积分
24
发表于 2018-8-1 12:01:34 | 显示全部楼层 |阅读模式
用的是ucosiii,emwin5.22,目前的问题是刷屏的时候,当前的控件部分会保留上一屏控件的一点内容,请指教一下是什么问题。如图上所示,左边的小键盘部分是一个图片,刷起来是没有问题的。右边是一个窗口,可以看到listview下部分和按钮上部分会有一些显示不完全的图片,那就是上一屏的按钮控件。这种情况也不是经常出现,但是会偶尔就有一个地方刷的不干净。
IMG_0066.JPG


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-1 12:05:37 | 显示全部楼层
是否方便把你这里这几个按钮的绘制改成emWin自带的按钮,不做任何修饰,就用默认的,看看是否有问题。

QQ截图20180801120330.png

回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-1 13:07:44 | 显示全部楼层
eric2013 发表于 2018-8-1 12:05
是否方便把你这里这几个按钮的绘制改成emWin自带的按钮,不做任何修饰,就用默认的,看看是否有问题。


...

应该不是这个的问题吧,因为还有其他情况,如图片中的红框所示,是这个listview的网格没有显示完全,上一个界面的这部分是空白 IMG_0065_副本.jpg
还有下图中就是另一个界面,红框里面还保留着上一界面的frame的一部分
IMG_0064_副本.jpg
是不是重绘方面的问题呢?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-1 13:32:27 | 显示全部楼层
这样的目的是想看看是不是你的程序模板有问题
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-1 16:03:32 | 显示全部楼层
eric2013 发表于 2018-8-1 13:32
这样的目的是想看看是不是你的程序模板有问题

改了之后目前还没有出现,但是因为之前出现的也不频繁,所以也不确定是不是这样就好了。
如果是这样刷屏就没问题的话,那么会是哪儿的问题呢?
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-1 16:35:07 | 显示全部楼层
本帖最后由 赵静 于 2018-8-1 16:41 编辑
eric2013 发表于 2018-8-1 13:32
这样的目的是想看看是不是你的程序模板有问题

还是出现了,我就是把按钮的图片都去掉了,然后设了一个背景色。
出现的情况类似于第二条回复的第二个照片,就是frame的下面部分没有刷完。
还能是哪方面的问题呢?
                ModeFun();                                                                //创建frame的函数
                GUI_DrawBitmap(&bmKEYPAD_BMP,0,40);                        //左半部分的图片
                GUI_Exec();
                GUI_X_ExecIdle();
                bsp_DelayUS(1000000);
                GUI_SetBkColor(GUI_USER);
                GUI_SetColor(GUI_USER);   
                GUI_FillRoundedRect(0,40,310,272,10);                //左半部分画矩形
                GUI_EndDialog(hModeFrame, 0);                                                //关闭frame
                GUI_FillRoundedRect(255,28,460,170,10);       
                GUI_Exec();
                GUI_X_ExecIdle();       
                bsp_DelayUS(1000000);       

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-3 00:19:09 | 显示全部楼层
赵静 发表于 2018-8-1 16:03
改了之后目前还没有出现,但是因为之前出现的也不频繁,所以也不确定是不是这样就好了。
如果是这样刷屏 ...

不好意思楼主,昨天忘了你的问题还没有回复。

你这里的这些函数是在哪里调用的,是在回答函数里面吗,如果是的话,2D函数的绘制一定要在你创建的FrameWin框架窗口的回调函数WM_PAINT里面调用。

回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-3 12:03:36 | 显示全部楼层
eric2013 发表于 2018-8-3 00:19
不好意思楼主,昨天忘了你的问题还没有回复。

你这里的这些函数是在哪里调用的,是在回答函数里面吗, ...

程序是这样的显示一个主界面,然后在主界面放按钮以及会画图片啥的。
因为出现花屏的问题了,为了测试就是在while循环里面做了下面的测试。
现在基本确定只有控件的地方会有这种情况,主界面的图片、GUI_DispStringAt写的字以及画矩形什么的都不会有问题
void MainInterfaceFun(WM_MESSAGE* pMsg)
{       
        WM_SetCallback(WM_HBKWIN,_cbBkWindow);
        _MainInterface(); //桌面按钮
        while(1)
        {
                ModeFun();                                                               
                GUI_DrawBitmap(&bmKEYPAD_BMP,0,40);                       
                GUI_Exec();
                GUI_X_ExecIdle();
                bsp_DelayUS(1000000);
                GUI_SetBkColor(GUI_USER);
                GUI_SetColor(GUI_USER);   
                GUI_FillRoundedRect(0,40,310,272,10);               
                GUI_EndDialog(hModeFrame, 0);                                       
                GUI_Exec();
                GUI_X_ExecIdle();       
                bsp_DelayUS(1000000);       

     }


static void _cbBkWindow(WM_MESSAGE* pMsg)
{
        WM_HWIN         hWin;
        WM_KEY_INFO* cInfo1;
        WM_PID_STATE_CHANGED_INFO* cInfo;
       hWin = pMsg->hWin;                                                                                                                 
        switch (pMsg->MsgId)
        {

                case WM_PAINT:
                        GUI_SetBkColor(GUI_WHITE);
                        GUI_Clear();
                break;

               case WM_NOTIFY_PARENT:
                Id = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;        
                switch (Id)
                {       


                }
                break;
                default:
                        WM_DefaultProc(pMsg);
               break;

      }



回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-3 14:10:00 | 显示全部楼层
eric2013 发表于 2018-8-3 00:19
不好意思楼主,昨天忘了你的问题还没有回复。

你这里的这些函数是在哪里调用的,是在回答函数里面吗, ...

有没有可能是重绘的过程中被什么打断了呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-3 14:15:43 | 显示全部楼层
赵静 发表于 2018-8-3 14:10
有没有可能是重绘的过程中被什么打断了呢?

你当前的实现架构欠妥,现在这么做
GUI_DrawBitmap(&bmKEYPAD_BMP,0,40);   
GUI_SetBkColor(GUI_USER);
GUI_SetColor(GUI_USER);   
GUI_FillRoundedRect(0,40,310,272,10);   
要放在_cbBkWindow里面的WM_PAINT消息里面

而你的while大循环里面仅需要一个GUI_Delay即可,调用了它就等于调用了
GUI_Exec();
GUI_X_ExecIdle();
bsp_DelayUS(1000000);


回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-3 14:41:26 | 显示全部楼层
本帖最后由 赵静 于 2018-8-3 14:45 编辑
eric2013 发表于 2018-8-3 14:15
你当前的实现架构欠妥,现在这么做
GUI_DrawBitmap(&bmKEYPAD_BMP,0,40);   
GUI_SetBkColor(GUI_USER ...

我把画2D图形的东西都去掉了,只在while里面进行frame的创建和关闭,但是如果用GUI_Delay替代另外三个语句的话程序运行会有问题。于是又改回那三条语句了。
这样改了之后刷屏还是会出现上一屏的残留。
是这样的:这只是我做的一个测试,实际应用时,while里面并没有画东西。实际上我是在主界面用ModeFun()创建了一个Modeframe,然后又在Modeframe上创建了一个DetailFrame;
现在如果在这两个界面之间切换的话,就会出现刷屏残留的情况。每次切换的时候都会先把当前的frame关闭,再创建新的。

                        case Detail_ID_BACK: //返回按键
                        switch(NCode)
                        {
                                case WM_NOTIFICATION_RELEASED:
                                GUI_EndDialog(hDetailFrame, 0);        //关闭当前
                                ModeFun();
                                break;
                        }
                        break;是不是重绘方面有什么不合适的?




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-3 15:12:36 | 显示全部楼层
赵静 发表于 2018-8-3 14:41
我把画2D图形的东西都去掉了,只在while里面进行frame的创建和关闭,但是如果用GUI_Delay替代另外三个语 ...

手头有没有我们的板子,有的话,你在上面实现下你的这个功能,我帮你规范化,感觉你当前的实现方式不够规范,容易有莫名其妙的问题。
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-6 08:38:39 | 显示全部楼层
eric2013 发表于 2018-8-3 15:12
手头有没有我们的板子,有的话,你在上面实现下你的这个功能,我帮你规范化,感觉你当前的实现方式不够规 ...

注掉了WM_SetCreateFlags(WM_CF_MEMDEV); 感觉花屏的问题就好了,怀疑是GUI内存的问题?但是增大内存也不行,而且用GUI_ALLOC_GetNumUsedBytes();看了使用内存,挺小的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-6 09:58:12 | 显示全部楼层
赵静 发表于 2018-8-6 08:38
注掉了WM_SetCreateFlags(WM_CF_MEMDEV); 感觉花屏的问题就好了,怀疑是GUI内存的问题?但是增大内存也不 ...

你现在用的什么平台,F407,F429?  另外当前emWin的动态内存是来自哪里,内部SRAM,还是外部SRAM或者外部SDRAM
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-6 10:06:09 | 显示全部楼层
eric2013 发表于 2018-8-6 09:58
你现在用的什么平台,F407,F429?  另外当前emWin的动态内存是来自哪里,内部SRAM,还是外部SRAM或者外部 ...

用的是F103VG,用的是内部的SRAM
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-6 14:59:10 | 显示全部楼层
赵静 发表于 2018-8-6 10:06
用的是F103VG,用的是内部的SRAM

测试下,你注释掉WM_SetCreateFlags(WM_CF_MEMDEV); 后,动态更新数值,是不是有闪烁感,如果没有的话,可以先这么用着。
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2018-8-6 15:37:38 | 显示全部楼层
eric2013 发表于 2018-8-6 14:59
测试下,你注释掉WM_SetCreateFlags(WM_CF_MEMDEV); 后,动态更新数值,是不是有闪烁感,如果没有的话, ...

闪烁还是有的...
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-8-7 02:04:56 | 显示全部楼层
赵静 发表于 2018-8-6 15:37
闪烁还是有的...

看来还是没有解决根本问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 06:31 , Processed in 0.396602 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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