admin管理员组文章数量:1531375
2024年6月12日发(作者:)
vc中常用到的几个内存分配函数
避免闪烁的方法(OnEraseBkgnd)
OnPaint()函数的作用原理 转
2010-05-27 13:16:47| 分类: MFC基础 | 标签: |字号大中小 订阅
WM_PAINT是窗口每次重绘都会产生的一个消息。
OnPaint是对这个消息的反应函数
mfc 的 CWnd::OnPaint 没做什么,只是丢给系统处理。
一 :
先执行OnEraseBkgnd,擦除背景(如果想自绘控件,这个函数直接return TRUE就
可以了,这样就不会擦除背景,不会闪)
OnEraseBkGnd与OnPaint的区别与联系
在OnEraseBkGnd中,如果你不调用原来缺省的OnEraseBkGnd只是重画背景则不会
有闪烁.而在OnPaint里面,由于它隐含的调用了OnEraseBkGnd,而你又没有处理
OnEraseBkGnd 函数,这时就和窗口缺省的背景刷相关了.缺省的 OnEraseBkGnd操作使
用窗口的缺省背景刷刷新背景(一般情况下是白刷),而随后你又自己重画背景造成屏幕闪动.
OnEraseBkGnd不是每次都会被调用的.如果你调用Invalidate的时候参数为TRUE,
那么在OnPaint里面隐含调用BeginPaint的时候就产生WM_ERASEBKGND消息,如果
参数是FALSE,则不会重刷背景.
ZYP解释:void Invalidate( BOOL bErase = TRUE ); 该函数的作用是使整个窗口客
户区无效。窗口的客户区无效意味着需要重绘,参数bErase为TRUE时,重绘区域内的
背景将被重绘即擦除,否则,背景将保持不变。调用Invalidate等函数后窗口不会立即重
绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后
才能被处理。
OnPaint里面会调用BeginPaint函数自动设置显示设备内容的剪切区域而排除任何
更新区域外的区域更新区域。如果更新区域被标记为可擦除的,BeginPaint发送一个
WM_ERASEBKGND消息给窗口。WM_ERASEBKGND消息的响应函数既是
OnEraseBkGnd()
所以解决方法有三个半:
1.用OnEraseBkGnd实现,不要调用原来的OnEraseBkGnd函数.
2.用OnPaint实现,同时重载OnEraseBkGnd,其中直接返回.
3.用OnPaint实现,创建窗口时设置背景刷为空
4.用OnPaint实现,但是要求刷新时用Invalidate(FALSE)这样的函数.(不过这种情况下,
窗口覆盖等造成的刷新还是要闪一下,所以不是彻底的解决方法)
版权声明:本文标题:ondraw函数的运用 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1718200559a652898.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论