MFC中啥时候调用OnDraw()函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中啥时候调用OnDraw()函数?相关的知识,希望对你有一定的参考价值。

是不是和Invalidate()、ReDisplay()这两个函数有关?

MFC调用OnDraw()函数是和所有会产生WM_PAINT消息的函数有关,Invalidate()、ReDisplay() 调用时会产生WM_PAINT消息,所以也会使用MFC调用onDraw()函数 参考技术A 基类调用
例如 OnPaint调它:

CPaintDc dc(this);
onDarw(&dc);

或别的地方:
CDC dc;
onDarw(&dc);
参考技术B ondraw函数不用自己调用,当窗口需要重新绘制,系统会自动调。
如果自己想重新绘制,可以调用invalidate、invalidaterect或者updatewindow等函数,引起绘制即可。

MFC 中 OnPaint() 函数的使用

【中文标题】MFC 中 OnPaint() 函数的使用【英文标题】:Use of OnPaint() function in MFC 【发布时间】:2013-04-16 15:53:14 【问题描述】:

我正在尝试学习 MFC 文档视图应用程序。我开始创建一个简单的图像查看器应用程序。为此,我从 CScrollView 类派生了我的视图类并覆盖了 draw() 函数。

我想知道什么时候使用 OnPaint() 函数以及它与 draw() 函数的关系。

【问题讨论】:

【参考方案1】:

您不应该在同一个视图中同时需要 OnPaintOnDraw 函数。根据Microsoft's documentation:

当视图变得无效时,Windows 会向它发送 WM_PAINT 消息。视图的 OnPaint 处理函数通过创建 CPaintDC 类的设备上下文对象响应消息并调用视图的 OnDraw 成员函数。您通常不必编写重写 OnPaint 处理程序函数。

通过将绘图代码拆分为自己的函数,该框架允许您重用它来绘制屏幕和打印。

【讨论】:

覆盖OnPaint 对于视图来说几乎总是错误的——当它正确时,它通常涉及高级的东西。例如,当您尝试进行双重或三重缓冲时,您可能希望同时覆盖这两者,并且需要兼顾设备上下文。正如文档所述,将绘图保留在 OnDraw 中。 在我的测试应用程序中,我重写了 Draw() 函数,它正在加载图像并绘制它。现在我想为应用程序添加放大/缩小功能。为此,我添加了工具栏按钮。我不知道如何进行此操作。我必须在工具栏处理程序中做什么。我是否需要更改视图类的 CImage 对象并调用更新窗口。它是正确的还是有更好的方法。 @dearvivekkumar 您应该在 new 问题中提出其他问题 - 而不是 cmets。但一般来说,让您的工具栏按钮在视图中设置“缩放级别”成员变量,然后让 OnDraw 相应地绘制内容。

以上是关于MFC中啥时候调用OnDraw()函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC SDI 应用程序中调用 OnDraw

MFC中ONPAINT、ONDRAW、ONERASEBKGND等绘图函数的使用场合和作用、区别是啥啊?

是否有可能/有必要在单独的线程中调用 OnDraw [MFC]

activex 如何调用OnDraw函数

MFC中OnDraw与OnPaint的区别

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