关于CRicheditctrl分页打印问题

研究了好久,终于解决了,可以支持CRicheditCtrl图片打印。
void PrintRich()
{
   CString szprinter;
   CString szDevice,szDriver,szOutput;
   HDC hdcprint; // 定义一个设备环境句柄
   //定义一个打印作业
   DOCINFO di;//={sizeof(DOCINFO),"printer",NULL}; 
   ZeroMemory(&di, sizeof(di));  
   di.cbSize = sizeof(DOCINFO);   
   di.lpszDocName = _T("test");
   di.lpszOutput = _T("C:\\Users\\Desktop\\1.pdf");

   szDevice = _T("Microsoft Print to PDF");
   szDriver = _T("winspool");
   szOutput = _T("Ne02:");

   if((hdcprint=::CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
   {
      if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
      {
         CDC* pdc = m_richeditctrl.GetDC();
         CDC dcPrint;
         dcPrint.Attach(hdcprint);
         dcPrint.m_bPrinting = TRUE;

         StartPage(hdcprint); //打印机走纸,开始打印
         SaveDC(hdcprint); //保存打印机设备句柄

         long CharRange = 0;
         long LastChar = 0;
         FORMATRANGE fr;
         ::ZeroMemory(&fr, sizeof(FORMATRANGE));
         fr.hdc = hdcprint;
         fr.hdcTarget = hdcprint;
         int nHorizRes = dcPrint.GetDeviceCaps(HORZRES); 
         int nVertRes = dcPrint.GetDeviceCaps(VERTRES);  
         int nLogPixelsX = dcPrint.GetDeviceCaps(LOGPIXELSX);  
         int nLogPixelsY = dcPrint.GetDeviceCaps(LOGPIXELSY);  

         fr.rcPage.left = 0; 
         fr.rcPage.top = 0;
         fr.rcPage.right = (nHorizRes/nLogPixelsX) * 1440;
         fr.rcPage.bottom = (nVertRes/nLogPixelsY) * 1440;  
         fr.rc.left   = fr.rcPage.left + 1440;  
         fr.rc.top    = fr.rcPage.top + 1440;
         fr.rc.right  = fr.rcPage.right - 1440;
         fr.rc.bottom = fr.rcPage.bottom - 1440;
         CHARRANGE cr;
         cr.cpMin =0;
         cr.cpMax = -1;
         fr.chrg = cr;
         CharRange = m_richeditctrl.GetTextLength();
         do
         {
            dcPrint.StartPage();

            LastChar = m_richeditctrl.FormatRange( &fr, TRUE );
            cr.cpMin = LastChar;
            cr.cpMax = CharRange; 
            fr.chrg = cr;

            dcPrint.EndPage() ;
         }while(LastChar < CharRange);

         RestoreDC(hdcprint,-1); //恢复打印机设备句柄
         EndPage(hdcprint); //打印机停纸,停止打印
         EndDoc(hdcprint); //结束一个打印作业
         //        MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
         dcPrint.Detach(); 
      }
      // 用API函数DeleteDC销毁一个打印机设备句柄

      DeleteDC(hdcprint);
   }
   else
   {
      //    MessageBox("没有默认打印机,或者没有安装打印机!");
      return ;
   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值