高分 500 -- 连续打印(急)--谢绝灌水(300分)

  • 主题发起人 R_Baggio
  • 开始时间
无边框?哈哈
 
有办法吗?[8D]
 
1、打开LPT文件,你就可以使用ESC命令了
2、把打印机设置为图形模式,图形高度为24(24点好象是最小高度了)
3、送出需要的点阵,就会打印一行
 
问题是我现在有输出CANVAS啊!
着急啊!
都放了一周了!
居然没人会?[:D]
 
你的纸必须很长,比如10米的
然后设置纸张大小,比如设成 20厘米长(每次打20厘米长的图象),
设置页的上下边距为 0,然后打印
//添加新纸型,你也可以在打印机里手动添加新纸型
procedure TForm1.Button1Click(Sender: TObject);
var
PrintDevice, PrintDriver, PrintPort : array[0..255] of Char;
hDMode : THandle;
hPrinter: THandle;
FormInfo: TFormInfo1;
PaperSize: TSize;
PaperRect: TRect;
errcode: integer;
s: string;
begin
Printer.GetPrinter(PrintDevice, PrintDriver, PrintPort, hDMode);
OpenPrinter(PrintDevice, hPrinter, nil);
if hPrinter = 0 then
raise Exception.Create('Failed to open printer!');
FormInfo.Flags := FORM_USER;
FormInfo.pName := PChar('新格式3');
PaperSize.cx := 20000;//看 API 说明
PaperSize.cy := 20000;
PaperRect.Left := 1;
PaperRect.Top := 1;
PaperRect.Right := 20000;
PaperRect.Bottom := 20000;
FormInfo.Size := PaperSize;
FormInfo.ImageableArea := PaperRect;
if not AddForm(hPrinter, 1, @FormInfo) then
begin
errcode := GetLastError;
if errcode <> ERROR_FILE_EXISTS then
// Form name exists?
begin
case errcode of
ERROR_ACCESS_DENIED: s := 'Access is denied';
ERROR_INVALID_HANDLE: s := 'The handle is invalid';
ERROR_NOT_READY: s := 'The device is not ready';
ERROR_INVALID_FORM_SIZE : s:= 'Invalid From Size';
ERROR_CALL_NOT_IMPLEMENTED:
s := 'Function "AddForm" is not supported on this system';
else
s := 'Failed to add a Form (paper) name!';
end;
//raise Exception.Create(s);
showmessage(s);
end;
end;
ClosePrinter(hPrinter);
end;

//选择新纸型,注意,必须用win2000的打印机驱动才可以,
//否则无效,你也可以手动选择
procedure TForm1.Button2Click(Sender: TObject);
var
Device, Driver, Port: array[0..80] of Char;
DevMode: THandle;
pDevmode: PDeviceMode;
begin
Printer.GetPrinter(Device, Driver, Port, DevMode);
if DevMode <> 0 then
begin
pDevMode := GlobalLock( DevMode );
if pDevmode <> nil then
begin
pDevmode^.dmFields := pDevmode^.dmFields or
DM_FORMNAME or
DM_PAPERSIZE;
pDevmode^.dmPaperSize := DMPAPER_USER;
StrLCopy( pDevmode^.dmFormName, PChar('新格式3'), CCHFORMNAME-1 );
GlobalUnlock( Devmode );
end;
end;

end;

选择完打印就可以了,10米长的纸是按照每次20厘米(你自己设)走纸的
 
打印机驱动不要用win2000自带的,那个不好使
下载一个支持win2000的
 
引用 OpenPrinter AddForm 等API,如何搞啊?[:D]
 
来自:R_Baggio, 时间:2003-12-11 22:11:00, ID:2348825
引用 OpenPrinter AddForm 等API,如何搞啊?[:D]

楼主,我那个回复里不就是用 AddForm 的么?
 
我的意思是从那个DLL里调用或DCU里!
 
来自:R_Baggio, 时间:2003-12-12 9:30:00, ID:2349235
我的意思是从那个DLL里调用或DCU里!
难道和上面的方法还有区别吗??
 
难道DELPHI直接调用吗?
你有无直接把上面的程序直接编译一下呢?
找不到函数口!
 
试试这个,直接操作打印机的。
http://www.torry.net/vcl/print/printtools/dotmatrx.zip
 
来自:R_Baggio, 时间:2003-12-12 10:23:00, ID:2349424
难道DELPHI直接调用吗?
你有无直接把上面的程序直接编译一下呢?
找不到函数口!
楼主我真服了你了,那只是整个程序的一小段啊!
你得 use winspool 单元,
如果你还不会编译,那我也没办法了
 
有个OCX控件可直接象DOS那样来写打印程序。LQ300K.ocx
 
凭个人经验认为 yanyandt2 的方法是可行的。
 
顶部