解决图像打印结果变小的问题

可见CView类对输出到屏幕和输出到打印机的处理都是一样的,只是换了一个设备上下文而已,那么为什么输出到打印机的图像特别小呢?

这与VC采用的缺省的坐标映射方式MM_TEXT有关,这种方式的好处是用户图形坐标和设备的象素完全一致。但是在屏幕的象素大小为800*600时,每逻辑英寸包含的屏幕象素为96,而打印机的点数却要多好几倍,如当打印机为HP LaserJet 6L时每逻辑英寸包含的打印机点数为600,也就是说打印机的清晰度比屏幕要高得多。

这样的后果就是在屏幕上显示出来的满屏图像在打印出来的纸上却只有一点点大,怎么解决这个问题呢?一种简单的方法就是转换坐标映射方式,使得打印时采用的坐标比例比显示时采用的坐标比例相应地大若干倍,就可以解决这一问题。

下面将给出详细的方法。

注意到CView类在进行显示和打印之前都会调用virtual void OnPrepareDC( CDC* pDC, CPrintInfo* pInfo = NULL )这个虚拟成员函数来准备设备上下文,我们可以在CView类中重载这个虚拟成员函数,进行坐标转换。

首先用VC的ClassWizard实现对OnPrepareDC( CDC* pDC, CPrintInfo* pInfo = NULL )函数的重载,ClassWizard生成的源代码如下:

void CTempView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)

{ // TODO: Add your specialized code here and /or call the base class

CView::OnPrepareDC(pDC, pInfo);

}

我们只需在源代码中加入以下几行代码即可,如下:

void CPrintSameView::OnPrepareDC (CDC* pDC, CPrintInfo* pInfo)

CView::OnPrepareDC(pDC, pInfo);

pDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式

CSize size = CSize(800, 560);

pDC->SetWindowExt(size);

//确定窗口大小 //得到实际设备每逻辑英寸的象素数量

int xLogPixPerInch = pDC-> GetDeviceCaps(LOGPIXELSX);

int yLogPixPerInch = pDC- >GetDeviceCaps(LOGPIXELSY);

//得到设备坐标和逻辑坐标的比例

long xExt = (long)size.cx * xLogPixPerInch/96 ;

long yExt = (long)size.cy * yLogPixPerInch/96 ;

pDC->SetViewportExt((int)xExt, (int)yExt);

//确定视口大小 

}

如上所示,首先将坐标映射方式改变为MM_ANISOTROPIC方式,即各向异性的意思,在这种坐标方式下,X轴和Y轴的逻辑单位可以进行任意的缩放。改变坐标映射方式后,就要确定窗口大小和视口大小,注意窗口大小就是我们在屏幕上所见的尺寸,而视口大小则是实际设备,如打印机等,和显示器设备每逻辑英寸的象素数量比较所得的比例尺寸。通过函数得到显示器和打印机每逻辑英寸的象素数量,然后对视口大小进行相应的缩放,就可以使得屏幕上的显示和打印机的输出是一致的了。

这样,只通过几行简单的代码,我们就实现了所见即所得的打印。

发布了6 篇原创文章 · 获赞 1 · 访问量 6368
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览