关于OnDraw与OnPaint的问题?

CSharp_XinBing 2011-06-14 08:45:03
个人感觉,如果是CView的话,在OnDraw中画图就可以了吧?
但看到一些书或是代码中,用CScrollView,都是用OnPaint和OnDraw一起用的。

在OnPaint中写一些代码,然后在OnDraw中写一些代码。
想问下实践过的前辈,这样做有什么好处?在OnPaint中做哪些事?在OnDraw中做哪些事?谢谢!
...全文
202 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
无言猪 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 csharp_xinbing 的回复:]
因为是看到XTREME TOOLKIT PRO界面库源代码中,都是:

C/C++ code

void CXTPButton::OnPaint()
{
CPaintDC dcPaint(this);
OnDraw(&dcPaint);
}

void CXTPButton::OnDraw(CDC* pDC)
{

//......


}



……
[/Quote]
CPaintDC dcPaint(this);//CPaintDC的构造函数里面会调用BeginPaint,析构函数里面调用EndPaint,MFC里面经常有这种用法,利用类的构造函数和析构函数来做一些常用功能。
q1q2q3q4ln 2011-06-15
  • 打赏
  • 举报
回复
OnDraw == OnPaint
所以,你就在OnDraw中就可以了
shiyunqiang 2011-06-14
  • 打赏
  • 举报
回复
在MFC程序设计中,按照传统的设计,如果处理WM_PAINT消息,一般会派生一个OnPaint函数,映射到WM_PAINT消息上进行绘图处理。但是很多程序中并没有出现OnPaint,一个OnDraw函数做了更多的绘图操作。而在消息映射的列表中,也没有见到WM_PAINT到OnDraw的映射。

  实际上,OnDraw不是OnPaint的映射,出现OnDraw,是为了实现各种不同的设备上的绘图一致性。

  首先,读者需要明白的是,WM_PAINT消息是为了绘制屏幕而出现的,因此,在OnPaint中,我们只能存取屏幕DC,进行绘制,常见的代码是:

  void MyWnd::OnPaint()

  {

  CPaintDC dc(this);

  //draw code here

  }

  这里的CPaintDC的构造函数会自动调用BeginPaint,获得一个屏幕DC,并附加在dc对象上。当dc对象析构时,系统自动调用EndPaint并使invalidated rectangle变成validated状态,从而结束绘制。(注意,重复创建CPaintDC实例会失败也因为如此)

  如果我们在OnPaint中绘制,那么在打印机上绘制我们就需要再写一个OnPrint函数,重新绘制。这样,程序设计者就需要维护两套代码。为了简化操作,MFC框架把大部分绘制操作都放在OnDraw中,OnPaint和OnPrint只构造相应的DC,然后分别调用OnDraw.

也就是说,OnDraw适用于所有的设备,而OnPaint只适用于屏幕。

  大家在设计过程中必须注意:OnDraw是被基类的OnPaint主动调用的,如果你继承了OnPaint,你应该要么调用基类的OnPaint(此前不得创建CPaintDC实例,也不得调用BeginPaint),要么自己创建CPaintDC实例,并调用OnDraw.

HDC的使用较麻烦, 而且如果::GetDC和::ReleaseDC不配对的话,会造成错误 ,下面是几种表达方式:
CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);

CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

CWindowDC dc(this);
CWindowDC dc2(GetDesktopWindow());//获得整个桌面的句柄, 一些桌面特效程序使用
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

CPaintDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

可以看到 MFC 的类使用方便很多, 因为它们都在构造函数和析构函数调用了响应的函数进行DC的获取和释放.

如果是一个类对象的话,就不需要释放,如果是其他的,直接调用API函数就需要ReleaseDC ,因为对象的话,MFC调用析构的时候帮你释放了,所以不需要,但是如果是对象指针,就是动态new出来的要调用delete掉指针,这样才能析构。

http://blog.163.com/embeded-life/blog/static/10593251920092259477448/
Eleven 2011-06-14
  • 打赏
  • 举报
回复
个人觉得没必要,CView派生类的话,就放到OnDraw函数中
ToperRay 2011-06-14
  • 打赏
  • 举报
回复
在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。
CSharp_XinBing 2011-06-14
  • 打赏
  • 举报
回复

因为是看到XTREME TOOLKIT PRO界面库源代码中,都是:


void CXTPButton::OnPaint()
{
CPaintDC dcPaint(this);
OnDraw(&dcPaint);
}

void CXTPButton::OnDraw(CDC* pDC)
{

//......


}


不知道是什么意思?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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