如何做一个自定义打印的 《预览》 -- 对我是高难度的挑战!!(100分)

  • 主题发起人 主题发起人 dzl19
  • 开始时间 开始时间
D

dzl19

Unregistered / Unconfirmed
GUEST, unregistred user!
//以下是我直接在打印机里打印内容的简单思路,实现了直接向打印机发送线或文本
var
M_RateX,M_RateY:Double;
begin
//水平每毫米象素数,float
M_RateX:=GetDeviceCaps(printer.Handle,HORZRES)/GetDeviceCaps(printer.Handle,HORZSIZE);
//铅直每毫米象素数,float
M_RateY:=GetDeviceCaps(printer.Handle,VERTRES)/GetDeviceCaps(printer.Handle,VERTSIZE);

//在以毫米为单位的位置(30,40)开始打印一行字
Printer.Canvas.Font.Style:=[];

Printer.Canvas.Font.Size :=10;

Printer.Canvas.Font.Name :='宋体';
Printer.Canvas.TextOut(V_x1,V_y1,'测试打印内容!');
//画以毫米为单位的线,从(10,10)到(110,10)
Printer.Canvas.Pen.Width :=1;
Printer.Canvas.MoveTo(round(10*M_Ratex),round(10*M_Ratey));
Printer.Canvas.LineTo(round(110*M_Ratex),round(10*M_Ratey));
end;
1.现在,我想实现 预览 界面,然后再在 预览 界面里发送到打印机
//请有做过的给个例子指点!--用于打印进帐单或电汇单时候,可以再看一眼核对后打印出来。
2.我想请问如何再打印时候,把字体变胖(高不变)或拉高(宽不变)呢!
//请高手指点!--比如,把标题的内容打印成有自己风格的样式。
3.要作到现 预览 界面里看到的和打印出来的是一样的,并可以有缩小或放大一定倍数打印
//请高手指点!--比如,恰好纸张大一点或小一点,还可以使用。
4.我有个思路,是做一个 预览 的面板,按照一定比例往里写内容,象向对Printer.Canvas一样,不作到如何操作!
//请高手指点一二!
 
我也想知道这个问题。
可能需要高手来回答,熟悉打印的人不多,熟悉打印预览的人就更少了。
直接在打印机CANVAS上输出打印内容,包括设置字体,字号,在一定宽度内,自动缩小或者换行等,我实现的效果已经很满意了,但是如何实现打印预览,并能在预览界面再打印,估计瞒难的,或者说,需要点技巧的。也许我水平低。
 
====用于打印进帐单或电汇单时候=====
这个软件我已经做好了。
http://delhpi.ys168.com
 
除非你用第三方部件,自己写打印麻烦,写预览就更麻烦了
我自己写了个GRID 可打印可预览可定义表头表尾字体换页折页套打放缩等等
有兴趣的朋友可以加我QQ联系10516855
 
应该中等难度吧,技巧性很强。
我看到一个绿色软件,400K,不但能在正常界面上打印,而且能非常逼真的打印预览(实际打印1厘米长的字符串,在屏幕上显示也是1厘米),在预览界面,也可以再点击打印,效果和在软件正常界面上打印完全一致。
 
有什么难的,打印是在Print.Canvas上画线、写字,打印预览是在Form.Canvas上画线、写字,道理是一样的
 
我到是手写过全部的打印过程,100分拿来的话可以就我知道的告诉你一些。打印的时候是在Print的Canvas上画,预览是在控件或者窗体的Canvas上画,delphi中一般用PaintBox比较好一点。只是在实现过程有些技术细节需要你自己去注意一下,首先你需要设置坐标模式,另外你需要计算计算机屏幕的高度和宽度进行换算,呵呵,是实际高度和宽度,换算会需要,这些通过相关API计算都可以得到。设置坐标模式后自己和表格都有个换算值,需要乘一个数,建议你看看advstring的打印,我前面提到的大部分东东里面都有涉及,不过那个控件的换算值好像不正确,我觉得是这个换算值是每0.1mm逻辑英寸所占的象素,计算机屏幕有逻辑英寸和实际英寸之分,呵呵,东西很多,一下难以全部说完,需要自己花点时间,把我上面提到的东西去研究一下,相信再来搞打印这个东东不在话下。
 
to :踏浪99
当然,是要仔细分析,不过,你能够给我一个具体的吗?
 
用SetMapMode设置坐标模式,去看看这个API的帮助,选择其中一种,我做的时候是选的MM_LOMETRIC模式,感觉有些麻烦,横向是正值,纵向的是负值,其他的模式我没有用过,
至于那个换算值坐标模式选的不同也可能值不相同,但算出来都是一个固定值,你可以参考advstringgrid的打印打印代码,就是前面设置那部分。可以根据自己的需要修改。至于你提到的各种效果只要你在Canvas能实现那么预览就可以看到,至于打印那要看你的打印机是否支持。
 
to :踏浪99
你能够给我一个简单的例子吗?就以我提出的发送到打印机的问题。
 
有个问题是,如何将在printe上实际打印的代码与 打印预览的代码共享(部分共享也行),是否两部分要完全分别写?
 
除了预览换页和打印换页需调整外,其余均可共享。
 
还没有结束!
 
路过的朋友提提意见啊!等待中!
 
来自:wkp13_8, 时间:2006-11-29 22:23:26, ID:3635252
除了预览换页和打印换页需调整外,其余均可共享。
=========
能指教一下吗?
比如下面的打印代码,在打印预览时如何共享?谢谢。
//在以毫米为单位的位置(30,40)开始打印一行字
Printer.Canvas.Font.Style:=[];

Printer.Canvas.Font.Size :=10;

Printer.Canvas.Font.Name :='宋体';
Printer.Canvas.TextOut(V_x1,V_y1,'测试打印内容!');
 
TO delhpi
应该是:
//在以毫米为单位的位置(30,40)开始打印一行字
Printer.Canvas.Font.Style:=[];

Printer.Canvas.Font.Size :=10;

Printer.Canvas.Font.Name :='宋体';
Printer.Canvas.TextOut(30*M_Ratex,40*M_RateY'测试打印内容!');
 
我做过图片打印和预览,我是这样做的
先计算出预览画布、打印机画布和实际图像的比例,预览时画在预览的画布上(把绘图参数*这个这个例),实际打印果X打印机的那个比例即可
注意打印时是不能直接用打印预览画布的,那样分辨率很低,要在打印机上重画
 
预览图片是否比普通文本简单些?图片的内容是固定的。
Printer.Canvas.TextOut(30*M_Ratex,40*M_RateY'测试打印内容!');
这个语句不能直接共享吧?
 
1.现在,我想实现 预览 界面,然后再在 预览 界面里发送到打印机
安装虚拟打印机,用eh的虚拟打印控件就可以预览。
2.我想请问如何再打印时候,把字体变胖(高不变)或拉高(宽不变)呢!
把canvas 做一个拉伸? 这个还真不太清楚。
3.要作到现 预览 界面里看到的和打印出来的是一样的,并可以有缩小或放大一定倍数打印
控制canvas就可以了,。 正在做这方面的东西。
4.我有个思路,是做一个 预览 的面板,按照一定比例往里写内容,象向对Printer.Canvas一样,不作到如何操作!
就像操作普通canvas一样。
5.另外,也许要连续打印多张单据(如成批打印银行汇款单),直接发送打印机可以做,但预览里如何实现呢?如果在预览里指定打印其中一页呢?
我也不知道。
 
1.现在,我想实现 预览 界面,然后再在 预览 界面里发送到打印机
安装虚拟打印机,用eh的虚拟打印控件就可以预览?
===
要打印的内容在控件中,打印设置(位置,字体,字号等每个控件的设置都不一样)在INI文件中,还不是要再写预览代码。能直接预览吗?
 
后退
顶部