首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > OnPaint和OnDraw有什么区别?
【标  题】:OnPaint和OnDraw有什么区别?
【关键字】:OnPaint,OnDraw
【来  源】:http://blog.csdn.net/wilsonwong/archive/2006/10/10/1329467.aspx

OnPaint和OnDraw有什么区别?

OnPaint和OnDraw有什么区别?

CPaintDC和CClientDC又有什么区别?

1) 在mfc结构里 OnPaint是CWnd的成员函数. OnDraw是CView的成员函数. 2) OnPaint()调用OnDraw(),OnPrint也会调用OnDraw(),所以OnDraw()是显示和打印的共同操作。

OnPaint是Wm_Paint消息引发的重绘消息处理函数,在OnPaint中会调用OnDraw来进行绘图。 OnPaint中首先构造一个CPaintDC类得实例,然后一这个实例为参数来调用虚函数OnPreapreDC来进行一些绘制前的一些处理,比设置映射模式,最后调用OnDraw。而OnDraw和OnPreapreDC不是消息处理函数。 所以不是因为重绘消息所引发的OnPaint导致OnDraw被调用时,比如在OnLButtonDown等消息处理函数中绘图时,要先自己调用OnPreapreDC。

至于CPaintDC和CClientDC根本是两回事情 CPaintDC是一个设备环境类,在OnPaint中作为参数传递给OnPreapreDC来作设备环境的设置。真正和CClientDC具有可比性的是CWindowDC,他们一个是描述客户区域,一个是描述整个屏幕

如果是对CVIEW或从CVIEW类派生的窗口绘图时应该用ONDRAW

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维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。 补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口,具体的请参考MSDN吧

ondraw中可以绘制用户区域 onpaint中只是当窗口无效时重绘不会保留CClientDC绘制的内容

 
 
VC++ADO连接数据库:【上一篇】
mfc消息处理和消息映射的概念:【下一篇】
【相关文章】
  • 在OnPaint()使用两次CPaintDC,关于::BeginPaint()/::EndPaint()
  • AvalonPaint: Features Added
  • 【随机文章】
  • java反射reflection需要注意的几点
  • Java中的代理模式
  • 闹心的飞机噪音污染!!
  • Perl版猜数字游戏
  • 解读C#中的规则表达式
  • 数据开发-Oracle基础
  • IBM eServer家族
  • Oracle 9i启动
  • Solaris中配置自动挂载文件系统
  • 用Photoshop打造冰雕蜘蛛侠
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.