当前位置:主页>销售管理软件> 列表

打印预览与begindoc的问题 找管家商铺进销存

库存管理软件版1楼: 我用TPrinter自己画报表,用TMetaFile做预览,现在是问题是:
预览的时候由于牵扯到换行和对齐等操作,必须要知道字符的高度和字符的平均宽度,这在打印的时候很容易实现(用GetTextMetrics),而在预览的时候,由于GetTextMetrics用到Printer的Canvas,而访问Printer.Canvas前必须要BeginDoc,虽然可以在预览结束后Abort,但是总是感觉这样子不舒服,再说看了其它的软件(Word等),预览的时候,并没有像我这样发个任务给打印机再取消的,至少表面看起来如此(我的程序运行时打印机会接收到一个任务很快又被取消),有什么办法可以不用begindoc嘛?

2楼: 没有人提出什么建议吗?难道都是只会用成品控件。。。。。 如管家商铺进销存

3楼: 晕倒,预览的时候先用别的可视画布,要打印再转给打印机。

4楼: to dancekids:
我是用的别的可视画布啊,但是在画的时候要知道字符的高度和字符的平均宽度,要用到GetTextMetrics,在调用GetTextMetrics的时候,如果用别的可视画布,可能是某些关键属性不一样(我也不知都是哪些),画出来的和实际打印出来的效果不一样,而如果用Printer的Canvas,预览画出来的和打印机实际打印的就是一模一样的

5楼: 什么是 字符的平均宽度?何时用到?

6楼: 字符的平均宽度,比如“i”和“P”宽度就不同
画画布的时候要知道什么时候换行,怎么对齐,所以要知道平均字符宽度

库存管理软件版7楼: 然可以在预览结束后Abort,但是总是感觉这样子不舒服,再说看了其它的软件(Word等),预览的时候,并没有像我这样发个任务给打印机再取消的,至少表面看起来如此(我的程序运行时打印机会接收到一个任务很快又被取消
=====
我的打印机好像没有这个现象。

8楼: 比如“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;
如何用这个函数?