重绘窗口的消息

重绘窗口的消息
invalidate()
updatewindow()
it 

Invalidate()与 UpdateWindow( )的区别:
void Invalidate( BOOL bErase = TRUE );
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数 OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw 来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

它和 UpdateWindow( )区别在于:

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

UpdateWindow
  函数原型:

  BOOL UpdateWindow(HWND hWnd);

  描述:

  这个 UpdateWindow 函数通过发送重绘消息 WM_PAINT 给目标窗体来更新目标窗体客户区的无效区域。如果那个窗体的无效区域没有,就不发送重绘消息 WM_PAINT 了 。注意了,这个 API 函数是直接发送消息 WM_PAINT 给目标窗体的,没有进入过消息队列。

  函数参数:

  hWnd 一个要更新的窗体的句柄

  函数返回值:

  如果函数调用成功,返回值为非零值。

  如果函数调用不成功,返回值为零。

  在Windows NT/2000/XP中,我们可以使用API 函数 GetLastError 来得到扩展的错误信息。

  使用要求:

  Windows NT/2000/XP: 包括 Windows NT 3.1 及以后版本。

  Windows 95/98/Me: 包括 Windows 95 及以后版本。

  需要的头文件: 需要包含 Windows.h,在 Winuser.h 中声明了此函数。

  需要的库文件: Use User32.lib。


Invalidate()与 UpdateAllViews()有什么分别

Invalidate()是让程序重画窗口。
UpdateAllViews()是在DOC/VIEW结构中,
当一个视图的数据改变后,
通知所有视图作相应的改变,
和重画毫无关系。
Invalidate()是使窗口无效,使系统向其发WM_PAINT消息,使的程序的OnPaint被调用重画客户区。
而UpdateAllViews()是文档与视之间的联系,调用从它会使程序与此文档相关的所有视的UpdateView被调用至于是否重画以及怎么画是由各视的UpdateView来决定的。
Invalidate()是Cwnd的成员函数,与DOC-VIEW无关;
UpdateAllViews是CDocument的成员函数,具体体现DOC-VIEW的精神。
如果仅重画当前窗口用 this->Invalidate();
如果通知所有和当前文档相关的窗口重画用GetDocument()->UpdateAllViews()(在View中)或this->UpdateAllViews()(在Doc中)。
Invalidate()函数产生一条WM_PAINT消息,并送入windows消息队列中,是窗口产生重画。
而,UpdateAllViews 并不进入windows消息队列中,直接产生重画

Invalidate/RedrawWindow/UpdateWindow(zz)有什么分别
一:什么时候才会发生重绘窗口的消息?
         当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息。对窗口进行重新绘制。
二:Invalidate() -- RedrawWindow() -- UpdateWindow()三个函数有什么异同?
         Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post(寄送)就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘。
       UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。发送即不经过消息队列,直接发送到对应窗口,因此此函数可以立即更新窗口。
       RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值