请教:在Delphi中如何独立打印机的型号、当前屏幕分辩率来打印文件???(100分)

  • 主题发起人 主题发起人 estray
  • 开始时间 开始时间
E

estray

Unregistered / Unconfirmed
GUEST, unregistred user!
请教在Delphi中如何独立打印机的型号、当前屏幕分辩率来打印文件,我好象在什么地方看过,好象是设定什么度量单位求教各位大侠指点!!!最好有详细的程序说明。
 
用打印机提供的用户手册编写几条Esc +参数的驱动程序,即可操纵打印机。
 
希望能够打印机无关是很困难的,
如果按照屏幕分辨率去打印Form首先是form的边框会打印出来
而且由于系统需要计算将屏幕内容扩大到打印机的大小
所以会非常慢,对系统资源要求很高,效果还不好。
最好还是使用各种报表控件去输出结果吧。
如果实在要用在Delphi帮助中查Form的Print函数吧。
 
希望能够打印机无关是很困难的,????????

是希望和打印机有关很困难吧?
windows下打印是通过打印驱动程序实现的, 用户能操作的只是一个DIB或DDB位图呀.
不太明白estray什么意思?
根据打印机的分辨率和屏幕分辨率stretch图象然后打印?
可以参阅win32 api help: GetDeviceCaps
那里有详细说明, 可以直接取到打印机的物理分辨率和转换成屏幕显示的分辨率.
 
eYes 说的有道理,如果以前在do
S 下用 FoxBase 写程序,
那么的确要按打印机手册上提供的倒霉的命令来控制打印机
但现在,这都不是问题。

我还是不明白,什么是按屏幕分辨率打印?这有关系吗??
你要做什么?打印什么呢?
 
ShowMessage(′水平分辨率′+inttostr(GetDeviceCaps(printer?Handle,LOGPIXELSX))+chr(13)+′垂直分辨率:′+inttostr(GetDeviceCaps(printer?Handle,LOGPIXELSY)));
 
我的意思是用什么方法可以打印比如图表,可以在不同的屏幕分辨率,不同类型的打印机下,打印出来的效果是完全一样的,比如大小、位置等等,都完全一样?
好象同一副画,在用缺省的方法下,不同打印机打出的大小不是完全一样的?
 
上面estray所说证明我对它的问题的理解的正确性.
我所说的打印机无关就是说:
>可以在不同的屏幕分辨率,
>不同类型的打印机下,
>打印出来的效果是完全一样的,比如大小、位置等等,都完全一样?
如果要想达到以上目的,必须知道所将会用到的所有打印机的特性
通过取得打印机的物理分辨率和当前打印纸的大小,
同时还要取得屏幕显示的分辨率.自己计算将屏幕上要打印的图形
通过放大/缩小(一般是放大,因为屏幕分辨率和尺寸小于打印机)
适应打印机的分辨率,并且填充整个打印纸的大小.
这中间有很大的计算量,做得不好,还会变形.
确实不容易.
 
由于分辨率差异太大,用位图拉伸的方法,会出现严重的马赛克现象,不堪忍受。
最好是创建新的逻辑字体在打印机的画布上重新绘制,文字的边界比较圆滑。
请参照我在‘如何定位’中的回答。(question: 1)
 
其实smartTommy已经讲了,如下:

Get_Print_X( Value_Inch : Float) : integer
//Value_Inch :为具体的以英寸为单位的长度 (2.07英寸) 厘米可先转化
//返回值是具体的打印机上应该划的点数,同理取Y的点数(LOGPIXELSY)
begin

result := Value_Inch * GetDeviceCaps(printer?Handle,LOGPIXELSX)
end;

//最后 设定 printer.canvas.font.pixperinch ;=
GetDeviceCaps(printer?Handle,LOGPIXELSX)
即可以打印了,如要打印在form上取form的pixperinch 代替即可以了.
 
如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。
如果采用固定的度量,不同分辨率的打印效果是不同的。举例来讲:printer?Canvas?rectangle(0,0,360,720)在360×360的佳能4200SP上能打出
一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出0?6英寸宽、
1?2英寸高的矩形。使用打印机的点数做为度量单位是一个明智的选择。
具体做法如下:VarPointX,PointY:integer;
PointX:=GetDeviceCaps(printer?Handle,LOGPIXELSX);
PointY:=GetDeviceCaps(printer?Handle,LOGPIXELSX);
printer?Canvas?rectangle(0,0,PointX*1,PointY*2)这样,无论你使用什么样的打印机,都能得到
一个1英寸宽、2英寸高的矩形。

//$贴来的,试过效果很好
 
绝对无关是不可能的,上述方法也只能一定程度的近似.
如. 不同字体不可能宽与宽或高与高完全相同
 
得到DPI可以用几个下这个方法
1. DPI:= FormXXXX(或Printer).Canvas.Font.PixelsPerInch
如果要Printer的分辨率,要先Printer.begin
Doc,在DPI:=......
2. Form有个PixelsPerInch的属性, 那就是分辨率DPI
3. 或者
XXXXXXXX.Canvas.Font.Size:= -72;
DPI:= XXXXXXXX.Canvas.Font.Height;

记得Win API中有个函数可以设置Printer的坐标系统,可以是
像素,也可以是毫米, 只是记不起是哪个函数了, 好像坐标系的方向也改变了
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部