很实用的VC打印代码

来源:互联网 发布:网易股票分时数据 编辑:程序博客网 时间:2024/05/01 18:57
///选择打印机对话框      CDC memDC;      HDC hdcPrint = NULL;      CPrintDialog dlg(FALSE);      if (true)  //打印按钮,不弹出选择对话框,获取默认打印设备      {          PRINTDLG printInfo;          ZeroMemory(&printInfo,sizeof(printInfo));  //清空该结构          printInfo.lStructSize = sizeof(printInfo);             printInfo.hwndOwner = 0;             printInfo.hDevMode = 0;          printInfo.hDevNames = 0;          //这个是关键,PD_RETURNDC 如果不设这个标志,就拿不到hDC了          //PD_RETURNDEFAULT 这个就是得到默认打印机,不需要弹出设置对话框          printInfo.Flags = PD_RETURNDC | PD_RETURNDEFAULT | PD_ALLPAGES;                      PrintDlg(&printInfo);//调用API拿出默认打印机          DWORD rst = CommDlgExtendedError();//看看出错没有          if(rst != 0)        {//出错了,清空标志再次调用API,此时就会弹出打印设置对话框供用户选择了              printInfo.Flags = 0;              PrintDlg(&printInfo);          }                    hdcPrint = printInfo.hDC; //得到打印DC,输出到打印      }      else  //弹出对话框选择打印设备      {          dlg.DoModal();          hdcPrint = dlg.GetPrinterDC();      }            if(hdcPrint == NULL)      {          AfxMessageBox(_T("打印机初始化失败!"));                   return;      } memDC.Attach(hdcPrint); if(memDC.m_hDC == NULL)          return; int nPaperSize_X = memDC.GetDeviceCaps(HORZSIZE);    // 纸张宽度      int nPaperSize_Y = memDC.GetDeviceCaps(VERTSIZE);    // 纸张高度     int xP = memDC.GetDeviceCaps(LOGPIXELSX);    //x方向每英寸像素点数      int yP = memDC.GetDeviceCaps(LOGPIXELSY);    //y方向每英寸像素点数      double xPix = (DOUBLE)xP*10/254;   //每 mm 宽度的像素      double yPix = (DOUBLE)yP*10/254;   //每 mm 高度的像素 TCHAR szTitle[] = _T("ecg_printer"); //真正打印部分      static DOCINFO di = {sizeof (DOCINFO),  szTitle} ;      //开始文档打印/////////////////////////////////////////     start print      //////////////////////////////////////////////////////////      if(memDC.StartDoc( &di ) < 0) // startdoc-----enddoc      {          AfxMessageBox(_T("连接到打印机化败!"));     }      else      {//开始页           if(memDC.StartPage() < 0)           {                AfxMessageBox(_T("打印失败!"));                memDC.AbortDoc();                return;           }           else          {//上横线             memDC.MoveTo(100, int(10 * yPix));              memDC.LineTo(100, int(110 * yPix) ); memDC.MoveTo(200, int(10 * yPix));              memDC.LineTo(200, int(160 * yPix) ); memDC.MoveTo(300, int(10 * yPix));              memDC.LineTo(300, int(210 * yPix) ); memDC.MoveTo(400, int(10 * yPix));              memDC.LineTo(400, int(260 * yPix) ); memDC.EndPage(); }  memDC.EndDoc(); }memDC.DeleteDC(); 

打印功能经常用到,也整理了好多次了。但是每次用完后都随手丢了。这次记录下来,以防后查。
0 0