VC++中OnPaint()、OnDraw()、OnPrint()的区别和联系

1,虚函数OnPrint()

2,基本消息响应函数OnPaint(),非虚函数

3,虚函数OnDraw()

一般在我们创建Doc/View应用程序时,视图类的基类多数为CView类,或者其派生类,因此,在我们的应用程序中的View类中就继承了其父类的上面的三个方法,但是,在我们使用classwizard生成应用程序的框架的时候,向导只为我们的View类override了OnDraw()方法。其余两个方法没有生成。程序运行时,在输出显示(向显示器输出或者向打印机输出)之前,应用程序自动发出WM_PAINT消息,此时,我们的应用程序会调用我们的View类中的OnPaint()或者OnPrint()方法,但是,我们View类中并没有override其实现代码,因而调用其基类的相应的 OnPaint()或者OnPrint()方法,下面进行分类:

1在向显示器输出时,调用的是OnPaint()方法,而OnPaint()方法默认情况下会调用OnDraw()来具体动作,即向显示器输出具体的内容

2在向打印机输出时,调用的是OnPrint()方法,而OnPrint()方法默认情况下同样调用OnDraw()来具体动作,即向打印机输出具体内容

而实际上,我们只有一个已经实现了具体代码的OnDraw()方法,因此在向显示器输出和向打印机输出时的具体动作是一样的,也就是具体的输出方式和输出内容都是一样的。

那么OnPaint()和OnPrint()难道只调用OnDraw来实际动作,还要这连个函数干吗呢,不如直接用OnDraw不就完了吗?实际情况并非如此,分析如下:

1OnPaint()方法在调用OnDraw方法向显示器输出之前需要做大量的准备工作,其中之一就是准备一个跟显示器相关的DC对象,并把此对象传递给OnDraw方法,让其用此对象向显示器输出

2OnPrint()方法在调用OnDraw方法向打印机输出之前同样作很多准备工作,其中之一就是准备一个跟打印机相关的DC对象,并把此对象传递给OnDraw方法,让其用此对象向打印机输出。

因此,尽管主调函数不同,传入的参数也不同,但是对于OnDraw方法来说,这个DC对象是毫无差别的,只是一个用来画内容的工具,在其具体动作时,根本不区分是何种对象,因此也就实现了设备的无关性。具体流程如下图:

VC++中OnPaint()、OnDraw()、OnPrint()的区别和联系 - zy_tommy - zy_tommy的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值