打印预览与begin doc的问题(200分)

  • 主题发起人 主题发起人 CookieTian
  • 开始时间 开始时间
C

CookieTian

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TPrinter自己画报表,用TMetaFile做预览,现在是问题是:
预览的时候由于牵扯到换行和对齐等操作,必须要知道字符的高度和字符的平均宽度,这在打印的时候很容易实现(用GetTextMetrics),而在预览的时候,由于GetTextMetrics用到Printer的Canvas,而访问Printer.Canvas前必须要begin
Doc,虽然可以在预览结束后Abort,但是总是感觉这样子不舒服,再说看了其它的软件(Word等),预览的时候,并没有像我这样发个任务给打印机再取消的,至少表面看起来如此(我的程序运行时打印机会接收到一个任务很快又被取消),有什么办法可以不用begin
doc嘛?
 
没有人提出什么建议吗?难道都是只会用成品控件。。。。。
 
晕倒,预览的时候先用别的可视画布,要打印再转给打印机。
 
to dancekids:
我是用的别的可视画布啊,但是在画的时候要知道字符的高度和字符的平均宽度,要用到GetTextMetrics,在调用GetTextMetrics的时候,如果用别的可视画布,可能是某些关键属性不一样(我也不知都是哪些),画出来的和实际打印出来的效果不一样,而如果用Printer的Canvas,预览画出来的和打印机实际打印的就是一模一样的
 
什么是 字符的平均宽度?何时用到?
 
字符的平均宽度,比如“i”和“P”宽度就不同
画画布的时候要知道什么时候换行,怎么对齐,所以要知道平均字符宽度
 
然可以在预览结束后Abort,但是总是感觉这样子不舒服,再说看了其它的软件(Word等),预览的时候,并没有像我这样发个任务给打印机再取消的,至少表面看起来如此(我的程序运行时打印机会接收到一个任务很快又被取消
=====
我的打印机好像没有这个现象。
 
比如“i”和“P”宽度就不同
===
如何知道 这两个字符实际打印的宽度?

printer.canvas.textwidth('i');
printer.canvas.textwidth('P');
吗?
function AvgCharWidth: Word;
var
Metrics: TTextMetric;
begin
GetTextMetrics(Printer.Canvas.Handle, Metrics);
Result := Metrics.tmAveCharWidth;
end;
如何用这个函数?
 
后退
顶部