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)这样的函数.(不过这种情况下,

窗口覆盖等造成的刷新还是要闪一下,所以不是彻底的解决方法)

本文标签: 背景函数调用消息区域