控制文本的打印位置!(200分)

  • 主题发起人 主题发起人 欧克
  • 开始时间 开始时间

欧克

Unregistered / Unconfirmed
GUEST, unregistred user!
请速回答,有200分喔!!!
1、如何控制文本的打印位置?如:在距打印纸左40厘米,上10厘米的位置打印“单位”
字符。
2、如何将文字逆时针旋转90度打印出来?
关于第一个问题,我本可以利用报表设计器实现,不过,太不灵活了。还请各位指点啦!
 
没打印机 不知道
2。 有这样的字体吗 怎么不行??
 
不能帮你了!
 
TPRINT有一个CANVAS属性,可以支持TextOut(X, Y: Integer;
const Text: string);
 
西西,我的程序中刚刚也要用到这个,解决了,贴一段给你。

const INCHES_PER_MILIMETER : Real = 0.04;
type
Toffset = record
X,Y: Integer;
end;

var
PrintCard: TPrintCard;
FDeviceName : String;
FpageHeightPixel, FpageWidthPixel : Integer;
Forientation : TprinterOrientation;
FprintOffsetPixels : Toffset;
FPixelsPerMMX,FPixelsPerMMY: Real;
MMSize, FpageHeightMM : Integer;
TheReport, TheHead, HeadLine, RecordLine, Tfname,TLame : String;

Procedure TPrintCard.GetDeviceSettings;
var
retval : integer;
PixX, pixY: Integer;
begin

FdeviceName :=Printer. Printers[Printer. PrinterIndex];
FpageHeightPixel := Printer. PageHeight;
FpageWidthPixel := Printer.PageWidth;
Forientation:=Printer.Orientation;
// $IFDEF WIN32
FprintOffsetPixels.X:= GetDeviceCaps(Printer. Handle,PHYSICALOFFSETX);
FprintOffsetPixels. Y:= GetDeviceCaps(Printer.Handle,PHYSICALOFFSETY);
// $else

retval:= Escape(Printer. Handle,GETPRINTINGOFFSET,0,nil,@FPrintOffsetPixels);
// $ENDIF
PixX:= GetDeviceCaps(Printer.Handle,LOGPIXELSX);
PixY:= GetDeviceCaps (Printer.Handle,Logpixelsy);
FPixelsPerMMX:= INCHES_PER_MILIMETER*PixX;
FPixelsPerMMY:= INCHES_PER_MILIMETER * PixY;
FpageHeightMM:= Round (FpageHeightPixel/FPixelsPerMMY);
end;


function TPrintCard.PutText(mmX,mmY: Integer;
S: string;
LeftAlign:Boolean) : boolean;
var
X,Y: Integer;
Align: WORD;
begin

if LeftAlign then

align := SetTextAlign(Printer.Handle,TA_BOTTOM or TA_LEFT)
else

align:= SetTextAlign(Printer.Handle,TA_BOTTOM or TA_RIGHT);
result:= FALSE;
X :=Trunc(mmX * FPixelsPerMMX) - FprintOffsetPixels.X;
Y := Trunc(mmY * FPixelsPerMMY) - FprintOffsetPixels.Y;
if X < 0 then
exit;
if Y < 0 then
exit;
Printer.Canvas.TextOut(X,Y,S);
Result := TRUE;
end;

这样调用:
getdevicesettings;
Printer.begin
Doc;
pixelsize:=Printer.Canvas.TextHeight('Yy');
MMsize:=Round(PixelSize/FPixelsPerMMY);
puttext(40,10,'单位',True);
Printer.EndDoc;

相信会有点用的。
 
如果要旋转90度,可以通过设置字体来实现
printer.fonts
如将字体名设置成‘@宋体‘
 
不好意思应该是: Printer.Canvas.Font.name:='@宋体';
 
感谢foenix的回答!!不过,可不可以给源程序加上详细的注解??我是底手........
关于第二个问题,我有点搞不懂了:怎么可以通过设置字体名为“宋体”来实现文字的90
度旋转呢????还望详加指点!!!谢谢!!!!!!!!

 
我在让字体90度的程序,谁要与我联系,,
mail to :loopy@netease.com
 
//通过一个API函数可以实现字体的任意角度反转,下面的代码实现了45度反转!

procedure TForm1.Button1Click(Sender: TObject);
var lf : TLogFont;
tf : TFont;
begin

with Form1.Canvasdo

begin

Font.Name := 'Arial';

Font.Size := 24;
tf := TFont.Create;
tf.Assign(Font);
GetObject(tf.Handle, sizeof(lf), @lf);
lf.lfEscapement := 450;
lf.lfOrientation := 450;
tf.Handle := CreateFontIndirect(lf);
Font.Assign(tf);
tf.Free;
TextOut(20, Height div 2, 'Rotated Text!');
end;

end;
 
欧克
在字体名称前加@就是逆时针旋转90度,大多数字体都可以,'@宋体'就是横的宋体,当然你
也可以设成其他字体,如‘@黑体’'@揩体'……。你在word等文字软件试一试就明白了。
不过如果你不是既要有横排的文字,又要有竖排的文字,完全可以通过设置打印机的页面来
做,将打印方向设置为横向,不就好了吗。
GetDeviceSettings 用来取得打印机的有关设置。
puttext(mmX,mmY: Integer;
S: string;
LeftAlign:Boolean)
用于输出文字S,距左边mmX毫米,距右边mmY毫米,LeftAlign由于选择左对齐,还是右对齐。
PrintCard是我的form的名字,你可以改成你的form 的名字。
哦,在最前面应该要use printers。
将程序照抄上去就可以了,我想没问题的。


 
FOENIX:
不好意思!我今天试了一下,字体名称加@是实现了文字的横向显示。YCK也指出了实质
内容,当然FOENIX的帮助更大,180与20的分配不会不满意吧???
还有一个问题要问一下FOENIX^_^如何让QRLABEL控件的文字(CAPTION)显示方向为从下
往上?我只找到水平显示的属性。
 
没办法解决
可以去找找看有没有功能更强的控件
 
后退
顶部