`
phinecos
  • 浏览: 343254 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

OnDraw()和OnPaint()的区别

 
阅读更多
问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()OnPaint()两个都是解决上面的问题,有什么不同?

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

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

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

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

///CView
默认的标准的重画函数
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->voidCView::OnPaint()
{
CPaintDCdc(
this);
OnPreparDC(
&dc);
OnDraw(
&dc);//调用了OnDraw
}


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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
voidCMyView::OnDraw(CDC*pDC)
{
CMyDoc
*pDoc=GetDocument();
CStrings
=pDoc->GetData();//ReturnsaCString
CRectrect;
GetClientRect(
&rect);
pDC
->SetTextAlign(TA_BASELINE|TA_CENTER);
pDC
->TextOut(rect.right/2,rect.bottom/2,s,s.GetLength());
}

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

补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口

分享到:
评论

相关推荐

    OnDraw与OnPaint有什么区别

    详细介绍OnDraw与OnPaint有什么区别

    OnPaint()与OnDraw()的区别

    OnPaint()与OnDraw()的区别

    MFC.zip_onpaint

    MFC几个常用的函数介绍,OnDraw和OnPaint的区别等

    CDC.rar_CDC_CPtrArray ondraw_metafile_onpaint cdc

    如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间,映射方式,设备坐标与逻辑坐标的转换...

    VC滚动视图(CScrollView类)的局部更新算法示例

    在使用CScrollView(滚动视图)类时,不需要在其OnDraw/OnPaint中全部进行重绘;只需获取其update region,绘制落在此区域内的对象即可。这样可以提高显示效率,减少闪烁。 在拖动窗口大小时(WM_SIZE消息),update ...

    MFC 单文档 对话框 picture控件的背景用图片填充

    压缩包中一共有三个源代码,分别用图片填充单文档、对话框和对话框picture控件的背景,只要在onpaint或ondraw中加一段代码即可。

    c++面试题基础分享.doc

    31.OnDraw和OnPaint 32.win32程序的消息响应机制是如何实现的 33.MFC中的消息响应机制是如何实现的 34.WM_COMMAND命令消息处理顺序 35.MFC序列化的概念 36.PeekMessage和GetMessage的主要区别 37.WIN32创建...

    VC基础分析实施例

    onpaint ondraw 的区别,非常有用

    VC++对话框程序picture控件图像重绘

    基于MFC对话框程序,利用picture控件显示位图,并可实现图像重绘。内有代码与实现之详细步骤。

    滚动窗口的实现兼容DC实现图形的保存和再现

    如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间,映射方式,设备坐标与逻辑坐标的转换...

    《VC++深入详解》第11章 图形的保存和重绘

    如何让CDC上输出的文字和图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间、映射方式、设备坐标与逻辑坐标的转换...

    用c++和mfc写的单文档画正弦曲线

    // TODO: 在此添加消息处理程序代码和/或调用默认值 switch (nIDEvent)//判断响应的是哪个定时器 { case 1000: m_Sin.m_iP --;//动作 break; case 2000: m_Sin.m_iP ++;//动作 break; } ...

    VC++几何绘图实例

    摘要:VC/C++源码,其它分类,几何绘图 VC++几何绘图实例,如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口...

    MFC实现的窗口鼠标绘线

    通过MFC实现的鼠标在窗口中绘线的功能。保存鼠标滑过是的各个点,然后OnPaint绘制线条,窗口移动或发生变化时,会响应OnDraw函数实现重绘。

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    void CUi1View::OnDraw(CDC* pDC) { //绘制按钮框架 pDC-&gt;DrawFrameControl(CRect(100, 100, 220, 160), DFC_BUTTON, DFCS_BUTTONPUSH); //输出文字 pDC-&gt;SetBkMode(TRANSPARENT); pDC-&gt;TextOut(120, 120, ...

    车牌识别--VC源码

    使用VC++6.0做开发工具, 采用简单的SDI框架结构 ,一次处理一幅位图(有兴趣的可以作成MDI) 1)位图信息的数据是从左下往...自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画

    OpenCV C++完整的车牌识别系统.rar

    自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 比较重要的地方 读BMP文件,只能打开...

    VC++6.0车牌识别系统

    自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 比较重要的地方 读BMP文件,只能打开...

    车牌识别系统

    自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 比较重要的地方 读BMP文件,只能打开...

    监控识别车牌号码、抓取号码

    自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 比较重要的地方 读BMP文件,只能打开...

Global site tag (gtag.js) - Google Analytics