可见CView类对输出到屏幕和输出到打印机的处理都是一样的,只是换了一个设备上下文而已,那么为什么输出到打印机的图像特别小呢?
这与VC采用的缺省的坐标映射方式MM_TEXT有关,这种方式的好处是用户图形坐标和设备的象素完全一致。但是在屏幕的象素大小为800*600时,每逻辑英寸包含的屏幕象素为96,而打印机的点数却要多好几倍,如当打印机为HP
这样的后果就是在屏幕上显示出来的满屏图像在打印出来的纸上却只有一点点大,怎么解决这个问题呢?一种简单的方法就是转换坐标映射方式,使得打印时采用的坐标比例比显示时采用的坐标比例相应地大若干倍,就可以解决这一问题。
下面将给出详细的方法。
注意到CView类在进行显示和打印之前都会调用virtual
首先用VC的ClassWizard实现对OnPrepareDC(
void
{
CView::OnPrepareDC(pDC,
}
我们只需在源代码中加入以下几行代码即可,如下:
void
{
CView::OnPrepareDC(pDC,
pDC->SetMapMode(MM_ANISOTROPIC);
CSize
pDC->SetWindowExt(size);
//确定窗口大小
int
int
//得到设备坐标和逻辑坐标的比例
long
long
pDC->SetViewportExt((int)xExt,
//确定视口大小
}
如上所示,首先将坐标映射方式改变为MM_ANISOTROPIC方式,即各向异性的意思,在这种坐标方式下,X轴和Y轴的逻辑单位可以进行任意的缩放。改变坐标映射方式后,就要确定窗口大小和视口大小,注意窗口大小就是我们在屏幕上所见的尺寸,而视口大小则是实际设备,如打印机等,和显示器设备每逻辑英寸的象素数量比较所得的比例尺寸。通过函数得到显示器和打印机每逻辑英寸的象素数量,然后对视口大小进行相应的缩放,就可以使得屏幕上的显示和打印机的输出是一致的了。
这样,只通过几行简单的代码,我们就实现了所见即所得的打印。