硬汉嵌入式论坛

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

[emWin] WM_InvalidateRect区域无效化疑问

[复制链接]

31

主题

55

回帖

148

积分

初级会员

积分
148
发表于 2021-8-11 16:09:18 | 显示全部楼层 |阅读模式
调用WM_InvalidateRect对窗口中两个区域同时无效化,例如:代码中是这样实现做的:
GUI_RECT TECT;
GUI_RECT TECT1;

TECT.x0 = s_graphPos0;
TECT.y0 = 81;
TECT.x1 = s_graphPos0 + 20;
TECT.y1 = 170 - 1;
WM_InvalidateRect(hgraph, &TECT);


TECT1.x0 = s_graphPos0;
TECT1.y0 = 201;
TECT1.x1 = s_graphPos0 + 20;
TECT1.y1 = 340 - 1;
WM_InvalidateRect(hgraph, &TECT1);


但是实际中却是 两则的结合呢?
如图片中 计划无效化区域1跟区域3,
连续调用WM_InvalidateRect对区域1 区域3无效化, 怎么区域2也被无效化了呢?





微信图片_20210811160701.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-8-12 09:31:25 | 显示全部楼层
emWin的重绘是基于裁剪机制,你这种的有可能是把区域1,2,3算成一个了
回复

使用道具 举报

31

主题

55

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2021-8-12 18:20:59 | 显示全部楼层
eric2013 发表于 2021-8-12 09:31
emWin的重绘是基于裁剪机制,你这种的有可能是把区域1,2,3算成一个了

有道理, 我现在把两个区域做成两个窗口,暂时可以达到想要的效果了。
回复

使用道具 举报

3

主题

423

回帖

432

积分

高级会员

积分
432
发表于 2021-8-16 13:11:03 | 显示全部楼层
emWin文档有说明的,它采用的是无效区域合并算法,即“每次invalidate只是把之前的无效区域扩大或者不变”而已。
这是为了简化重绘算法并且节省内存。否者需要一个无效区域列表才能记录所有无效区域碎片。
回复

使用道具 举报

31

主题

55

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2021-8-19 15:23:09 | 显示全部楼层
glory 发表于 2021-8-16 13:11
emWin文档有说明的,它采用的是无效区域合并算法,即“每次invalidate只是把之前的无效区域扩大或者不变” ...

多谢答疑
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 00:39 , Processed in 0.283181 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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