问题标题 : 如何控制打印机? ( 100 分)
答案提供者 : Another_eYes-25,jiangtao-20,zhaoyipeng-30, 王寒松 -25,
来自: pcw 时间: 99-01-24 22:38:05 ID: 99037 |
如何用 DELPHI4 编程序:使打印时纸张连续不断地打下去(不跳纸) ?
来自: Another_eYes 时间: 99-1-24 23:07:07 ID: 99040 |
windows 下不跳纸不可能,只能对跨页缝的那一行特殊处理。
1. 取得页长 (in pixel)
2. 打印时跟踪每行的高度和行间距 , 判断是否超过当前页长 , 假设超过值为 x)
3. 如果正好一页打完则从换页继续打印下一行;如果这行跨页,则换页,设开始位置为 (x- 行高 ) ,重打当前行一次
4. 继续以上操作直到全部打完
来自: 王寒松 时间: 99-3-9 4:28:53 ID: 101950 |
如果你是图形打印的话,那么跳纸问题只好自己去判断跟踪页高和当前打印位置来判断是否该换纸继续打。另一个方法是使用 DOS 下的行打印技术,在 WINDOWS 下实现比较麻烦。下面是将一个文本文件使用行打印技术到打印机的办法与 WINDOWS 图形打印不同的是:在行打印中需要绕过打印机驱动。
procedure PrintFile(const sFileName: string);
const
BufSize = 16384;
type
TDoc_Info_1 = record
pDocName: pChar;
pOutputFile: pChar;
pDataType: pChar;
end;
var
Count, BytesWritten: integer;
hPrinter: THandle;
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDeviceMode: THandle;
DocInfo: TDoc_Info_1;
f: file;
Buffer: Pointer;
begin
Printer.PrinterIndex := -1;
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then exit;
DocInfo.pDocName := 'MyDocument';
DocInfo.pOutputFile := nil;
DocInfo.pDatatype := 'RAW';
if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
begin
WinSpool.ClosePrinter(hPrinter);
exit;
end;
if not StartPagePrinter(hPrinter) then
begin
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
exit;
end;
System.Assign(f, sFileName);
try
Reset(f, 1);
GetMem(Buffer, BufSize);
while not eof(f) do
begin
Blockread(f, Buffer^, BufSize, Count);
if Count > 0 then
begin
if not WritePrinter(hPrinter, Buffer, Count, BytesWritten) then
begin
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
FreeMem(Buffer, BufSize);
exit;
end;
end;
end;
FreeMem(Buffer, BufSize);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
finally
System.Closefile( f );
end;
end;
上面的例子改一改就可以做成通用的行打,注意 uses 子句里一定要加上 WinSpool 。