硬汉嵌入式论坛

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

[emWin] 对话框内的按钮控件切换焦点时对话框为何会收到重绘消息

[复制链接]

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2022-9-16 22:06:53 | 显示全部楼层 |阅读模式
创建一个对话框,对话框内只有2个按钮,实际仿真结果发现,这2个按钮控件每次切换焦点时,对话框会接收到重绘消息导致频繁重绘整个对话框窗口。按理说,按钮控件不是透明的,位置也没变动,也不存在重叠交叉区域,切换焦点而已,子控件自己重绘自身就足够,没必要发送WM_PAINT消息给父窗口重绘整个窗口,看旧版源码也没能找到答案。谁能帮忙解答下?谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106904
QQ
发表于 2022-9-17 01:13:33 | 显示全部楼层
重绘的不是整个,重绘的是按钮所在的父窗口区域
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2022-9-18 23:21:52 | 显示全部楼层
eric2013 发表于 2022-9-17 01:13
重绘的不是整个,重绘的是按钮所在的父窗口区域

这是我模拟器运行的结果,每次切换按钮焦点,恢复出厂设置对话框窗口都会接受到WM_PAINT消息,我原来也是以为只重绘按钮,但运行结果却出人意料

恢复出厂设置对话框创建资源列表

恢复出厂设置对话框创建资源列表

恢复出厂设置对话框

恢复出厂设置对话框

恢复出厂设置对话框回调函数

恢复出厂设置对话框回调函数
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106904
QQ
发表于 2022-9-19 16:27:30 | 显示全部楼层
那年的岳麓山 发表于 2022-9-18 23:21
这是我模拟器运行的结果,每次切换按钮焦点,恢复出厂设置对话框窗口都会接受到WM_PAINT消息,我原来也是 ...

进入WM_PAINT是正常的,但这个里面不是立即执行你所有绘制操作的,emWin需要根据用户在这里执行的内容,做个最小更新裁剪区。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2022-9-23 11:59:52 | 显示全部楼层
eric2013 发表于 2022-9-19 16:27
进入WM_PAINT是正常的,但这个里面不是立即执行你所有绘制操作的,emWin需要根据用户在这里执行的内容, ...

经过验证,这里的原因并非你想的那样哦。实际上一开始我就想错了,使用了非经典皮肤的按钮是带透明属性的,可以通过调用WM_GetHasTrans(hItem)传递按钮句柄,你会发现返回值是1,这也解释了为什么每次切换按钮焦点时父窗口都会收到重绘消息。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106904
QQ
发表于 2022-9-23 15:03:56 | 显示全部楼层
测试了下就是局部重绘,重绘的这部分区域。
ps:切换聚焦引起重绘确实是透明属性引起的,需要函数WM_ClrHasTrans清除掉。

image.png


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 10:51 , Processed in 0.273447 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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