📄 mmprinters.pas
字号:
unit MMprinters;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,printers,Forms, Dialogs;
type
TGridRect = record
left,top,width,height:integer;
text:string;
fx:string;
end;
procedure SetPaperSize(x,y:integer);
procedure MMTextOut(myRect:TGridRect);
procedure MMMoveto(Aleft,ATop:integer);
procedure MMLineto(ALeft,ATop:integer);
function getpix(x:integer):integer;
function getpiy(y:integer):integer;
function getSPagewidth:integer;
function getSpageHeight:integer;
function getscreenMMtopix(mm:integer):integer;
implementation
procedure SetPaperSize(X, Y: Integer);
var
Device, Driver, Port: PChar;
HDMode: THandle;
PDMode: PDevMode;
begin
Device := StrAlloc(cchDeviceName);
Driver := StrAlloc(MAX_PATH);
Port := StrAlloc(32);
try
Printer.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(Device, Driver, Port, HDMode);
if HDMode <> 0 then begin
PDMode := GlobalLock(HDMode);
if PDMode <> nil then begin
with PDMode^ do begin
dmPaperSize := 256;
dmPaperWidth := X;
dmPaperLength := Y;
dmFields := dmFields or DM_PAPERSIZE or DM_PAPERWIDTH or DM_PAPERLENGTH;
GlobalUnlock(HDMode);
end;
Printer.PrinterIndex := Printer.PrinterIndex;
end;
end;
finally
StrDispose(Device);
StrDispose(Driver);
StrDispose(Port);
end;
end;
function getpix(x:integer):integer;
begin
Result:=round(x*getdevicecaps(printer.Handle,LOGPIXELSX) DIV 254);
end;
function getpiy(y:integer):integer;
begin
Result:=round(y*getdevicecaps(printer.Handle,LOGPIXELSY) DIV 254);
end;
function getspagewidth:integer;
begin
result:=round(printer.PageWidth/getdevicecaps(printer.Handle,LOGPIXELSX)*SCREEN.PixelsPerInch);
end;
function getspageheight:integer;
begin
result:=round(printer.PageWidth/getdevicecaps(printer.Handle,LOGPIXELSY)*SCREEN.PixelsPerInch);
end;
function getscreenMMtopix(mm:integer):integer;
begin
result:=round(mm/254*screen.PixelsPerInch);
end;
procedure MMMoveto(Aleft,ATop:integer);
begin
printer.Canvas.MoveTo(getpix(Aleft),getpiy(ATop));
end;
procedure MMLineto(Aleft,Atop:integer);
begin
printer.Canvas.LineTo(getpix(Aleft),getpiy(Atop));
end;
procedure MMTextOut(myRect:TGridRect);
var len,high,x,y:integer;
Fontsize:integer;
begin
//转换成像素单位;
myrect.left:=getpix(myrect.left);
myrect.top:=getpiy(myrect.top);
myrect.width:=getpix(myrect.width);
myrect.height:=getpiy(myrect.height);
//设置打印字体
fontsize:=9;
printer.Canvas.Font.Name:='宋体';
printer.Canvas.Font.Size:=Fontsize;
//计算文字打印位置
len:=printer.Canvas.TextWidth(myrect.text);
high:=printer.Canvas.TextHeight(myrect.text);
while (len>myrect.width) and (fontsize>=5) do
begin
fontsize:=fontsize-1;
printer.Canvas.Font.Size:=Fontsize;
len:=printer.Canvas.TextWidth(myrect.text);
high:=printer.Canvas.TextHeight(myrect.text);
end;
x:=myrect.left;
y:=myrect.top+((myrect.height-high) div 2);
if pos('<',myrect.fx)>0 then x:=myrect.left;
if pos('|',myRect.fx)>0 then x:=myRect.left+((myRect.width-len) div 2);
if pos('>',myRect.fx)>0 then x:=myrect.left+(myrect.width-len);
printer.Canvas.TextOut(x,y,myrect.text);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -