请教用Delphi自定义打印的问题,高分悬赏(200)!(200分)

  • 主题发起人 主题发起人 阿飞Fly
  • 开始时间 开始时间

阿飞Fly

Unregistered / Unconfirmed
GUEST, unregistred user!
?有一问题:如何用Delphi自定义打印时处理纸张尺寸和打印机设备
坐标系的问题? 具体说当我用DevMode的设备属性DM_PAPERLENGTH,
或DM_PAPERWIDTH设置了打印的纸张宽,高,打印机的坐标原点是固定在
打印机的右下脚?还是随着我的纸而变化(如在纸的右下)?我试过好象是固定
在打印机的右下脚,但实际打印的内容好象要随着纸张的变化而改变其坐标
(好麻烦!)?
有没有好的方法让TPrinter.Canvas的坐标原点在纸的右下脚,而不是打印机的右下脚?
?还有自定义打印时的页边距是否是固定的还是随着纸张而改变的?
急盼告之,THANK U!
 
?怎么没有人答复?
太难了?
 
这应该是该设置的打印分辨率有关的,看过这方面的文章,但记不清了.建议您可以在网上用
搜索引擎搜索一下这方面的文章.
 
不是吧,打印机的坐标原点应该是在纸张的左上角吧。
 
DELPHI的自定义打印不是很复杂啊,再说了,打印的原点是纸张的左上角才对啊。
你要打印成什么样子的啊。
如果要打印表格,我可以给你一个我自己做的例子啊。
 
你不能控制坐标原点,你就不能把你要打的内容安照现在的坐标重新排列一下?
写个转换过程不算难吧?
 
1。打印机的坐标原点总是在纸张的左上角,不管纸张从那个方向进入打印机。
非要把纸张的有下脚作坐标原点的话,写坐标转换公式即可。
2。一下代码可得到打印机默认的页边距
function getprintStartPos:TPoint;
var
pageMargin:TPoint;
myEscape:integer;
begin
pageMargin.x:=0;
pageMargin.y:=0;
myEscape:=GETPRINTINGOFFSET;
if Escape(Printer.Handle,QUERYESCSUPPORT,sizeof(myEscape),@myEscape,nil)>0 then
begin
if Escape(printer.Handle,GETPRINTINGOFFSET,0,nil,@pageMargin)<=0 then
begin
pageMargin.x:=0;
pageMargin.y:=0;
end;
result:=pageMargin;
end;
 
HaHa,我有一个自编的 HPrinters.pas 单元,替代 DELPHI 的 Printers 单元,全面解决
自定义打印、纸张设置等等问题,9X、Me、NT、2000下均可,不过要 Money 的呀。:) 要不
要?
 
300 大分 Money!!!
 
对任何打印机来说,其坐标原点总是在纸张的左上角,平时我们在纸上绘图,习惯于坐标原点在
纸的左下角,向上为正,向左为正;对打印机来说,向下为正,向右为正;
实在转不过弯来,你可以写一个坐标转换函数嘛!
 
楼上的reedblue,没有看到你的程序,不知道好不好、烂不烂,谁敢给你money!!!
太过分啦!!
 
reedBlue:
有需要的时候!
 
你先取打印机设置纸张大小,去减一下。
 
取得页边距,打印时x,y分别减去页边距!!然后输出!!
 
看在高分的面子上,告诉你,找HUBDOG的葵花宝典看看,你就完全解决了
 
如何在WINDOWS中控制打印字体的长宽,而不受限于SIZE 的限制

首先为了达到这个功能,可以采用Windows的逻辑字体(LogFont)
可以使用 CreateFont 或 CreateFontIndirect 这两个Windows API
函数来定义任何想要的字体,由于 CreateFont 所需的参数甚多通常
我们使用 CreateFontIndirect 来建立所需的逻辑字体,这个API函数
在Delphi中的声明为
function CreateFontIndirect(const p1: TLogFont): HFONT;
stdcall;
其中只有一个参数 p1: TLogfont
所有有关字体的参数完全通过这个
TLogfont结构来传送,Windows将根据结构中的内容创建出相应的逻辑
字体,在Delphi的Windows.pas中TLogFont是这样定义的

TLogFontA = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
end;

TLogFontW = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of WideChar;
end;

TLogFont = TLogFontA;

其中涉及到很多参数,其中

lfHeight: Longint;
指定以逻辑单位标定的字体高度,取值可为正负或零,对于需要随意
定义字体高度的情况下通常取负值,以保证获得实际尺寸的字体。

lfWidth: Longint;
用于指定字体的平均宽度,由于Windows系统下的大多数字体都是比例
字体因而采用平均宽度这个表示方法。若指定为0,则系统会自动根据
适当的比例自动处理宽度。

lfEscapement: Longint;
指定输出方向与当前坐标系X轴之间的以十分之一度为单位的角度。

lfOrientation: Longint;
指定每个字符与当前坐标系X轴之间的以十分之一度为单位的角度。在
Windows95中这个值等同于lfEscpement。

lfWeight: Longint;
指定范围为从0至1000的字体加重程度,400是标准字体700为加重字体,
0表示采用默认值。

lfItalic: Byte;
不为0表示采用斜体字。

lfUnderline: Byte;
不为0表示带下划线。

lfStrikeOut: Byte;
不为0表示带穿透线。

lfCharSet: Byte;
指定字体集。

lfOutPrecision: Byte;
指定输出精度。用于确定对前面一些设定值的精确程度。

lfClipPrecision: Byte;
指定裁剪精度。裁剪是Windows图形环境下的一种特殊处理,简单说就是
去掉图形中落在视图以外的部分,有助于提高图形的处理速度。

lfQuality: Byte;
指定输出质量。

lfPitchAndFamily: Byte;
指定字体的Pitch和Family。

lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
指定采用的字体名称。

在建立逻辑字体时,我们通常使用

lfHeight和lfWidth来确定字体的尺寸,使用lfEscapement和lfOrientation
来确定字体的输出方向,使用lfWeight
lfItalic
lfUnderline

lfStrikeOut
来确定字体的加重,斜体,下划线和穿透线,使用lfCharSet
来确定字体的字符集,通常采用系统默认的字符集。
对于lfOutPrecision
lfClipPrecision
lfQuality一般应用于对屏幕之外
的输出设备,通常采用默认值。采用lfPitchAndFamily来确定采用定宽或可
变字体和字体的家族。以lfFaceName来通过名称选择采用的字体。
另外应当注意在Windows环境下,每种字体具体输出为何种形式取决于很多
因素,需要对以上这些参数进行有效的组合才能达到所要的效果。
 
后退
顶部