关于打印纸张(200分)

  • 主题发起人 主题发起人 yychuan
  • 开始时间 开始时间
Y

yychuan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个打印控件,为什么用
getdevicecaps(printer.handle,physicalheight)得到的纸张高度比实际的纸张高度大
 
应该一样大的啊
 
不会吧,是你设置的问题
 
可能与打印机的分辨率有关。可检查驱动程序是否和打印机类型一致。
 
对,打印机驱动程序的问题
 
为什么不同的打印机上同一种型号的打印纸,用printer.pagewidth和printer.pageheight
得到的数值是不一样的呢?要得到打印纸的的大小用哪一个好呢得到的数值又是一样的呢?
 
转载(要uses winspool, printers;)
1, Escape( printer.handle, GETPHYSPAGESIZE, 0, nil, @physsize );可取得纸张的实际尺寸(点数,与打印机分辨率有关,把它转为
以Twips为单位就是实际尺寸)
2. pixelsperinchx := GetDeviceCaps( printer.handle, LOGPIXELSX );
Longint(printer.pagewidth) * 1440) div pixelsperinchx
可得到打印机可打印的范围尺寸(已转为Twips)。
type
PDevMode=^TDevMode;
TPrinterDev = class
Driver: string;
Device: string;
Port: string;
end;


implimentation

procedure TForm1.SetPrinter;
var
Devs: PDevMode;
DevsP: Pointer;
DevSize: integer;
PrinterObject: THandle;
DevName: string;
begin

PrinterObject:= Printer.Handle;
DevName:= TPrinterDev(Printer.Printers.Objects[Printer.PrinterIndex]).Device;
DevSize:=DocumentProperties(0,PrinterObject,PChar(DevName),Devs,Devs,0);
DevsP:=AllocMem(DevSize);
try
do
cumentProperties(0,PrinterObject,Pchar(DevName),nil,DevsP,DM_OUT_BUFFER);
Devs:=DevsP;
Devs^.dmFields:=DM_PAPERSIZE;
Devs^.dmPaperSize:=DMPAPER_FANFOLD_US;

// if use USER_DEFINE paper then

// this line change to
// Devs^.dmFields:= DM_PAPERSIZE or DM_PAPERLENGTH or DM_PAPERWIDTH;
// Devs^.dmPaperSize:=0;
// Devs^.dmPaperLength:= ur defined paper length value;
// Devs^.dmPaperWidth:= ur defined paper width value;
do
cumentProperties(0,PrinterObject,Pchar(DevName),DevsP,DevsP,DM_OUT_BUFFER or DM_IN_BUFFER);
finally
FreeMem(DevsP,DevSize);
end;

end;


end.

procedure ChangePaperType(value: Integer);
var
sDrv: Pchar;
sPrt: Pchar;
DevAdr: THandle;
p: PDeviceModeA;
begin

sdrv := allocmem(256);
sprt := allocmem(64);
devadr := 0;
try
printer.GetPrinter(sdrv, sdrv, sprt, devadr);
p := ptr(devadr);
p^.dmFields := DM_PAPERSIZE;
p^.dmPaperSize := value;
do
cumentProperties(0, printer.handle, sdrv, p^, p^,
DM_IN_BUFFER);
finally
freemem(sdrv, 1024);
freemem(sprt, 256);
end;

end;
 
以下代码,可以自定义纸张大小,没问题
var
Device :array [0..(cchDeviceName-1) ] of Char;
Driver :array [0..(MAX_PATH-1)] of char ;
Port : array[0..32] 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

pDMode^.dmPaperSize:=256;

pDMode^.dmPaperLength:=1000;//纸长
pDMode^.dmPaperWidth:=1000;//纸宽
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERSIZE;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERLENGTH;
pDMode^.dmFields:=pDMode^.dmFields or DM_PAPERWIDTH;
GlobalUnlock(hDMode);
Printer.PrinterIndex:=Printer.PrinterIndex;
end;

end;

begin
doc
//加入你的打印代码
enddoc
end;

//要在use 中加入 printers
 
多人接受答案了。
 
后退
顶部