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

可见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轴的逻辑单位可以进行任意的缩放。改变坐标映射方式后,就要确定窗口大小和视口大小,注意窗口大小就是我们在屏幕上所见的尺寸,而视口大小则是实际设备,如打印机等,和显示器设备每逻辑英寸的象素数量比较所得的比例尺寸。通过函数得到显示器和打印机每逻辑英寸的象素数量,然后对视口大小进行相应的缩放,就可以使得屏幕上的显示和打印机的输出是一致的了。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值