分享

VC++ 调用API打印 (转载)

 我喝多了 2014-07-07




调用打印属性对话框:

if(::OpenPrinter("Adobe PDF", &hPrint, NULL))
  {
   ::PrinterProperties(m_hWnd, hPrint);
   ::ClosePrinter(hPrint);
  }
注:通过EnumPrinters可以枚举全部的本地、网络打印机信息,通过指定以上的方法,可以打开打印机属性对话框,建议通过以上方法修改打印机固定属性,比较安全。
枚举打印机
需要调用两次EnumPrinters函数,第一次的到结构体的大小,第二次得到打印机列表
DWORD dwNeeded, dwReturn;
// 得到结构大小
 BOOL bl = ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, NULL, 0,&dwNeeded, &dwReturn);
 
// 得到打印机设备列表
 PRINTER_INFO_4* p4;
 p4 = (PRINTER_INFO_4*)malloc(dwNeeded);
 ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, (PBYTE)p4, dwNeeded,&dwNeeded, &dwReturn);
for(int i=0;i< div> < dwNeeded;i++)
{
   TRACE("This is printer name : %s\r\n", p4[i].pPrinterName);
}
// 注意以上代码,NT以上系统支持,98不支持
最简单的一段打印程序
流程:
1、得到默认打印机名称(如果你不打算更改打印机的话,就不需要保存该选项)
2、保存默认打印机名称
3、设定新的默认打印机
4、取得默认打印机的选项
5、修改属性,如纸张选择,横纵等。6、打印输出
7、还原默认打印设备
// 得到默认打印设备名称
 CString strDefualtDev = TEXT("");
 PRINTDLG pd;
 LPDEVMODE lpDevMode;
 if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
 {
  lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
  if(lpDevMode)
  { 
   strDefualtDev = lpDevMode->dmDeviceName;
  }
  GlobalUnlock(pd.hDevMode);
 }
 // 指定的打印机名称
 ::SetDefaultPrinter("Adobe PDF");  // 在这里我选择的打印机是选定的Adobe虚拟打印机
 // 得到刚刚设定的打印机名称
 if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))   
 {
  lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);       
  if(lpDevMode)
  { 
   lpDevMode->dmPaperSize=DMPAPER_A4;    // 设定打印纸张幅面
   lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; // 设定横向打印
   lpDevMode->dmPrintQuality=600;     // 设定打印机分辨率
  }  
  GlobalUnlock(pd.hDevMode);
 }
 DOCINFO di;
 memset( &di, 0, sizeof(DOCINFO) );
 di.cbSize = sizeof(DOCINFO); 
 di.lpszDocName = "Bitmap Printing Test"; // 设定打印文档名称
 di.lpszOutput = (LPTSTR) NULL; 
 di.fwType = 0; 
 // Begin a print job by calling the StartDoc function. 
 int nError;
 HDC hdc = ::CreateDC(NULL, "Adobe PDF", NULL, lpDevMode); // 得到打印机设备句柄
 if(hdc != NULL)
 {
  if((nError = StartDoc(hdc, &di)) > 0)
  {
   if(StartPage(hdc)>0)
   {
    int xPage = ::GetDeviceCaps(hdc, HORZRES); // 得到可打印纸张的高度
    int yPage = ::GetDeviceCaps(hdc, VERTRES); // 得到可打印纸张的宽度
    // 在一下地方进行打印输出
    if(EndPage(hdc)>0) // 只有结束页成功了才可以关闭文档
     EndDoc(hdc); // 关闭打印文档
   }
  }
 }
 /// 还原默认的打印设备设定
 ::SetDefaultPrinter(strDefualtDev); 

/////////////////////////开始调取打印机-operation 001 ////////////////////////////////////
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;

PrintDlg(&printInfo);//调用API拿出默认打印机
DWORD rst = CommDlgExtendedError();//看看出错没有
if(rst != 0)
{//出错了,清空标志再次调用API,此时就会弹出打印设置对话框供用户选择了
MessageBox("默认打印机调取失败,请手动选择!");
printInfo.Flags = 0;
PrintDlg(&printInfo);
}
////////////////////////////001- end ////////////////////////////////////////////
////////////////////自定义纸张大小//////////////////////////////////////////////////
/*
//首先得到DEVMODE结构,同时申请系统锁定,我们要修改它了
LPDEVMODE lpDevMode = (LPDEVMODE)::GlobalLock(printInfo.hDevMode);
if(lpDevMode) //成功得到该结构了
{
lpDevMode->dmPaperSize = DMPAPER_USER; //自定义纸张

//设定自定义纸张标志
lpDevMode->dmFields = lpDevMode ->dmFields | DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH;

lpDevMode->dmPaperWidth = (short)width; //纸宽多少
lpDevMode->dmPaperLength = (short)height; //纸高多少

//顺便设定纸张走纸方向,横向还是纵向
lpDevMode->dmOrientation = DMORIENT_PORTRAIT;
}
//记住要解锁
GlobalUnlock(printInfo.hDevMode);

//这个也不能忘了,否则更改不会生效
ResetDC(printInfo.hDC, lpDevMode);
*/
HDC printDC=printInfo.hDC; //得到打印DC,输出到打印,
CDC cdc;
cdc.Attach(printDC);

得到了 dc之后就不用我再说了吧,自己搞定就是了,
————————————————————————————————————————————————
void   PrintTest()  
  {  
  CPrintDialog   pd(FALSE,   PD_ALLPAGES   |   PD_COLLATE   |   PD_NOPAGENUMS   |  

PD_HIDEPRINTTOFILE);   
  if(pd.GetDefaults())   
  {   
  DOCINFO   di;   
  memset(   &di,   0,   sizeof(DOCINFO)   );   
  di.cbSize   =   sizeof(DOCINFO);     
  di.lpszDocName   =   "Printing   Test";     
  di.lpszOutput   =   (LPTSTR)   NULL;     
  di.fwType   =   0;     
  HDC   hDC=pd.CreatePrinterDC();   
  CDC   dc;   
  dc.Attach(hDC);   
  dc.StartDoc(&di);     
  dc.StartPage();     
  dc.MoveTo(0,0);   
  dc.LineTo(1000,1000);   
  dc.EndPage();     
  dc.EndDoc();       
  dc.DeleteDC();     
  }   
  } 

HDC hdcPrint = GetDefaultPrinterDC();
 CPrintDialog pd(FALSE,PD_ALLPAGES|PD_ALLPAGES|PD_NOPAGENUMS,NULL);
 pd.DoModal();
 HDC hdcPrint = pd.CreatePrinterDC();
 if(hdcPrint == NULL)
 {
  MessageBox("打印机初始化失败!", "错误", MB_ICONSTOP);
  return;
 }


 /*   设置系统打印模式                 
  #define   DMORIENT_PORTRAIT       1       //纵向   
  #define   DMORIENT_LANDSCAPE     2       //横向                                           

                                 */   
  /************************************************************************/   
  void   CXTReportApp::SetLandscapeMode(int   PrintMode)   
  {   
  PRINTDLG   pd;   
        pd.lStructSize=(DWORD)sizeof(PRINTDLG);   
        BOOL   bRet=GetPrinterDeviceDefaults(&pd);   
        if(bRet)   
        {   
              //   protect   memory   handle   with   ::GlobalLock   and   ::GlobalUnlock   
              DEVMODE   FAR   *pDevMode=(DEVMODE   FAR   *)::GlobalLock(m_hDevMode);   
              //   set   orientation   to   landscape   
      if(PrintMode==1)//纵向打印   
      pDevMode->dmOrientation=DMORIENT_PORTRAIT;   
      else   if(PrintMode==2)//横向打印   
      pDevMode->dmOrientation=DMORIENT_LANDSCAPE;       
              ::GlobalUnlock(m_hDevMode);   
        }   
  } 
 

extern void DrawInfo(CDC &memDC, PRNINFO PrnInfo);

extern UINT m_nCxSelected ;

BOOL PrintSetup(HWND hParent, BOOL bDefault = FALSE);

BOOL Print(HWND hParent, LPCTSTR lpszDocName = "PrintListCtrl", BOOL bDefault = FALSE);

BOOL CPrintListCtrl::PrintSetup(HWND hParent, BOOL bDefault)
 {
  PRINTDLG stPD;

  memset(&stPD, 0, sizeof(stPD));

  stPD.lStructSize = sizeof(stPD);
  stPD.hwndOwner   = hParent;
  stPD.Flags       = PD_ALLPAGES | PD_DISABLEPRINTTOFILE |
                     PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
  stPD.hDevNames   =  NULL;
  stPD.hDevMode    = bDefault ? NULL : m_hDevMode;

  if (bDefault)
   {
    stPD.Flags |= PD_RETURNDEFAULT;
   }

  BOOL bRet = PrintDlg(&stPD);

  if (bRet == FALSE && CommDlgExtendedError()) return FALSE;

  if (bRet == FALSE && !CommDlgExtendedError()) return TRUE;

  ClearPrintDC();

  m_hPrintDC = stPD.hDC;

  return (m_hPrintDC != NULL);
 }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多