MFC 中 OnPaint() 函数的使用

Posted

技术标签:

【中文标题】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 中 OnPaint() 函数的使用的主要内容,如果未能解决你的问题,请参考以下文章

MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别

MFC中OnDraw与OnPaint的区别

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

在mfc中控件如CButton,CStatic创建之后能改变大小或者移动位置吗

在 MFC C++ 程序中同时出现 OnPaint() 和 MouseMove 事件

mfc中,我想把自己的图片显示在窗口中,一定要在wm_paint重绘中实现??