Printer.Canvas.TextHeight() 怎么了?(50分)

  • 主题发起人 主题发起人 mosane
  • 开始时间 开始时间
M

mosane

Unregistered / Unconfirmed
GUEST, unregistred user!
if printdialog1.Execute then
begin
Printer.Canvas.Font.Size := 9;
PointX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
PointY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
PrintX := Trunc(PointX / 72);
PrintY := Trunc(PointY / 72);
PrintStepY := Trunc(Printer.Canvas.TextHeight('字高') * PointY / 72);
Label1.Caption := IntToStr(Printer.Canvas.TextHeight('字高'));
Label3.Caption := IntToStr(PrintY);
Label4.Caption := IntToStr(PrintStepY);
if checkbox1.Checked then
begin
Printer.begin
Doc;
for i := 1 to 10do
begin
PrintY := PrintY + PrintStepY;
Printer.Canvas.TextOut(PrintX, PrintY, '中国人民站起来了。'+IntToStr(i));
end;
Printer.EndDoc;
end;
end;

就这么一段,都要出问题,如果没有勾上 checkbox1,也就没有真正打印的话,怎么改变了打印机的打印质量,Label1.Caption := IntToStr(Printer.Canvas.TextHeight('字高'));显示的值都是一样的,都是12;但如果真正打印了,改变了打印机的打印质量,也就是打印机的分辨率改变了,显示到的Label1.Caption就变来变去的,有12、45、15、90,乱来的,为什么?
 
Label1.Caption := IntToStr(Printer.Canvas.TextHeight('A'));这样行吗?
 
都一样:(
 
我觉得你应该把这段程序写到其他地方,只调用一次就行了:
Printer.Canvas.Font.Size := 9;
PointX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
PointY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
PrintX := Trunc(PointX / 72);
PrintY := Trunc(PointY / 72);
PrintStepY := Trunc(Printer.Canvas.TextHeight('字高') * PointY / 72);
 
似乎有点道理,因为我第一次打印得出的结果总是正确的。
但还不能解决问题Printer.Canvas.Font.Size := 9要改变呢?在一页里有不同大小的字体。
而且其他都没有问题,就是 Printer.Canvas.TextHeight('字高')老不听话,
我用的是winXP,epson的喷墨打印机c43ux
 
那就是这里的原因了,你用的
Printer.Canvas.TextHeight('字高')
本来就是根据打印字体来的啊,字体大点当然这个值就大些,正常的
如果你不需要它改变的话,就这样好了:用form的canvas
form1.canvas.font.size:=9;
form1.Canvas.TextHeight('A') ;
是不是不再变了
 
PrintX := Trunc(PointX / 72);
你这一句中72可能是屏幕的Pix你应用Screen.PixPerInch也有可能是96
 
看看我的题目谢谢,
上段程序里字体没有变化,都是9,
问题出在于 checkbox1,如果没有勾选它的话,显示的值是正常的,
但勾选了它之后,显示的值就“乱”了,没有规律的那种乱。
谢谢大家继续帮我解答。
 
Printer.Canvas.TextHeight('X')在真正打印的时候显示的结果是正确的,该结果是以象素为单位的,如果字体大小,打印机分辨率固定的话,Label1的值应该是唯一的(我试过是唯一的).如果字体不改变,打印机分辨率改变的话,Label1的值会改变,但该值在纸上的距离不会改变,例如在分辨率为600*600的打印机上该值为600,在分辨率为300*300的打印机上该值为300,在纸上都是代表一英寸.
if checkbox1.Checked then
begin
Printer.begin
Doc;
Label1.Caption := IntToStr(Printer.Canvas.TextHeight('字高'));

for i := 1 to 10do
begin
PrintY := PrintY + PrintStepY;
Printer.Canvas.TextOut(PrintX, PrintY, '中国人民站起来了。'+IntToStr(i));
end;
Printer.EndDoc;
如果Printer.Canvas.TextHeight('X')还是不行的话,试一下下面这个函数:
function CharHeight: Word;
var
Metrics: TTextMetric;
begin
GetTextMetrics(Printer.Canvas.Handle, Metrics);
Result := Metrics.tmHeight;
end;
if checkbox1.Checked then
begin
Printer.begin
Doc;
Label1.Caption := IntToStr(CharHeight);

for i := 1 to 10do
begin
PrintY := PrintY + PrintStepY;
Printer.Canvas.TextOut(PrintX, PrintY, '中国人民站起来了。'+IntToStr(i));
end;
Printer.EndDoc;

注:仅供参考!
 
不行不行!!:(
 
后退
顶部