(转帖)程序设置打印机打印纸张

Q:如何在用程序设置打印机打印纸张大小的问题?  
  A:  
  //方法一  
          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="打印测试";//有的打印机如果没有标题是无法打印数据的,所以标题一定要有  
      Prntr->Canvas->Font->Size   =   20;  
      Prntr->Canvas->TextOutA(100,100,"打印测试代码");  
      Prntr->EndDoc();  
  //方法二  
          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,   "打印测试代码!",17);  
          EndPage(PrnHdc);  
          EndDoc(PrnHdc);  
          DeleteDC(PrnHdc);  
          free(DocInfo);  
          free(PrnInfo);  
          free(DevMode);  
  Top

6 楼RedProgramer(TST : RedSteel)回复于 2002-09-02 11:22:27 得分 0

你可以用TMetafile,在上面绘出你的图,通过修改TMetafile  
  的MMHeight和MMWidth属性就可以做到所见即所得,至于取设定的纸张尺寸,可以这样:  
  int   GetPrinterXResolution()//取X方向采样分辨率  
  {  
          TPrinter   *   Prntr   =Printer();  
          char   *ADevice,*ADriver,*APort;  
          int   Result=1;  
          int   Resolution;  
          ADevice=new   char[100];  
          ADriver=new   char[100];  
          APort=new   char[100];  
          THandle   DeviceHandle;  
          PDeviceMode   DevMode;  
          Prntr->GetPrinter(ADevice,ADriver,APort,DeviceHandle);  
          DevMode=(_devicemodeA*)GlobalLock((void*)DeviceHandle);  
          Resolution=DevMode->dmPrintQuality;   //为X方向采样率  
          for(int   i=0;Result!=0||i<5;i++)  
                  Result=GlobalUnlock((void*)DeviceHandle);  
          delete   []   APort;  
          delete   []   ADriver;  
          delete   []   ADevice;  
          return   Resolution;  
  }  
  int   GetPrinterYResolution()//取Y方向采样分辨率  
  {  
          TPrinter   *   Prntr   =Printer();  
          char   *ADevice,*ADriver,*APort;  
          int   Result=1;  
          int   Resolution;  
          ADevice=new   char[100];  
          ADriver=new   char[100];  
          APort=new   char[100];  
          THandle   DeviceHandle;  
          PDeviceMode   DevMode;  
          Prntr->GetPrinter(ADevice,ADriver,APort,DeviceHandle);  
          DevMode=(_devicemodeA*)GlobalLock((void*)DeviceHandle);  
          Resolution=DevMode->dmYResolution;  
          for(int   i=0;Result!=0||i<5;i++)  
                  Result=GlobalUnlock((void*)DeviceHandle);  
          delete   []   APort;  
          delete   []   ADriver;  
          delete   []   ADevice;  
          return   Resolution;  
  }  
  上边的采样率的单位为(象素/英寸)  
  Top

7 楼hotxu(hotxu)回复于 2002-09-02 11:24:30 得分 0

int   OldPaperSize;  
      int   OldOrientation;  
      int   OldTop;  
      int   OldBottom;  
      int   OldLeft;  
      int   OldRight;  
   
      DEVMODE   *pDev;  
      LPPAGESETUPDLG   mylp=new   PAGESETUPDLG;  
      memset((void   *)mylp,0,sizeof   (PAGESETUPDLG));  
      mylp->lStructSize=sizeof(PAGESETUPDLG);  
      mylp->hwndOwner=this->Handle;  
      mylp->Flags=PSD_RETURNDEFAULT;  
      PageSetupDlg(   mylp   );  
      if   (mylp->hDevMode!=NULL){  
      pDev=(DEVMODE   *)GlobalLock(mylp->hDevMode);  
      pDev->dmPaperSize   =OldPaperSize;  
      pDev->dmOrientation   =OldOrientation;  
      mylp->rtMargin.left   =OldLeft;  
      mylp->rtMargin.right   =OldRight;  
      mylp->rtMargin.top   =OldTop;  
      mylp->rtMargin.bottom=OldBottom;  
      GlobalUnlock(mylp->hDevMode);  
      mylp->Flags=PSD_MARGINS|PSD_INHUNDREDTHSOFMILLIMETERS;  
      if(PageSetupDlg(mylp)){  
      pDev=(DEVMODE   *)GlobalLock(mylp->hDevMode);  
      OldPaperSize   =pDev->dmPaperSize;  
      if(OldPaperSize>28)OldPaperSize=9;//A4  
      OldOrientation=pDev->dmOrientation;  
      OldLeft   =mylp->rtMargin.left;  
      OldRight   =mylp->rtMargin.right;  
      OldTop   =mylp->rtMargin.top;  
      OldBottom   =mylp->rtMargin.bottom;  
      QRMJzzd->QuickRep1->Page->Orientation   =OldOrientation-1;  
      QRMJzzd->QuickRep1->Page->PaperSize=OldPaperSize;  
      QRMJzzd->QuickRep1->Page->LeftMargin   =OldLeft/100;  
      QRMJzzd->QuickRep1->Page->RightMargin   =OldRight/100;  
      QRMJzzd->QuickRep1->Page->TopMargin   =OldTop/100;  
      QRMJzzd->QuickRep1->Page->BottomMargin=OldBottom/100;  
      GlobalUnlock(mylp->hDevMode);  
      }  
      GlobalFree(mylp->hDevMode);  
  }  
      delete   mylp;  
      QRPreview1->PageNumber=1;  
      QRMJzzd->QuickRep1->Prepare();  
      QRMJzzd->QuickRep1->Preview();Top

8 楼RedProgramer(TST : RedSteel)回复于 2002-09-02 11:24:50 得分 0

void   GetPrinterPaperSize(int   &   PaperLength,   int   &   PaperWidth)  
  {//取打印纸的尺寸,单位为毫米  
          TPrinter   *   Prntr   =Printer();  
          char   *ADevice,*ADriver,*APort;  
          ADevice=new   char[100];  
          ADriver=new   char[100];  
          APort=new   char[100];  
          THandle   DeviceHandle;  
          PDeviceMode   DevMode;  
          Prntr->GetPrinter(ADevice,ADriver,APort,DeviceHandle);  
          DevMode=(_devicemodeA*)GlobalLock((void*)DeviceHandle);  
          //因为DevMode的dmPaperLength和dmPaperWidth属性的单位为毫米的十分之一,  
          //所以要转为毫米时需除于十;  
          PaperLength=DevMode->dmPaperLength/10;   //因为DevMode->dmPaperLength  
          PaperWidth=DevMode->dmPaperWidth/10;  
          if(PaperLength==0&&PaperWidth==0)//判断是否设置了dmPaperSize  
          {  
                  switch(DevMode->dmPaperSize)  
                  {  
                  case   DMPAPER_LETTER:  
                          PaperLength=11.0*25.4+0.5;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_LEGAL:// Legal,   8   1/2-   by   14-inches  
                          PaperLength=14.0*25.4+0.5;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_A4:// A4   Sheet,   210-   by   297-millimeters  
                          PaperLength=297;  
                          PaperWidth=210;  
                          break;  
                  case   DMPAPER_CSHEET:// C   Sheet,   17-   by   22-inches  
                          PaperLength=22.0*25.4+0.5;  
                          PaperWidth=17.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_DSHEET:// D   Sheet,   22-   by   34-inches  
                          PaperLength=34.0*25.4+0.5;  
                          PaperWidth=22.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_ESHEET:   //E   Sheet,   34-   by   44-inches  
                          PaperLength=44.0*25.4+0.5;;  
                          PaperWidth=34.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_LETTERSMALL:// Letter   Small,   8   1/2-   by   11-inches  
                          PaperLength=11.0*25.4+0.5;;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_TABLOID:// Tabloid,   11-   by   17-inches  
                          PaperLength=17.0*25.4+0.5;;  
                          PaperWidth=11.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_LEDGER:// Ledger,   17-   by   11-inches  
                          PaperLength=17.0*25.4+0.5;;  
                          PaperWidth=11.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_STATEMENT:// Statement,   5   1/2-   by   8   1/2-inches  
                          PaperLength=8.5*25.4+0.5;;  
                          PaperWidth=5.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_EXECUTIVE:// Executive,   7   1/4-   by   10   1/2-inches  
                          PaperLength=10.5*25.4+0.5;;  
                          PaperWidth=7.25*25.4+0.5;  
                          break;  
                  case   DMPAPER_A3:// A3   sheet,   297-   by   420-millimeters  
                          PaperLength=420;  
                          PaperWidth=297;  
                          break;  
                  case   DMPAPER_A4SMALL:// A4   small   sheet,   210-   by   297-millimeters  
                          PaperLength=297;  
                          PaperWidth=210;  
                          break;  
                  case   DMPAPER_A5:// A5   sheet,   148-   by   210-millimeters  
                          PaperLength=210;  
                          PaperWidth=148;  
                          break;  
                  case   DMPAPER_B4:// B4   sheet,   250-   by   354-millimeters  
                          PaperLength=250;  
                          PaperWidth=354;  
                          break;  
                  case   DMPAPER_B5:// B5   sheet,   182-   by   257-millimeter   paper  
                          PaperLength=257;  
                          PaperWidth=182;  
                          break;  
                  case   DMPAPER_FOLIO:// Folio,   8   1/2-   by   13-inch   paper  
                          PaperLength=13.0*25.4+0.5;;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_QUARTO:// Quarto,   215-   by   275-millimeter   paper  
                          PaperLength=275;  
                          PaperWidth=215;  
                          break;  
                  case   DMPAPER_10X14:// 10-   by   14-inch   sheet  
                          PaperLength=14.0*25.4+0.5;;  
                          PaperWidth=10.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_11X17:// 11-   by   17-inch   sheet  
                          PaperLength=17.0*25.4+0.5;;  
                          PaperWidth=11.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_NOTE:// Note,   8   1/2-   by   11-inches  
                          PaperLength=11.0*25.4+0.5;;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_9:// #9   Envelope,   3   7/8-   by   8   7/8-inches  
                          PaperLength=8.875*25.4+0.5;;  
                          PaperWidth=3.875*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_10:// #10   Envelope,   4   1/8-   by   9   1/2-inches  
                          PaperLength=9.5*25.4+0.5;;  
                          PaperWidth=4.125*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_11:// #11   Envelope,   4   1/2-   by   10   3/8-inches  
                          PaperLength=10.375*25.4+0.5;;  
                          PaperWidth=4.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_12:// #12   Envelope,   4   3/4-   by   11-inches  
                          PaperLength=11.0*25.4+0.5;;  
                          PaperWidth=4.75*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_14:// #14   Envelope,   5-   by   11   1/2-inches  
                          PaperLength=11.5*25.4+0.5;;  
                          PaperWidth=5.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_DL:// DL   Envelope,   110-   by   220-millimeters  
                          PaperLength=220;  
                          PaperWidth=110;  
                          break;  
                  case   DMPAPER_ENV_C5:// C5   Envelope,   162-   by   229-millimeters  
                          PaperLength=229;  
                          PaperWidth=162;  
                          break;  
                  case   DMPAPER_ENV_C3:// C3   Envelope,     324-   by   458-millimeters  
                          PaperLength=458;  
                          PaperWidth=324;  
                          break;  
                  case   DMPAPER_ENV_C4:// C4   Envelope,     229-   by   324-millimeters  
                          PaperLength=324;  
                          PaperWidth=229;  
                          break;  
                  case   DMPAPER_ENV_C6:// C6   Envelope,     114-   by   162-millimeters  
                          PaperLength=162;  
                          PaperWidth=114;  
                          break;  
                  case   DMPAPER_ENV_C65:// C65   Envelope,   114-   by   229-millimeters  
                          PaperLength=229;  
                          PaperWidth=114;  
                          break;  
                  case   DMPAPER_ENV_B4:// B4   Envelope,     250-   by   353-millimeters  
                          PaperLength=353;  
                          PaperWidth=250;  
                          break;  
                  case   DMPAPER_ENV_B5:// B5   Envelope,     176-   by   250-millimeters  
                          PaperLength=250;  
                          PaperWidth=176;  
                          break;  
                  case   DMPAPER_ENV_B6:// B6   Envelope,     176-   by   125-millimeters  
                          PaperLength=176;  
                          PaperWidth   =125;  
                          break;  
                  case   DMPAPER_ENV_ITALY:// Italy   Envelope,   110-   by   230-millimeters  
                          PaperLength=230;  
                          PaperWidth=110;  
                          break;  
                  case   DMPAPER_ENV_MONARCH:// Monarch   Envelope,   3   7/8-   by   7   1/2-inches  
                          PaperLength=7.5*25.4+0.5;  
                          PaperWidth=3.875*25.4+0.5;  
                          break;  
                  case   DMPAPER_ENV_PERSONAL:// 6   3/4   Envelope,   3   5/8-   by   6   1/2-inches  
                          PaperLength=6.75*25.4+0.5;  
                          PaperWidth=3.625*25.4+0.5;  
                          break;  
                  case   DMPAPER_FANFOLD_US:// US:   Std   Fanfold,   14   7/8-   by   11-inches  
                          PaperLength=14.875*25.4+0.5;  
                          PaperWidth=11.0*25.4+0.5;  
                          break;  
                  case   DMPAPER_FANFOLD_STD_GERMAN:// German   Std   Fanfold,   8   1/2-   by   12-inches  
                          PaperLength=12.0*25.4+0.5;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  case   DMPAPER_FANFOLD_LGL_GERMAN:// German   Legal   Fanfold,   8   1/2-   by   13-inches  
                          PaperLength=13.0*25.4+0.5;  
                          PaperWidth=8.5*25.4+0.5;  
                          break;  
                  default:  
                          break;  
                  }  
          }  
          int   s=1;  
          for(int   i=0;s!=0||i<5;i++)  
                  s=GlobalUnlock((void*)DeviceHandle);  
  }  
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值