⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 自定义打印纸张问题,可以随打印机的最小高度定义纸张大小
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,WinSpool, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  hPrinter: THandle;
implementation

{$R *.dfm}


Function GetDefaultPrinterName():PChar; //得到默认的打印机名称
var
  sIniFile, sSection, sKeyName,p,q: PChar;
begin
  sIniFile := 'win.ini';
  sSection := 'Windows';
  sKeyName := 'device';
  p:=StrAlloc(80);
  q:=StrAlloc(80);
  GetPrivateProfileString(sSection,sKeyName,nil,p,80,sIniFile);
  StrLCopy(q,p,(strscan(p,',')-p));
  Result := q;
end;

Function addpage():Boolean; //添加一打印纸张类型名称为300k
var
  FormInfo: TFormInfo1;
  PaperSize: TSize;
  PaperRect: TRect;
begin
  FormInfo.Flags := FORM_USER;
  FormInfo.pName := PChar('300k');
  PaperSize.cx := 100000;
  PaperSize.cy := 100000; //300k纸张的默认大小 1000mm*1000mm
  PaperRect.Left := 1;
  PaperRect.Top := 1;
  PaperRect.Right := 100000;
  PaperRect.Bottom := 100000; //纸张的边距
  FormInfo.Size := PaperSize;
  FormInfo.ImageableArea := PaperRect;
  AddForm(hPrinter, 1, @FormInfo);
  Result := True;
end;

Function changepape(p:string):Boolean; //改变当前的打印纸张设置
var
  FormInfos : Array [1..1024] of Form_Info_1;
  cbNeeded, cReturned ,neededsize: DWORD;
  i,j:integer;
  ppo:PRINTER_INFO_2;
  dev :PDeviceMode;
begin
  EnumForms(hPrinter, 1, Nil, 0, cbNeeded, cReturned);
  EnumForms(hPrinter, 1, @FormInfos, cbNeeded, cbNeeded, cReturned );
  j := 0;
  for i:= 1 to cReturned  do //通过轮寻找到300k的纸张的纸张类型排序号
    if FormInfos[i].pName = p then j:=i;
  if j=0 then
  begin
    addpage();
    j := cReturned + 1;
  end; //如无300k纸张则添加
  GetPrinter(hPrinter,2,Nil, 0, @NeededSize);
  GetPrinter(hPrinter, 2, @ppo, NeededSize, @NeededSize);
  dev := ppo.pDevMode;
  dev.dmPaperSize := j;
  ppo.pDevMode := dev;
  SetPrinter(hPrinter,2,@ppo,0); //定义打印机列表并选择300k纸张
  Result := True;
end;

Function MySetPrtInfo(P:string;W:Integer;L:Integer):Boolean;stdcall;
 //设置打印机的纸张类型为300k,并动态修改300k的大小和边距
var
  FormInfo: TFormInfo1;
  PaperSize: TSize;
  PaperRect: TRect;
begin
  OpenPrinter(GetDefaultPrinterName, hPrinter, nil);
  changepape(p); //改变纸张类型定义
  FormInfo.Flags := FORM_USER;
  FormInfo.pName :=pchar(p);
  PaperSize.cx := W*100;
  PaperSize.cy := L*100;
  PaperRect.Left := 0;
  PaperRect.Top := 0;
  PaperRect.Right := W*100;
  PaperRect.Bottom := L*100;
  FormInfo.Size := PaperSize;
  FormInfo.ImageableArea := PaperRect;
  SetForm(hPrinter,pchar(p),1,@FormInfo); //设置纸张大小
  ClosePrinter(hPrinter);
  Result := True;
end;

exports
  MySetPrtInfo;


procedure TForm1.Button1Click(Sender: TObject);
begin
  MySetPrtInfo('300k',2000,900);

  MySetPrtInfo('A4',2100,2970);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -