以下代码是以前在 csdn 找的,完全可以用,增加的新纸张(Form) 也增加了.
但是,有如下问题:
1、增加的新纸张增加到了打印机的“服务器属性”里面的纸张列表了。一些打印机如:Epson LQ -1600,300K....都可以用。以下代码也可以用。
2、但,我刚装了一个 HP Laser Jet 1020 的激光打印机,发现它的打印纸张列表和系统打印机的“服务器属性”里面的纸张列表不同。调用下面的代码增加的纸张只增加到系统打印机的“服务器属性”的纸张列表里,而没有增加到这个激光打印机的纸张列表里。
而打开这个激光打印机的“属性”->“打印首选项”,里面也可以增加新纸张并设置大小,程序里可以选择这个大小打印。
结论:也就是说,这个激光打印机的纸张列表属性和系统是分开的。下面的代码对这个另外的不起作用。
------------------------
问题:
如何程序向这个激光打印机的纸张列表增加新纸张呢?或者说,调用下面代码,向所有打印机的纸张列表都增加呢?
function TForm1.AddPrinterFormNT(FormName:string;width,height:integer):integer;
var
Device, Driver, Port: array[0..127] of char;
hDevMode: THandle;
PDevMode: PDeviceMode;
begin
result:=-2;
Printer.GetPrinter(Device, Driver, Port, hDevMode);
if hDevMode <> 0 then
begin
PDevMode := GlobalLock(hDevMode);
result:=WinNTSetForm(FormName,width,height,PDevMode, Device, Port);
end;
end;
function TForm1.WinNTSetForm(FormName:string;width,height:integer;PDevMode: PDeviceMode;Device: PChar; Port: PChar): integer;
var
hPrinter: THandle;
pForm: Pointer;
cbNeeded: DWORD;
cReturned: DWORD;
FormInfo1: TFormInfo1;
begin
Result := -2;
if OpenPrinter(Device, hPrinter, nil) then
begin
pForm := nil;
EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
GetMem(pForm, cbNeeded); //取pForm的大小并分配内存
try
if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
begin
if DeleteForm(hPrinter, PChar(FormName)) then
Dec(cReturned); //删除旧的Form
with FormInfo1 do
begin
Flags := 0;
pName := PChar(FormName);
Size.cx := width * 100;
Size.cy := height * 100;
with ImageAbleArea do
begin
Left := 0;
Top := 0;
Right := Size.cx;
Bottom := Size.cy;
end;
end;
if AddForm(hPrinter, 1, @FormInfo1) then
begin
Printer.PrinterIndex := Printer.PrinterIndex;
PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
PDevMode.dmPaperSize := cReturned + 1;
Printer.PrinterIndex := Printer.PrinterIndex;
Result := cReturned;
end;
end;
finally
FreeMem(pForm);
end;
end;
end;
但是,有如下问题:
1、增加的新纸张增加到了打印机的“服务器属性”里面的纸张列表了。一些打印机如:Epson LQ -1600,300K....都可以用。以下代码也可以用。
2、但,我刚装了一个 HP Laser Jet 1020 的激光打印机,发现它的打印纸张列表和系统打印机的“服务器属性”里面的纸张列表不同。调用下面的代码增加的纸张只增加到系统打印机的“服务器属性”的纸张列表里,而没有增加到这个激光打印机的纸张列表里。
而打开这个激光打印机的“属性”->“打印首选项”,里面也可以增加新纸张并设置大小,程序里可以选择这个大小打印。
结论:也就是说,这个激光打印机的纸张列表属性和系统是分开的。下面的代码对这个另外的不起作用。
------------------------
问题:
如何程序向这个激光打印机的纸张列表增加新纸张呢?或者说,调用下面代码,向所有打印机的纸张列表都增加呢?
function TForm1.AddPrinterFormNT(FormName:string;width,height:integer):integer;
var
Device, Driver, Port: array[0..127] of char;
hDevMode: THandle;
PDevMode: PDeviceMode;
begin
result:=-2;
Printer.GetPrinter(Device, Driver, Port, hDevMode);
if hDevMode <> 0 then
begin
PDevMode := GlobalLock(hDevMode);
result:=WinNTSetForm(FormName,width,height,PDevMode, Device, Port);
end;
end;
function TForm1.WinNTSetForm(FormName:string;width,height:integer;PDevMode: PDeviceMode;Device: PChar; Port: PChar): integer;
var
hPrinter: THandle;
pForm: Pointer;
cbNeeded: DWORD;
cReturned: DWORD;
FormInfo1: TFormInfo1;
begin
Result := -2;
if OpenPrinter(Device, hPrinter, nil) then
begin
pForm := nil;
EnumForms(hPrinter, 1, pForm, 0, cbNeeded, cReturned);
GetMem(pForm, cbNeeded); //取pForm的大小并分配内存
try
if EnumForms(hPrinter, 1, pForm, cbNeeded, cbNeeded, cReturned) then
begin
if DeleteForm(hPrinter, PChar(FormName)) then
Dec(cReturned); //删除旧的Form
with FormInfo1 do
begin
Flags := 0;
pName := PChar(FormName);
Size.cx := width * 100;
Size.cy := height * 100;
with ImageAbleArea do
begin
Left := 0;
Top := 0;
Right := Size.cx;
Bottom := Size.cy;
end;
end;
if AddForm(hPrinter, 1, @FormInfo1) then
begin
Printer.PrinterIndex := Printer.PrinterIndex;
PDevMode.dmFields := PDevMode.dmFields or DM_PAPERSIZE;
PDevMode.dmPaperSize := cReturned + 1;
Printer.PrinterIndex := Printer.PrinterIndex;
Result := cReturned;
end;
end;
finally
FreeMem(pForm);
end;
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货