Delphi中如何控制打印方向,纸张大小等

 

 如何在程序里控制打印纸张大小(A3,A4)和打印方向?不想打开设置窗口     
  ---------------------------------------------------------------      
     
  Uses     Printer;      
  .........      
  procedure     TForm1.Button1Click(Sender:     TObject);      
  var      
        ADevice,     ADriver,     APort:     array[0..255]     of     Char;      
        DeviceHandle:     THandle;      
        DevMode:     PDeviceMode;      
  begin      
                //初始化打印机      
                Printer.GetPrinter(ADevice,     ADriver,     APort,     DeviceHandle);      
                if     DeviceHandle     =     0     then      
                begin      
                        Printer.PrinterIndex     :=     Printer.PrinterIndex;      
                        Printer.GetPrinter(ADevice,     ADriver,     APort,     DeviceHandle);      
                end;      
                if     DeviceHandle     =     0     then      
                        Raise     Exception.Create('不能初始化打印机!')      
                else      
                        DevMode     :=     GlobalLock(DeviceHandle);      
                if     DeviceHandle     <>     0     then      
                begin      
                        with     DevMode^     do      
                        begin      
                                dmFields     :=     dmFields     or     DM_ORIENTATION;      
                                //在下面这里设置打印方向      
                                dmOrientation     :=     DMORIENT_LANDSCAPE;     //DMORIENT_PORTRAIT      
                                dmPaperSize     :=     DMPAPER_A3;                  
                                Printer.SetPrinter(ADevice,     ADriver,     APort,     DeviceHandle);      
                                GlobalUnLock(DeviceHandle);      
                        end;      
                end;      
     
                PrinterSetupDialog1.Execute;     //验证一下设置是否成功了      
  end;      
     
   
  *************   
    printer.pagewidth是只读属性      
  ---------------------------------------------------------------      
     
  参考这个       
      
var        

 hDMode:     THandle;       
 PDMode:     PDEVMODE;       
Printer.GetPrinter(Device,     Driver,     Port,     hDMode);      
     
        if     hDMode     <>     0     then      
        begin      
                pDMode     :=     GlobalLock(hDMode);      
                if     pDMode     <>     nil     then      
                begin      
                                pDMode^.dmFields     :=     DM_PAPERSIZE     or     DM_PAPERWIDTH     or     DM_PAPERLENGTH;      
                                pDMode^.dmPaperSize     :=     DMPAPER_USER;      
                                pDMode^.dmPaperWidth     :=     APaperWidth;      
                                pDMode^.dmPaperLength     :=     APaperHeight;      
     
                                pDMode^.dmFields:=pDMode^.dmFields     or     DM_ORIENTATION;      
                                pDMode^.DMORIENTATION:=     Direct;      
                end;      
        end;      
  //打印机设置的纸张大小      
  ---------------------------------------------------------------       
   
  在执行打印前调用以下函数:      
  procedure     SetPaperSize(X,     Y:     Integer);      
  //     单位是0.1mm      
  //     A4时     Printer.Pagewidth:=1440;         A5时     Printer.Pagewidth:=1049;      
  //     B5时     Printer.Pagewidth:=1290;         16K时     Printer.Pagewidth:=1035;      
  //     lq1600宽行打印机这个值宽度最大为42cm左右,     长度大约2m。      
  //改变devicemode结构      
  var      
        Device:     array[0..255]     of     char;      
        Driver:     array[0..255]     of     char;      
        Port:     array[0..255]     of     char;      
        hDMode:     THandle;      
        PDMode:     PDEVMODE;      
  begin      
        Printer.PrinterIndex     :=     Printer.PrinterIndex;      
        Printer.GetPrinter(Device,     Driver,     Port,     hDMode);      
        if     hDMode     <>     0     then      
        begin      
                pDMode     :=     GlobalLock(hDMode);      
                if     pDMode     <>     nil     then      
                begin      
                        if     (x     =     0)     or     (y     =     0)     then      
                        begin      
                                {Set     to     legal}      
                                pDMode^.dmFields     :=     pDMode^.dmFields     or     dm_PaperSize;      
                                {pDMode^.dmPaperSize     :=     DMPAPER_LEGAL;     changed     by     wulianmin}      
                                pDMode^.dmPaperSize     :=     DMPAPER_FANFOLD_US;      
                        end      
                        else      
                        begin      
                                {Set     to     custom     size}      
                                pDMode^.dmFields     :=     pDMode^.dmFields     or      
                                        DM_PAPERSIZE     or      
                                        DM_PAPERWIDTH     or      
                                        DM_PAPERLENGTH;      
                                pDMode^.dmPaperSize     :=     DMPAPER_USER;      
                                pDMode^.dmPaperWidth     :=     x     {SomeValueInTenthsOfAMillimeter};      
                                pDMode^.dmPaperLength     :=     y     {SomeValueInTenthsOfAMillimeter};      
                        end;      
                        {设定纸张来源}      
                        pDMode^.dmFields     :=     pDMode^.dmFields     or     DMBIN_MANUAL;      
                        pDMode^.dmDefaultSource     :=     DMBIN_MANUAL;      
     
                        GlobalUnlock(hDMode);      
                end;      
        end;      
        Printer.PrinterIndex     :=     Printer.PrinterIndex;      
        //以下开始打印      
        Printer.BeginDoc;      
        Printer.Canvas.TextOut(100,100,     'Test     1');      
        Printer.EndDoc;      
  end;     

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值