OnDraw 与OnPaint 的疑惑

lijisdu 2011-09-27 03:27:56
如果在视类中同时存在OnDraw 与OnPaint两个函数,断点调试时会发现程序只走了OnPaint而没有走OnDraw,而如果只有OnDraw函数而没有OnPaint时,程序就会走OnDraw。而据我所知,OnPaint执行时会调用OnDraw,但两者同时存在时却只走了OnPaint,所以我有点疑惑,请赐教。谢谢~~!ps:OnDraw与OnPaint的区别我还是有些了解的。
...全文
164 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-10-19
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
hedengxiang 2011-09-27
  • 打赏
  • 举报
回复
如果你没有重载onpaint函数的话,onpaint函数的函数体为:
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}

注:在你安装目录下查找VIEWCORE.CPP,可以找到。。

而当你去重载一个onpaint的时候,系统默认为:
void CXXXView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CDialog::OnPaint() for painting messages
}

可以看到,它并没有去调用ondraw函数……


自己可以去试一下。。。
justkwy 2011-09-27
  • 打赏
  • 举报
回复
好象继承自某些特殊类,例如:CScrollView必须重写OnDraw方法,添加了OnPaint但不在其中添加渲染函数可能会有莫名其妙的问题!
gameslq 2011-09-27
  • 打赏
  • 举报
回复
实验的结果是对的,请看view::OnPaint的实现代码

// CView drawing support

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

如果你在继承自类view的子类实现了OnPaint 函数,相当于子类OnPaint覆盖了
父类的OnPaint函数,所以无法调用OnDraw函数
但是如果子类OnPaint函数这样实现

void CView_xxx::OnPaint()
{
CPaintDC dc(this);
OnDraw(&dc);
}

OnDraw 函数又可以调用了

15,981

社区成员

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

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