野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17057|回复: 11

emwin text更新问题

[复制链接]
发表于 2020-3-3 15:39:15 | 显示全部楼层 |阅读模式
2火花
想完成 计时功能,数组输出正常,但是text 每次更新都是重叠而不是覆盖,不知道哪错了求大神帮下小弟
微信截图_20200303153638.png

微信图片_20200303152817.jpg
//主任务
void MainTask(void)
{
        GUI_Init();
         
        //        /* 窗口自动使用存储设备 */
        WM_SetCreateFlags(WM_CF_MEMDEV);

        TextCreate();
        GUI_Exec();
       while(1)
{
                 hWin = WM_GetDesktopWindow();
                 hItem = WM_GetDialogItem(hWin, ID_TEXT_LocalTime);
                TEXT_SetText(hItem, (const char*)DisLocalTime);
               
                GUI_Exec();
}

//桌面窗口回调函数
static void _cbBkWin(WM_MESSAGE * pMsg)
{
        WM_HWIN hwin;
       
        //hwin = pMsg->hWin;
        switch(pMsg->MsgId)
        {
                case WM_PAINT:
                        hwin = WM_GetDialogItem(pMsg->hWin, ID_TEXT_LocalTime);
                        TEXT_SetText(hwin, (const char*)DisLocalTime);
                        WM_InvalidateWindow(hwin);
                        break;
               
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}

//创建text 控件
void TextCreate(void)
{
        WM_HWIN hLocalTime;
        WM_CALLBACK *pcbPrev;
       
        pcbPrev  = WM_SetCallback(WM_HBKWIN, _cbBkWin);
       
        vvv = TEXT_CreateEx(0,0,200,64,WM_HBKWIN,WM_CF_SHOW,0,ID_TEXT_LocalTime,(const char*)DisLocalTime);
        TEXT_SetFont(vvv, GUI_FONT_24_1);
        TEXT_SetTextColor(vvv,GUI_WHITE);
}

最佳答案

查看完整内容

对了,貌似还有个地方,无效化函数WM_InvalidateWindow是用来做重绘的,在调用它之后,被无效化的窗口会收到WM_PAINT消息,就会开始重绘自身。这里你无效化的是text控件,但是实际上需要无效化的应该是桌面窗口。 你可以看看WM_Redraw.c和WM_Sample.c这两个官方例程,都有涉及到桌面窗口的重绘。
回复

使用道具 举报

发表于 2020-3-3 15:39:16 | 显示全部楼层
对了,貌似还有个地方,无效化函数WM_InvalidateWindow是用来做重绘的,在调用它之后,被无效化的窗口会收到WM_PAINT消息,就会开始重绘自身。这里你无效化的是text控件,但是实际上需要无效化的应该是桌面窗口。
你可以看看WM_Redraw.c和WM_Sample.c这两个官方例程,都有涉及到桌面窗口的重绘。
回复

使用道具 举报

 楼主| 发表于 2020-3-3 16:17:14 | 显示全部楼层
来人帮帮忙
回复

使用道具 举报

发表于 2020-3-3 17:09:01 | 显示全部楼层
在更新之前需要先清掉上一次的值,桌面回调函数里没有清。其实如果在桌面窗口没有其他特殊需求的话,直接在GUI_Init之后调用WM_SetDesktopColor可以启用默认的桌面窗口回调函数,这样就可以自动重绘了,然后text值直接在循环里更新。
回复

使用道具 举报

 楼主| 发表于 2020-3-4 08:48:20 | 显示全部楼层
ZZZ_XXJ 发表于 2020-3-3 17:09
在更新之前需要先清掉上一次的值,桌面回调函数里没有清。其实如果在桌面窗口没有其他特殊需求的话,直接在 ...

谢谢!终于找到该怎么弄了
回复

使用道具 举报

发表于 2020-3-4 08:56:17 | 显示全部楼层
ZZZ_XXJ 发表于 2020-3-3 15:39
对了,貌似还有个地方,无效化函数WM_InvalidateWindow是用来做重绘的,在调用它之后,被无效化的窗口会收 ...

抱歉哈,这一句我讲的有个小错误,你在回调函数里无效化的确实是桌面窗口。不过这个不是重点,重点是桌面窗口的重绘没弄好。
回复

使用道具 举报

 楼主| 发表于 2020-3-4 11:04:42 | 显示全部楼层
ZZZ_XXJ 发表于 2020-3-3 17:09
在更新之前需要先清掉上一次的值,桌面回调函数里没有清。其实如果在桌面窗口没有其他特殊需求的话,直接在 ...

不好意思还有点问题,我之前是通过guibuilder 做的,把text放在新的windows里然后放在桌面窗口上,那个更新很平滑看不出很明显的刷新,为什么这次的更新每次中间会很明显的闪烁一下,是我哪里还不对吗,现在我桌面回调用默认的、 自定义的都试了,发现都会很明显闪一下
回复

使用道具 举报

发表于 2020-3-4 14:26:45 | 显示全部楼层
opsd999 发表于 2020-3-4 11:04
不好意思还有点问题,我之前是通过guibuilder 做的,把text放在新的windows里然后放在桌面窗口上,那个更 ...

估计是桌面窗口没开自动使用内存设备,然后while循环里更新text的速度太快了。gui builder生成的没问题是因为text的父窗口是window控件而不是桌面窗口。
桌面窗口有点特殊,在GUI_Init之后调用WM_SetCreateFlags函数是不能让桌面窗口开启内存设备的,必须在GUI_Init之前调用才行。
回复

使用道具 举报

 楼主| 发表于 2020-3-4 16:17:10 | 显示全部楼层
ZZZ_XXJ 发表于 2020-3-4 14:26
估计是桌面窗口没开自动使用内存设备,然后while循环里更新text的速度太快了。gui builder生成的没问题是 ...

确实是您说的桌面未开自动使用内存,开后 时钟不闪烁了,就是全屏重叠显示了,不是只让桌面窗口自动使用内存就够了吗,需要 像那些例程一样,再创建一块块的自定义内存设备吗?应该不会是我分配的内存不够大导致的吧,新手问题比较多抱歉 微信图片_20200304161446.jpg
回复

使用道具 举报

发表于 2020-3-4 17:10:01 | 显示全部楼层
opsd999 发表于 2020-3-4 16:17
确实是您说的桌面未开自动使用内存,开后 时钟不闪烁了,就是全屏重叠显示了,不是只让桌面窗口自动使用 ...

显示重叠一般就是窗口的重绘没弄好,内存设备在这里面主要是防闪烁。
回复

使用道具 举报

 楼主| 发表于 2020-3-4 17:30:33 | 显示全部楼层
ZZZ_XXJ 发表于 2020-3-4 17:10
显示重叠一般就是窗口的重绘没弄好,内存设备在这里面主要是防闪烁。

十分感谢,已经正常显示!
回复

使用道具 举报

发表于 2020-7-18 23:06:04 | 显示全部楼层
您好,我在使用EMWIN的时候也遇到了TEXT数据更新闪烁的问题,我的字符串文本的长度是变化的,在由长字符串变到短字符串显示时,会出现上一次的字符串有一部分残留在界面上的情况。我采用局部清屏后再写入数据,但是能看到清屏的抖动。我没有用所谓的窗口,我想请教下,窗口的使用是不是可以解决这种问题或者你们一般是这样处理这种字符串变长的情况的?
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-19 16:13 , Processed in 0.036727 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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