经常有朋友问雷神这样的问题:
我在视图画的图象或者文字,当窗口改变后为什么不见了?
OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?

雷神在这里一并解答一下吧。
OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。

至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows回发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或OnPaint()来重画窗口。

OnDraw()和OnPaint()有什么区别呢?
首先:
我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。

其次:
我们在第《每天跟我学MFC》3的开始部分已经说到了。要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。

当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的 OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。

///CView默认的标准的重画函数
void CView::OnPaint()
{
    CPaintDC dc(this);
    OnPreparDC(&dc);
    OnDraw(&dc); //调用了OnDraw
}

既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序

///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
void CMyView::OnDraw( CDC* pDC )
{
    CMyDoc* pDoc = GetDocument();
    CString s = pDoc->GetData();   // Returns a CString
    CRect rect;

GetClientRect( &rect );
    pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
    pDC->TextOut( rect.right / 2, rect.bottom / 2,
                  s, s.GetLength() );
}

最后:
现在大家明白这哥俩之间的关系了吧。因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。

转载于:https://www.cnblogs.com/aion111/archive/2008/12/25/1362461.html

OnDraw()和OnPaint()相关推荐

  1. MFC中OnDraw与OnPaint的区别

    OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. OnPaint()是CWnd的类成员,负责响应WM_PAIN ...

  2. OnDraw与OnPaint有什么区别

    学习中遇到一个问题,OnDraw与OnPaint有什么区别?上网搜索了一下,又查了一下MSDN和MFC的一些源文件,现整理如下. OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中 ...

  3. 2010.7.27 OnDraw与OnPaint有什么区别

    引用:http://wenku.baidu.com/view/bc9b1c661ed9ad51f01df2ab.html OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用On ...

  4. 【VC++ MFC】vc 画笔和画刷|OnDraw()和OnPaint()

    目录 [VC++ MFC]vc 画笔和画刷 [VC++ MFC]OnDraw()和OnPaint() [VC++ MFC]vc 画笔和画刷 6,利用画笔改变线条颜色和类型: CPen pen(PS_D ...

  5. MFC中的Invalidate、OnDraw、OnPaint函数的作用及绘图概念

    1.绘图概念 GDI绘图分为背景和前景两个画布的绘制,Invalidate()函数强制重绘制, Invalidate()     如果参数为true则在OnPaint函数对背景先进行绘制,再对前景进行 ...

  6. OnDraw和OnPaint函数的区别

    CWnd::OnPaint() 是CWnd类的成员函数,是WM_PAINT 消息的响应函数.当你调用CWnd::UpdateWindow(),CWnd::RedrawWindow()时, 或者窗口被其 ...

  7. Onpaint和OnDraw的区别

    (一) OnPaint 和 OnDraw (1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. (2)OnP ...

  8. Invalidate() UpdateData() OnPaint()与OnDraw

    Invalidate()函数 UpdateData()用法 OnPaint()与OnDraw 收藏 vc++ MFC 2010-11-08 16:42:49 阅读208 评论0   字号:大中小 订阅 ...

  9. MFC消息响应函数OnPaint

    MFC消息响应函数OnPaint WM_PAINT是窗口每次重绘都会产生的一个消息. OnPaint是对这个消息的反应函数 mfc 的 CWnd::OnPaint 没做什么,只是丢给系统处理. 一 : ...

最新文章

  1. 社会主义基本经济规律是经济效益规律
  2. 数据中心ups电源七个故障分析
  3. 成功解决ValueError: Invalid format string
  4. 基于kickstart实现网络共享以及制作光盘和U盘实现半自动安装centos6系统
  5. vue-自定义组件传
  6. FZU 2020 组合
  7. 疫情期间怎么上班?用电脑或手机远程办公很简单
  8. 直接获得TP-LINK路由器外网IP地址
  9. android 仿美团日历,仿小米日历 纵享丝滑切换的周月效果
  10. 小萌库 一周漫画精彩回顾
  11. Android APP LOGO尺寸
  12. OpenNLP学习笔记1
  13. 微信公众号JS屏蔽分享,复制链接等
  14. 汇千网-未来PC长这样?微软正式推出第一台云电脑
  15. 2019.10.3 noip模拟赛
  16. [BZOJ1529]核电站问题
  17. 设x,y,z均为int型变量,请用c语言表达式描述,C语言期末复习卷习题
  18. 洛谷 2343 宝石管理系统 题解
  19. 《从0到1:CTFer成长之路》书籍配套题目-[第一章 web入门]SQL注入-2
  20. 女生学习物联网工程好就业吗?

热门文章

  1. 使用纯碎的HTML CSS制作多拉A梦(即为CSS画图)
  2. k8s-(maser节点api-server、scheduler、controller-manager.sh)
  3. apmserv mysql5.1启动失败_apmserv启动失败的原因以及解决方法
  4. 洛谷P1008 [NOIP1998 普及组] 三连击题解
  5. Either re-interrupt this method or rethrow the “InterruptedException“ that can be caught here.
  6. html5 workers,HTML5 Web Workers
  7. 【大数据】阿里云大数据专业认证考试
  8. 激励反向传播的自上而下注意力神经模型
  9. 浙江万里学院期末计算机网络,(浙江万里学院云计算基础课程大作业封面.doc
  10. Java 旋转、翻转图片工具类(附代码) | Java工具类