Invalidate/InvalidateRect/UpdateWindow/RedrawWindow区别与联系

      当窗口发生重绘时,应用程序会接收到WM_PAINT消息,从而调用ONPaint()函数,当程序中调用以下几个函数时会发送WM_PAINT消息。

在讲解之前有一点知识需要明白:即当窗口有效时,那么我们是不能对窗口进行绘制,当窗口无效时,我们才能向窗口进行重画操作。

1. void Invalidate( BOOL bErase = TRUE )

    该函数的作用是使整个窗口的客户区无效,使客户区无效就意味着对客户区需要重绘,从而对应用程序发送WM_PAINT消息。这就导致程序强制应用程序进行重画,但不一定是马上进行重画,该消息是利用PostMessage()来传递WM_PAINT消息到消息队列中,当执行到该WM_PAINT消息时,才会对客户区进行重画。

    在该函数中,参数默认为TRUE,当参数为TRUE时,重绘区域将会重画,否者,背景将保持不变。

2. BOOL InvalidateRect(HWND hWnd,//需要重绘的窗口的句柄

       LPCRECT lpRect,//需要重绘的矩形区域

                       BOOL bErase = TRUE)//重绘矩形的方式

需要更新窗口时可以利用Invalidate()重绘整个窗口,但是该函数需要的计算量很大,会导致屏幕出现闪烁,为了防止这种情况,可以使用InvalidateRect来代替Invalidate,因为这个函数仅重绘这个窗口中的小矩型,计算量小的多。

    在该函数中,最后一个参数bErase为TRUE时,会向窗体发送一个WM_ERASEBKGND消息,这个消息会使背景进行重绘,TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。

3.UpdateWindows()

    UpdateWindows(),当调用这个函数的时候,会立即让当前的窗口失效,然后对整个窗口立即进行重绘。UpdateWindows()函数调用的时候直接将OnPaint调用到目标窗口,使目标窗口立即进行重绘。当然在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。

      与Invalidate的区别: UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

4.RedrawWindow()

    则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。


注意:UpdateData()函数不是用于刷新窗口,而是用于更新数据。参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值