« Delphi 2007已内建对GIF动画显示的持Delphi中窗体于线程消息传递的方法 »

TPrinter程序控制自定义纸张

我修改成功一部分,经过测试成功。(转自CSDN相关帖子)    
          char   Device[CCHDEVICENAME];  
          char   Driver[MAX_PATH];  
          char   Port[32];  
          PDevMode   pDev;  
          THandle     hDev;  
          TPrinter   *Prntr   =   Printer();  
   
          HANDLE   hPrinter;  
          Prntr->GetPrinter(Device,Driver,Port,hDev);  
          if(hDev!=0)  
          {  
                  pDev   =(PDevMode)GlobalLock((void*)hDev);  
                  if(pDev!=NULL)  
                  {  
   
                          pDev->dmPaperSize=DMPAPER_USER;  
                          pDev->dmPaperLength   =   1500;//这儿的值不能太大了,太大了就有问题,这也是我以前不成功的原因。  
                          pDev->dmPaperWidth     =   2000;//同样这儿的数值也不能太大。  
                          pDev->dmFields   =   (pDev->dmFields)|(DM_PAPERSIZE);  
                          pDev->dmFields   =   (pDev->dmFields)|(DM_PAPERLENGTH);  
                          pDev->dmFields   =   (pDev->dmFields)|(DM_PAPERWIDTH);  
                  }  
                  ResetDC(Prntr->Handle,pDev);  
                  GlobalUnlock((void*)hDev);  
          }  
      Prntr->BeginDoc();  
      Prntr->Title="hello";  
      Prntr->Canvas->Font->Size   =   20;  
      Prntr->Canvas->TextOutA(100,100,"生石膏的大概撒搞活");  
      Prntr->EndDoc();  

 

BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-07-23 14:07:05 得分 0

#include   "printers.hpp"  
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
      char   Device[CCHDEVICENAME];  
      char   Driver[MAX_PATH];  
      char   Port[32];  
      THandle       hDMode;  
      PDevMode     pDMode;  
   
      TPrinter   *Prn   =   Printer();  
      Prn->GetPrinter(Device,Driver,Port,hDMode);  
      pDMode=(PDevMode)GlobalLock((HGLOBAL   &)hDMode);  
   
      pDMode->dmPaperSize=   256;  
      pDMode->dmFields=pDMode->dmFields   |   DM_PAPERSIZE;  
      pDMode->dmPaperLength   =1016;     //高:4英寸=101.6mm  
      pDMode->dmFields   =pDMode->dmFields|   DM_PAPERLENGTH;  
      pDMode->dmPaperWidth   =   2540;     //宽:10英寸=25.40mm  
      pDMode->dmFields   =pDMode->dmFields|   DM_PAPERWIDTH;  
   
      ResetDC(Prn->Handle,pDMode);  
      GlobalUnlock((HGLOBAL   &)hDMode);  
   
      Prn->BeginDoc();  
      Prn->Canvas->Font->Name   =   "宋体";  
      Prn->Canvas->Font->Size   =   20;  
      Prn->Canvas->TextOutA   (0,0,"页首");  
      Prn->EndDoc();  
  }  
  俺好试了!  
  缺省打印机本来设在11*10inch,本程序设成10*4inch,  
  连打印3次,准确换页,打完后查看并没有改变打印机的原缺省纸张大小,怪。  
  但英寸是人工转换成mm的,这会产生小误省,有没有办法直接设成英寸?!

Wingsun(孙春阳)回复于 2001-07-23 14:32:45 得分 0

第二种方法,经过试验也成功了:  
          HANDLE   PrnHd;  
          PPrinterInfo1   PrnInfo   ;  
          DWORD   pcbNeeded   ;  
          DWORD   PDevModeBytes   ;  
          LPDEVMODE   DevMode;  
          HDC   PrnHdc;  
          PDocInfo   DocInfo   ;  
   
          TPrinter   *Prntr   =   Printer();  
   
          OpenPrinter(Prntr->Printers->Strings[Prntr->PrinterIndex].c_str(),&PrnHd,NULL);  
   
          PrnInfo=(PPrinterInfo1)malloc(1024);  
          GetPrinter(PrnHd,1,(LPBYTE)PrnInfo,1024,&pcbNeeded);  
   
          PDevModeBytes=   DocumentProperties(   Handle,PrnHd,PrnInfo->pDescription,NULL,NULL,0   );  
   
          DevMode=(LPDEVMODE)malloc(PDevModeBytes);  
          DocumentProperties(   Handle,PrnHd,PrnInfo->pDescription,DevMode,NULL,DM_OUT_BUFFER   );  
   
          DevMode->dmPaperSize   =   DMPAPER_USER;//DMPAPER_A4   ;  
   
          DevMode->dmPaperWidth   =1600;  
          DevMode->dmPaperLength=1600;  
          DevMode->dmFields   =   DevMode->dmFields   |   DM_PAPERSIZE;  
          DevMode->dmFields   =   DevMode->dmFields   |   DM_PAPERLENGTH;  
          DevMode->dmFields   =   DevMode->dmFields   |   DM_PAPERWIDTH;  
          DocumentProperties(   Handle,PrnHd,PrnInfo->pDescription,DevMode,DevMode,DM_OUT_BUFFER   |   DM_IN_BUFFER);  
   
          PrnHdc   =   CreateDC(   NULL,   Prntr->Printers->Strings[Prntr->PrinterIndex].c_str(),NULL,DevMode   );  
          DocInfo=(PDocInfo)malloc(100   );  
          DocInfo->cbSize   =   sizeof(DocInfo);  
          DocInfo->lpszDocName   =   NULL;  
          DocInfo->lpszOutput   =   NULL;  
          DocInfo->lpszDatatype   =   NULL;  
          DocInfo->fwType   =   DI_APPBANDING;  
          StartDoc(   PrnHdc,   DocInfo);  
          StartPage(PrnHdc);  
          TextOut(   PrnHdc,   10,   10,   "Hello   My   Friend!",17);  
          EndPage(PrnHdc);  
          EndDoc(PrnHdc);  
          DeleteDC(PrnHdc);  
          free(DocInfo);  
          free(PrnInfo);  
          free(DevMode);  

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。