function WinNTSetForm(PDevMode: PDeviceMode;Device: PChar; Port: PChar): Boolean;
var
hPrinter: THandle;
pForm: Pointer;
cbNeeded: DWORD;
cReturned: DWORD;
FormInfo1: TFormInfo1;
begin
Result := False;
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(CustomFormName)) then
Dec(cReturned); //删除旧的Form
with FormInfo1 do
begin
Flags := 0;
pName := PChar(CustomFormName);
Size.cx := AWidth * 100;
Size.cy := AHeight * 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 := True;
end;
end;
finally
FreeMem(pForm);
end;
ClosePrinter(hPrinter);
end;
end;以上代码可以在XP或2000下实现自定义纸张,但是只能是打印机接在本机上才可以,如果是网络打印机的就不行,经过单步跟踪,发现打印机接在本机,AddForm(hPrinter, 1, @FormInfo1) 能返回真值,如果是网络打印机,则AddForm(hPrinter, 1, @FormInfo1)返加假,没办法设置纸张,难道网络打印机就不可能自定义纸张吗?高手们帮帮忙,谢谢!
var
hPrinter: THandle;
pForm: Pointer;
cbNeeded: DWORD;
cReturned: DWORD;
FormInfo1: TFormInfo1;
begin
Result := False;
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(CustomFormName)) then
Dec(cReturned); //删除旧的Form
with FormInfo1 do
begin
Flags := 0;
pName := PChar(CustomFormName);
Size.cx := AWidth * 100;
Size.cy := AHeight * 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 := True;
end;
end;
finally
FreeMem(pForm);
end;
ClosePrinter(hPrinter);
end;
end;以上代码可以在XP或2000下实现自定义纸张,但是只能是打印机接在本机上才可以,如果是网络打印机的就不行,经过单步跟踪,发现打印机接在本机,AddForm(hPrinter, 1, @FormInfo1) 能返回真值,如果是网络打印机,则AddForm(hPrinter, 1, @FormInfo1)返加假,没办法设置纸张,难道网络打印机就不可能自定义纸张吗?高手们帮帮忙,谢谢!
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;282474#4