onpaint和ondraw的问题

jsyren 2011-10-25 07:49:06
mfc真是牛啊,不了解这俩函数内部。愣是搞不懂他们的区别,现在有以下问题
1.两者区别(先别跟我说内部,你只要说下哪种情况下用哪个就可以了)
2.onpaint在哪种情况下会被响应(请不要说响应WM_PAINT消息,说实际的什么情况下)
3。ondraw在哪种情况下会被响应。(要求同上)
...全文
82 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mdesigner 2011-10-25
  • 打赏
  • 举报
回复
对话框上一般用Opint
视图上用OnDraw
罗平 2011-10-25
  • 打赏
  • 举报
回复
OnPaint 在窗口被遮罩后显示、最小化后显示、都会触发,也可以通过程序发送消息触发。
OnDraw 没有消息响应,但他被 OnPaint调用,所以OnPaint 触发时,同时调用 OnDraw。
Ginie 2011-10-25
  • 打赏
  • 举报
回复
OPaint调OnDraw(),OPaint()是消息.OnDraw()是虚函数。
You must override this function to display your view of the document. You can make graphic device interface (GDI) calls using the CDC object pointed to by the pDC parameter. You can select GDI resources, such as pens or fonts, into the device context before drawing and then deselect them afterwards. Often your drawing code can be device-independent; that is, it doesn’t require information about what type of device is displaying the image.

lgstudyvc 2011-10-25
  • 打赏
  • 举报
回复
部长说的,还有楼上说的都是,

再者就是你自己跟踪,看看执行顺序
龙行天下之Sky 2011-10-25
  • 打赏
  • 举报
回复
1、OnPaint最终是通过调用OnDraw实现的
2、当界面有变动的情况下被响应,比如移动界面、界面被覆盖后重新显示、最大化和还原等等,只要涉及到界面有改动的地方都要进行重绘,重绘很频繁
3、当界面有变动的情况下被响应,比如移动界面、界面被覆盖后重新显示、最大化和还原等等,只要涉及到界面有改动的地方都要进行重绘,重绘很频繁
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 处理成员函数。
OnDraw函数还需要同时支持打印机输出。OnPaint()函数和OnPrint()函数都要调用OnDraw(),于是同样的绘图代码既可以用于屏幕输出,也可以用于打印机输出
在编程中,一般重载OnDraw()就可以了。如果定义了OnPaint()函数,并且在OnDraw()里面有要显示的内容,那么需要显示的调用OnDraw(),即OnDraw(&dc)。
2、OnDraw()是被OnPaint()调用的虚函数,在CView中定义为纯虚函数,因此必须被重载,其设备上下文由OnPaint()提供。
OnPaint()是响应消息WM_PAINT的响应函数,默认实现中在,先调用BeginPaint(),最后调用EndPaint。
建议编程时使用OnDraw。
shiyunqiang 2011-10-25
  • 打赏
  • 举报
回复
OnPaint支持重画。
一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。
Eleven 2011-10-25
  • 打赏
  • 举报
回复
OnPaint()是WM_PAINT消息的默认响应函数,OnDraw是CView类的虚函数,是被OnPaint函数调用。

void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}

既然OnPaint是WM_PAINT消息的默认响应函数,OnPaint什么时候调用那就看你的WM_PAINT消息是怎样产生的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧