问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?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默认的标准的重画函数
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()函数强制的重画窗口
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tracing/archive/2008/08/21/2806156.aspx
分享到:
相关推荐
尽管`OnPaint`和`OnDraw`在功能上紧密相关,但它们的职责和调用机制存在明显区别: 1. **调用时机**:`OnPaint`函数响应`WM_PAINT`消息,而`OnDraw`则通常在`OnPaint`函数内部被调用,用于具体绘制逻辑。 2. **功能...
在MFC框架下开发应用程序时,理解`OnPaint`和`OnDraw`的区别及其作用至关重要。正确地使用这两个函数可以帮助开发者更高效地管理和控制界面的绘制过程,从而提高应用程序的性能和用户体验。在实践中,通常会将复杂的...
在VC++环境中,MFC(Microsoft Foundation Classes)库为我们提供了丰富的功能来构建Windows应用程序,包括对话框(Dialog)和各种控件。在这个场景中,我们关注的是如何在对话框程序中使用picture控件来显示位图,...
如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间,映射方式,设备坐标与逻辑坐标的转换...
在这个"MFC.zip_onpaint"压缩包中,我们关注的核心主题是MFC中的`OnDraw`和`OnPaint`函数,这两个函数在图形绘制和窗口更新中起着关键作用。 `OnDraw`函数通常是自定义控件或者视图(CView)类的一部分,它的主要...
例如,当需要在窗口中动态显示或更新图形时,使用OnPaint和OnDraw结合CScrollView可以轻松实现窗口的滚动和图形的正确显示。同时,通过元文件和兼容设备描述表,可以实现图形的保存和恢复,这在创建图形编辑器或者...
总的来说,DrawDib和DrawDibDraw函数提供了一种高效且灵活的方式来处理和显示位图,而OnPaint和OnDraw则是Windows应用程序中处理图形更新的标准流程。掌握这些核心技术,将有助于提升Windows图形界面应用的性能和...
在深入探讨“VC基础分析实施例”这一主题时,我们主要关注的是Windows编程环境中与图形界面相关的两个核心函数:OnPaint()与OnDraw()的区别及其应用。这两个函数在MFC(Microsoft Foundation Classes)框架中扮演着...
为了实现这个功能,你需要在`OnPaint`或`OnDraw`函数中插入一段代码。`OnPaint`是Windows消息处理函数,当窗口需要重绘时会被调用。在MFC中,你可以通过覆盖`OnPaint`函数来自定义窗口的绘制行为。以下是基本步骤: ...
如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间,映射方式,设备坐标与逻辑坐标的转换...
视图类有一些例外,在视图类的 OnPaint 函数中调用了 OnDraw 函数,实际的重绘工作由 OnDraw 来完成。 需要注意的是,Invalidate 只是放一个 WM_PAINT 消息在队列里,不做别的,所以只有当当前函数返回后,进入消息...
首先需要创建一个定时器,每隔一定时间调用OnPaint或者OnDraw函数,绘制当前帧图像。在绘制图像之前,需要使用InvalidateRect函数清除上一帧图像,以避免图像堆叠。 在绘制当前帧图像时,需要设计一个输入,即在...
Invalidate() 之后:(MFC 的,顺便了)OnPaint()->OnPrepareDC()->OnDraw() 所以只是刷新在 OnPaint() 和 OnDraw() 函数中的绘图语句。其它地方没有影响。 Invalidate() 和 InvalidateRect() 的主要区别在于,...
摘要:VC/C++源码,其它分类,几何绘图 VC++几何绘图实例,如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口...
3. **注册消息映射**:确保在MFC的消息映射中包含了`ON_WM_PAINT()`,以便当控件需要重绘时,`OnPaint`消息能被正确处理。同时,由于我们自定义了`OnDraw`,还需要包含`ON_WM_ERASEBKGND()`来避免不必要的背景擦除。...
该教程重点介绍了GDI和DC的概念、基本图形函数、Ondraw()方法和OnPaint()方法、视图中的图形绘制案例,以及典型案例——简单画图程序。 一、GDI和DC的概念 GDI是Graphics Device Interface的缩写形式,即图形设备...
同时,通过设置一个定时器(CTimer类或者WM_TIMER消息),定时调用重绘函数(OnPaint或OnDraw)来改变火箭的位置,从而产生动态移动的效果。 描述中的“简单的图片位移示例”意味着,火箭的发射动画可能通过改变...
在需要重绘时,通过WM_PAINT消息处理函数OnPaint调用OnDraw函数,重新绘制所有图形。 在用户交互方面,为了在绘图时显示十字准线,可以重载CButton类的OnSetCursor函数,使用LoadStandardCursor加载预定义的十字...
在内存分配上,堆和栈的区别是关键。栈内存分配速度快,但空间有限;而堆内存则可以动态申请,但管理起来相对复杂。在C++中,new关键字用于在堆上分配内存,而delete用于释放。 在Windows消息处理机制中,WM_PAINT...
用户可以通过鼠标移动来画线,窗口的移动或调整大小不会影响已经绘制的线条,因为这些线条会在每次 `OnPaint` 或 `OnDraw` 调用时重新绘制。文件列表中的 "MFCDraw" 可能是源代码文件,包含了实现这一功能的具体代码...