windows重绘机制原理

92 篇文章 6 订阅
90 篇文章 8 订阅
一.Windows程序中的绘制和更新
与DOS环境比较,Windows中的应用程序在处理文字和图形绘制时有以下区别:
1.只能在窗口的客户区域绘制文字和图形
2.在窗口上绘制的内容不一定能够保留到程序下一次有意地改写时。
比如,当您的窗口被其他窗口覆盖,Windows不会保存您的窗口,当其他窗口移开时,Windows会要求你自己重新绘制窗口。

二.WM_PAINT消息
Windows通过发送WM_PAINT消息通知窗口其部分显示区域需要绘制。Windows给窗口发送WM_PAINT的时机也就是窗口需要进行绘制

的时机:
1.大多数程序在进入消息循环之前,通过调用UpdateWindow来给窗口过程发送一个WM_PAINT消息。
2.在以下几种情况,Windows给窗口过程发送WM_PAINT消息:
·窗口中先前被隐藏的部分变得可见
·使用者改变窗口大小(设置了CS_HREDRAW和CS_VREDRAW)
·使用ScrollWindow或ScrollDC滚动显示区的一部分
·使用InvalidateRect或InvalidateRgn可以产生WM_PATIN
在以下情况,Windows尝试保留窗口内容,在以后需要的时候恢复。如果失败,则产生WM_PAINT消息:
·Windows擦除了覆盖部分窗口的对话框或消息框
·菜单弹出,然后释放
·显示工具提示消息
3.在下列情况,Windows总是保存被覆盖的显示区域,然后恢复他们:
·鼠标穿越显示区域
·图标拖过显示区域

三.程序组织形式
程序应当仅在处理WM_PAINT消息时在显示区域进行绘制。如果程序需要在其他时间更新显示区域,可以强制Windows产生一个

WM_PAINT消息。

四.有效区域和无效区域
(一)概述
显示区中需要重新绘制的区域叫做“无效区域”,包含“无效区域”所需的最小矩形叫做“无效矩形”。Windows内部为每个窗口

保存一个“绘图信息结构”,用来保存窗口的无效区域、无效矩形以及一些其他信息。
当窗口存在“无效区域”时,Windows就会给窗体发送WM_PAINT消息。当一个WM_PAINT在消息队列中还未处理,又有新的无效区域

增加时,Windows只是修改窗口的“绘图信息结构”,把新的无效区域合并进去,并不给窗口发送新的WM_PAINT;同样,如果一个

消息队列中的WM_PAINT消息还未处理,窗口中不存在无效区域了(比如调用了ValidateRect删除了所有无效区域),那么

WM_PAINT消息将会被移出消息队列。
总之,消息队列中至多有一个WM_PAINT消息。这样设计的目的是尽量减少重绘的次数。

(二)增加和删除无效区域
1.增加无效区域
·Windows会自动管理窗口的无效区域。
·可以通过调用InvalidateRect来将某个区域合并到窗体的无效区域中
·调用函数UpdateWindow会使整个客户区无效
2.删除无效区域
无效区域不会自动消失,除非调用某些可以删除无效区域的函数
·处理WM_PAINT时,BeginPaint函数会使整个客户区有效(删除所有无效区域)
·ValidateRect函数可以使指定区域变得有效
3.获取无效区域信息
·在处理WM_PAINT时
·调用GetUpdateRect来获取无效区域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值