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对象是毫无差别的,只是一个用来画内容的工具,在其具体动作时,根本不区分是何种对象,因此也就实现了设备的无关性。具体流程如下图: