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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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函数。这样窗口的打印功能就可以和显示共用一个函数。
参考技术A Invalidate()只是一个方法,就是立即更新显示的意思。
跟UpdateData()使用方法类似。

在需要更新显示的位置加Invalidate();就行了~~
参考技术B 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 C++ 从 WM_KEYDOWN 处理程序获取在 OnDraw() 中编辑的 CDC pDC 的句柄

【中文标题】MFC C++ 从 WM_KEYDOWN 处理程序获取在 OnDraw() 中编辑的 CDC pDC 的句柄【英文标题】:MFC C++ Getting handle to CDC pDC edited in OnDraw() from WM_KEYDOWN handler 【发布时间】:2016-05-04 03:10:05 【问题描述】:

Single Document,最简单的 MFC 应用程序。

这个想法是默认 CDC pDC 是通过 onDraw() 函数以某种方式编辑(着色)的。当用户点击一个数字时,我希望它使用 pDC 中的颜色显示。

如果我对 WM_KEYPRESS 使用默认处理函数 OnKeyDown,我将没有获得指向我编辑的 pDC 的指针。

我的问题是如何访问已编辑的 pDC? 我确信我缺少一个简单的解决方案,请帮忙。

【问题讨论】:

【参考方案1】:

我不是 100% 确定我正确理解了这个问题,但让我试试......

在 MFC 中执行我认为您想要的通常和推荐的方法是仅处理 onDraw() 中的所有绘图。

因此,在onKeyDown() 处理程序中,您会将按下的键存储到成员变量(或者甚至将其推送到要绘制的键的vectorlist),然后调用Invalidate(false)。这会导致 Windows 向您的窗口生成 WM_PAINT 消息,最终在 onDraw() 中处理,您现在可以根据您当前的成员变量值绘制正确的内容。

也可以在onDraw() 之外创建一个CPaintDC 并以此为基础。但如前所述,通常在 MFC 应用程序中,所有绘图都保存在一个位置。 Windows 可能会随时请求您的应用重绘,并通过WM_PAINT 消息执行此操作。

【讨论】:

以上是关于MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系?的主要内容,如果未能解决你的问题,请参考以下文章

Invalidate 未调用自定义视图类的 onDraw

Invalidate()不会在Xamarin.Android中调用OnDraw()

在vc++中 OnDraw()函数和 Invalidate()函数起啥作用

在 MFC SDI 应用程序中调用 OnDraw

mfc 图片列表显示

关于MFC中的OnPaint和OnDraw