VC打印相关

 最近在编写一个基于对话框的VC打印系统,采用虚拟打印机(Adobe PDF)打印,但是存在一个问题,打印机的分辨率必须设为300dpi时才能正常显示,所以必须在打印对话框之前对默认打印机的分辨率做一个修改。在网上找了很长时间,终于发现一篇文章很有用

原文http://www.souzz.net/html/edu/asp/asp9/5051.html

LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd)) //获得默认的打印机的信息
{
      lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
      if(lpDevMode)
      {
           lpDevMode->dmPaperSize=DMPAPER_A4; //将打印纸设置为A4
           lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; //将打印机设置为横向打印。
           lpDevMode->dmPrintQuality=600 //打印分辨率为600dpi 
      }
      GlobalUnlock(pd.hDevMode);
}
结合自己的实际情况,在重载的函数CView::DoPreparePrinting中添加如下加粗代码即可完成:

BOOL CView::DoPreparePrinting(CPrintInfo* pInfo)

{

    .......

   // otherwise, bring up the print dialog and allow user to change things
  // preset From-To range same as Min-Max range
  pInfo->m_pPD->m_pd.nFromPage = (WORD)pInfo->GetMinPage();
  pInfo->m_pPD->m_pd.nToPage = (WORD)pInfo->GetMaxPage();
  
  //以下部分为额外添加的,目的是在弹出打印对话框前,设定打印机的默认分辨率为600
  LPDEVMODE lpDevMode;
  if(AfxGetApp()->GetPrinterDeviceDefaults(&(pInfo->m_pPD->m_pd))) //获得默认的打印机的信息
  {
         lpDevMode=(LPDEVMODE)GlobalLock(pInfo->m_pPD->m_pd.hDevMode);
         if(lpDevMode)
        {
             CString prtName;
             prtName=lpDevMode->dmDeviceName;
 
             lpDevMode->dmPrintQuality=300; //打印分辨率初始化为300dpi
             lpDevMode->dmFields=DM_PRINTQUALITY;
        }
        GlobalUnlock(pInfo->m_pPD->m_pd.hDevMode);
  }
  
  if (pApp->DoPrintDialog(pInfo->m_pPD) != IDOK)
     return FALSE;       // do not print
 }

 .......

}

 但是这又出现了另一个问题,就是在实际打印时,打印机不一定支持300dpi的分辨率,所以转换思路,根据用户实际打印设备的分辨率,调整CDC类对象的映射模式,其中pInfo为CPrintInfo类的指针,hDC为HDC类对象:

 pInfo->m_pPD->m_pd.Flags=PD_RETURNDC;
 hDC=pInfo->m_pPD->m_pd.hDC;
 int dpi=GetDeviceCaps(hDC,LOGPIXELSX);
 
 pDC->SetMapMode(MM_ISOTROPIC);
 //根据打印机的分辨率调整逻辑窗口的大小
 pDC->SetWindowExt(300*600/dpi,300*600/dpi);
 
 CRect rectClient;
 GetClientRect(rectClient);//取窗口物理尺寸(单位:像素)
 
 pDC->SetViewportExt(rectClient.right, rectClient.bottom);//改变Y坐标方向--viewport使用物理大小 
 pDC->SetViewportOrg(rectClient.left, rectClient.top);//设置窗口左上角为坐标系原点--Viewport使用物理大小

参考http://embeded-life.blog.163.com/blog/static/105932519200942511462758/

这样在测试时,便显示正确了,与打印设备的分辨率无关,所以上面的一部分代码完全可以不要。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值