MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系?

尽量说得简单些

一、Invalidate介绍
  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被直接发送到目标窗口,从而导致窗口立即重绘。

OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。为什么需要OnDraw呢,是为了让OnDraw一个函数服务于不同的绘图环境,比如显示器,打印机,绘图仪 ,mfc在调用OnDraw之前会把适当的CDC对象传给OnDraw函数。这样窗口的打印功能就可以和显示共用一个函数。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-31
Invalidate()只是一个方法,就是立即更新显示的意思。
跟UpdateData()使用方法类似。

在需要更新显示的位置加Invalidate();就行了~~
第2个回答  2011-08-31
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。
当没有添加WM_PAINT消息处理时,窗口重绘时,由OnDraw来进行消息响应...
当添加WM_PAINT消息处理时,窗口重绘时,WM_PAINT消息被投递,由OnPaint来进行消息响应.这时就不能隐式调用OnDraw了.必须显式调用( CDC *pDC=GetDC(); OnDraw(pDC); )..
隐式调用:当由OnPaint来进行消息响应时,系统自动调用CView::OnDraw(&pDC).追问

那Invalidate呢?调用他和OnDraw有什么区别。

追答

刷新

MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系?
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类...

MFC中OnDraw和OnPaint的区别
(一) OnPaint 和 OnDraw(1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。(2)OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能.(3)当视图变得无效时(包括大小的改变,移动,被...

关于MFC的onpaint函数问题!!
MFC的窗口重绘,是一套很复杂的消息逻辑。这里包含了前景绘制(OnPaint)、背景绘制,窗口框架绘制、子窗口消息管理,一个窗口的重绘,并不是直接出发的WM_PAINT消息,这也是窗口重绘为什么会有InValidate这个函数来触发,而不是仅仅发送一个WM_PAINT.,因为它需要处理背景和子窗口。而OnPaint不过是一系列处...

InvalidateInvalidate介绍
MFC为窗口类预先定义了处理WM_PAINT消息的函数OnPaint,这个函数的主要职责是重新绘制窗口的客户区。然而,对于视图类,情况有所不同。在视图类的OnPaint函数内部,会调用OnDraw函数,实际上是由OnDraw函数来完成具体的重绘工作。当调用Invalidate函数时,参数bErase决定了重绘行为:如果设置为TRUE,那么重绘区...

MFC中的OnPrepareDC函数
ONDRAW 和 ONPAINT 没有太大的差别,ONDRAW 由 ONPAINT 内部调用。至于 OnPrepareDC 其作用是,可以在其中定义视图的影射方式。比如 100个逻辑单位 对应于一个橡素。这样在 OnDraw 中绘制 1000X1000的矩形,则实际显示的结果为 10X10橡素的矩形。在MFC 中 ONDRAW 之前已经调用了 ONPREPAREDC 函数为...

OnPaint与InvalidateRect区别 调用OnPaint与InvalidateRect有什么...
InvalidateRect只是使指定区域无效,不重绘!InvalidateRect使区域无效后,系统就会产生WM_PAINT消息来重绘此区域,而这个消息就会相应的函数就是OnPaint

在vc++中 OnDraw()函数和 Invalidate()函数起什么作用
OnDraw()函数每当窗口发生重绘时就会执行,它其实跟消息处理函数OnPaint()差不多。当在View类里添加了消息处理函数OnPaint()时,OnPaint()就会覆盖掉OnDraw()。Invalidate()是使视图类窗口无效的函数,当要刷新视图时,就可以掉用它,以便发送一个WM_PAINT消息引起窗口的重绘。它有一个默认的参数TRUE...

MFC中什么时候调用OnDraw()函数?
MFC调用OnDraw()函数是和所有会产生WM_PAINT消息的函数有关,Invalidate()、ReDisplay() 调用时会产生WM_PAINT消息,所以也会使用MFC调用onDraw()函数

关于MFC按键的问题
第二个问题,双缓冲下,刷屏本身应该是比较快的,再次优化注意两点:1·局部优化,这是优化图像算法必须的,在你自己触发重绘消息的时候,计算并制定重绘范围(InvalidateRect)2·尽量减少OnPaint(OnDraw)里面所作的工作,将一部分计算和绘制内存DC的工作放到初始化和其它消息触发里面,最理想状态,重绘里面只...

C#中的onpaint函数怎么用的
生成复杂的无效区域。在编程中,根据需要绘图的区域,首先生成这块区域的对象,以该对象作为参数调用Invalidate()方法,就可以引发Paint事件了,这块区域在Paint看来就变成无效区域了。至于绘图是Paint事件处理干的事。对Paint事件编程,首先根据Paint事件参数获取无效区域,然后在无效区域中按要求绘制就可以了。

相似回答