硬汉嵌入式论坛

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

[emWin] 请教 emwin memdev 问题

[复制链接]

2

主题

11

回帖

36

积分

新手上路

积分
36
发表于 2018-7-16 15:10:02 | 显示全部楼层 |阅读模式
本帖最后由 袁亮 于 2018-7-16 16:25 编辑

问题背景是这样的:
1、要在一个背景颜色会不断变化的区域上,画一个白色圆环。
2、这个背景变化区域是某个window窗口的一部分。
2、为了防止闪烁,这个变化背景是一个text框,在创建后,通过调用 WM_EnableMemdev(hItem); 使用了memdev,设置背景颜色,实现不断变化。
3、这个前景的白色圆环,实现思路是创建一个窗口,回调函数中 WM_CREATE 里面创建一个 memdev,
     在这个memdev中,先设置背景颜色,与底部大背景颜色相同,
     之后绘制前景圆环。
4、在 WM_PAINT 中,重新设置背景颜色与大背景相同,
     再重新绘制圆环。
5、把这个圆环窗口放置在最前端。

出现的问题是:WM_PAINT 消息中的代码,没有任何作用。

微信截图_20180716150759.png
现在大背景颜色变化,是正常的,但前端小窗口,始终是 WM_CREATE 消息中的代码效果,WM_PAINT 消息中的代码没有用。黄色是大背景目前的颜色,圆环的背景却始终是绿色,没有更新成黄色,就是说 WM_PAINT 消息中前 7 行代码没起作用。
微信截图_20180716151336.png
WM_PAINT 消息中的代码,肯定被执行到了,我用断点跟踪过。
挺急,卡了好久了,希望各位帮忙。





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-16 15:35:20 | 显示全部楼层
先确认一个问题,你的GUIConf.C文件中开的动态内存够大不。

如果没问题,把你这个窗口的完整测试代码贴出来,帮你修改下。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 15:39:59 | 显示全部楼层
本帖最后由 袁亮 于 2018-7-16 15:43 编辑

配置了 30K 的RAM
应该是够用了,因为创建阶段没问题,
而且我发现如果全局使用 memdev,WM_SetCreateFlags(WM_CF_MEMDEV);
更节省内存。

如果非全局使用 memdev,RAM 反而要配置大些。
我这个应用,为了防抖,取消了全局 memdev 设置。
ram 也由原来的 20K 配置成了 30K。
整体代码太大了,
我精简,重新写个文件。
微信截图_20180716154209.png


回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 15:44:50 | 显示全部楼层
整个工程太大了,现在被这个问题搞得头疼的炸,重新建一个工程
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-16 15:50:39 | 显示全部楼层
袁亮 发表于 2018-7-16 15:39
配置了 30K 的RAM
应该是够用了,因为创建阶段没问题,
而且我发现如果全局使用 memdev,WM_SetCreateFla ...

30K太小了,比你创建的77*77的,如果颜色格式RG565,就得需要77*77*2 = 11858字节。

推荐你这种2D绘制,直接全部放在WM_PAINT即可,无需使用到存储设备。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 15:54:13 | 显示全部楼层
本帖最后由 袁亮 于 2018-7-16 15:56 编辑

这样显示的话,会不会闪烁啊?
我原来不使用 memdev 的时候,就是有闪烁问题。103vet6,一共64K内存。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-16 15:55:52 | 显示全部楼层
袁亮 发表于 2018-7-16 15:54
这样显示的话,会不会闪烁啊?
我原来不使用 memdev 的时候,就是有闪烁问题。

不会啊,你在GUI_Init函数后调用了WM_SetCreateFlags(WM_CF_MEMDEV); 即可
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 15:57:04 | 显示全部楼层
ok,我试试。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 16:33:49 | 显示全部楼层
本帖最后由 袁亮 于 2018-7-16 16:37 编辑

继续请教老大,如果一个window,有子text文本框,
如何在这个文本框前端绘制啊?
            GUI_AA_DrawRoundedRect(149, 23, 209, 83, 30);
我这行代码,似乎被文本框,盖住了。
这个window用以下代码创建:
    //  创建窗口
    hWin00_Base     =   GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);

在回调函数的 WM_INIT_DIALOG 消息中,初始化了不少东西。

如果在 WM_PAINT 消息中,调用函数绘制二维图形,
如何让这个二维图形,显示在所有子部件的最前端?
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 16:44:52 | 显示全部楼层
的确是被 text 文本框盖住了,现在有办法临时规避,
不要这个文本框了,直接改整体背景颜色。

但这个问题还是想请教老大。
如何在一个窗口的子部件前端绘制二维图形,不被这个部件盖住。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-16 16:48:24 | 显示全部楼层
WM_PAINT 消息中,不能使用 WM_SelectWindow 函数,也就无法选中这个位于最前端的部件。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-17 02:25:44 | 显示全部楼层
袁亮 发表于 2018-7-16 16:33
继续请教老大,如果一个window,有子text文本框,
如何在这个文本框前端绘制啊?
            GUI_AA_Dra ...

1、不使用文本控件了,也是普通的文本绘制函数,如GUI_DispStringAt
2、在WM_PIANT消息内容的最末尾绘制。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-17 10:45:41 | 显示全部楼层
感谢大哥指点,谢谢。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-18 15:08:04 | 显示全部楼层
现在碰到这样一个问题:

在 WM_PAINT 消息中:
同一个位置更新字符串内容,
            GUI_DispStringAt(strDisplay, 29, usXY);
发现始终显示第一次的内容。
用断点跟踪,发现调用 GUI_DispStringAt 前,strDisplay 字符串已经被正确更新了。

在绘图前,加上 GUI_Clear(),问题依旧。
代码哪里写的不对吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-18 16:12:42 | 显示全部楼层
袁亮 发表于 2018-7-18 15:08
现在碰到这样一个问题:

在 WM_PAINT 消息中:

你的WM_PAINT消息是否有执行,也就是你更新了字符串strDisplay 后,你的WM_PAINT消息是否得到执行。
回复

使用道具 举报

2

主题

11

回帖

36

积分

新手上路

积分
36
 楼主| 发表于 2018-7-18 16:47:23 | 显示全部楼层
本帖最后由 袁亮 于 2018-7-18 16:49 编辑

执行了,断点就在 WM_PAINT 消息中
WM_PAINT消息中调用我自己的函数,函数中在调用 GUI_DispStringAt(strDisplay, 29, usXY); 前,字符串已经更新了

我用的emwin 是5.32版本
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-18 17:10:23 | 显示全部楼层
袁亮 发表于 2018-7-18 16:47
执行了,断点就在 WM_PAINT 消息中
WM_PAINT消息中调用我自己的函数,函数中在调用 GUI_DispStringAt( ...

你得让窗口更新文本的区域才行,虽然进入了WM_PAINT消息,应该更新的不是这个区域。要完全更新,可以设置窗口无效化。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 07:32 , Processed in 0.765635 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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