vc设置打印机模式并预览 您所在的位置:网站首页 printerproperties vc设置打印机模式并预览

vc设置打印机模式并预览

#vc设置打印机模式并预览| 来源: 网络整理| 查看: 265

调用打印属性对话框: 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); }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有