在很多应用程序中,都需要程序具有打印预览功能,以避免用户由于选择不当出现打印错误。

预览实现方式为通过创建一个Tpanel的派生类并公开它的canvas属性比例尺或视区范围,使用较为不方便,笔者通过实践实现了用图元文件(Metafile)来实现打印预览的方法,这种方式不需要调整比例尺和视区范围。

  DELPHI打印预览功能基本原理和方法:

//(*本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgtao/ *)

  图元文件也称作"绘图类型"的图形,是以图形对象(线、圆弧、多边形)方式而不是像素方式来储存图像。图元文件将图形定义为编码的确线段和图形。Windows系统下有两种类型的图元文件:标准型(WMF文件格式)和增强型(EMF文件格式)。

  使用图元文件的好处在于它能够任意大小缩放并且任能保持一定的逼真度,这是因为图元文件通常由一系列矢量图形的图元组成,图元是指线条、填充的区域以及轮廓字体等。

扩大或缩小图像只是简单地缩放定义这些图元的所有坐标点,所以当调整图像大小时,图元文件对图像的保存比像素更精确,效果更好。

  Delphi以Tmetafile对象对 Win32增强型图元文件进行了封装,通过设置Enhanced属性可以设定图元文件是以标准型或可增强型格式存储。
在Delphi中使用图元文件的基本方法是:

 创建图元文件
使用参照设备的打印机句柄创建图元文件画布对象(Tmetafilecanvas)
如同在打印机画布上一样,在图元文件画布进行描
将图元文件在屏幕上显示出来

  实现步骤:

首先建立一个窗体文件,在适当位置放上一个panel控件 (panel),一个checkbok控件(chedkbox1),并设定checkbox的 caption为"打印预览",在panel上放置一个image控件(image), 并设image的align属性为kckient.

 在USES中添加打印程序单元(Printers),尽管Delphi在生成窗体时会自动在USESB部分加入许多程序单元,但打印程序单元却不在此列,只能手工给它加上。(www.setasp.com)

 关键代码说明:用GetDevice (Printer.Handle,LOGPIXESX)获取当前打印机的水平分辨率。

如果想让打印程序在任何打印机上都能正常的打印,你就必须改变你的度量单位。

//(*本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgtao/ *)

  Dpm:=trunc(dpi/25.4);
//算出每毫米的打印机点数。
       MyMetafile :=Tmetafile.Create;
//创建图元文件
       TmetafileCanvas.Create (MyMetafile,printer.Handle)
//以打印机句柄创建图元文件画布
      Textout(trunc(sx*dpm), trunc(sy*dpm),'我的打印');

//进行打印输入
       imagel.Camvas.StretchDraw (imagel.canvas.cliprect, MyMetafile);
//显示图元文件

  程序源代码:

  unit u_print;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Controls,Fr-ms,Dialogs,
StdCtr;d,Buttons,printers,ExtCtrls;
Type
TF_prin = class(Tform)
………
private
{Private declarations}
public
{Public declarations}
end;
var
F_print: TF_print;
Implementation
{$R*.DFM}
procedure TF_print.BitBtn1Click(Sender:Tobject);
brgin
close;
end;

//定义report过程,使真实打印和打印愈来愈览共用此过程
//自定义Report过程
procedure Report (Acanvas:Tcanvas);
var
sx,sy,sy0,sx0:real;//开始位置
dpi,dpm:real; //每毫米的点数
Arect: Trect;
Begin
Dpi := GetDeviceCaps (Printer.Handle,LogPixelsX);
Dpm:=trunc(dpi/25.4); //每毫米的点数
Sx:=100; sx0:=10; sy0:=10; sy:=sy0;
with Acanvas do
try
font.name:='宋体';
font.size:=18;
textout(trunc (60*dpm),trunc (sy*dpm),'姓名');
sy:=sy+10;
pen.Width:=5;
MoveTo(trunc(sx0*dpm),trunc(sy*dpm));
LineTo(trunc((sX0+200)*dpm),trunc(sy*dpm));
font.size:=12;
sy:=sy+5;
textout(trunc(sx0*dpm),trunc(sy*dpm),'内容');
sy:=sy+5;
MoveTo(trunc(sx0*dpm),trunc(sy*dpm));
LineTo(trunc((sX0+200)*dpm),trunc(sy*dpm));
finally
Free;
End;
End;

  Procedure TF_print,BitBtn2Click(Sender:Tobject);
Var mymetafile:Tmetafile;
Ifprt:Boolean;
Begin
Ifprt:=not checkbok1.checked;
//是false则打印预览,true则打印if ifprt then
begin
printer.BeginDoc;
report(printer.canvas);
//将打印机画布对象传给report过程
end
else
begin
MyMetafile: =Tmetafile.Create
//创建图元文件
//以打印机句柄创建图元文件画布对象(Tmetafilecanvas),并调用report过程
report (TmetagileCanvas.Create(MyMetafile,
printer.Handle));
end;
//如果是打印则结束打印
if ifprt then printer.enddoc;
//如果是打印预览,则在image1上显示出来
if not ifprt then image1.Canvas.StretchDraw (image1.canvas.cliprect,MyMetafile);
end;
end

DELPHI 打印预览功能相关推荐

  1. C#实现打印与打印预览功能

    C#实现打印与打印预览功能 发表日期:2010年12月31日 作者:whitewin 点击:102次 在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Micr ...

  2. 网页中JS实现(调用)打印预览功能

    近期的项目中需要在页面中实现打印预览功能--点击网页中的"打印"(Print),弹出打印预览窗口,点击窗口页面中的"开始打印"(Print),则出现浏览器的打印 ...

  3. MFC 基于多文档的打印和打印预览功能的实现

    一.基础知识 1 网上有很多的关于打印的程序,一定要看清楚,是基于对话框dialog的打印功能,还是基于文档的打印功能. 如果分不清基于对话框和文档的区别,建议新建一个单文档.多文档和对话框的工程,看 ...

  4. 敲的php代码怎么预览,php如何实现打印预览功能

    php实现打印预览功能的方法:首先获取当前页的html代码:然后设置打印开始区域和打印结束区域:接着从开始和结束代码向后取html:最好确定要打印的内容即可. 推荐:<PHP视频教程> p ...

  5. react项目中实现打印预览功能

    最近项目中,前端采用react+antd+dva的组合, 今天有一个新需求, 需要在后台管理系统中实现 点击打印 完成指定页面的打印功能. 我们道浏览器带有打印功能的实现,window.print() ...

  6. html页面实现打印预览功能,js实现打印、页面设置、打印预览功能

    javascript打印-打印页面设置-打印预览代码 function printsetup(){ // 打印页面设置 wb.execwb(8,1); } function printpreview( ...

  7. 纯手写table展示树形数据,实现浏览器打印预览功能

    更新: 略显尴尬,在测试进行了各种数据测试之后,发现处理数据还是有些问题,有问题才能进步嘛,哈哈哈,还好发现及时,今天下午又进行了修改,对合并数据的地方修改了很多,详细内容见新的dealData方法: ...

  8. java调用打印预览_急求一个用Java实现的打印及打印预览功能的Demo

    展开全部 package com.szallcom.tools; import java.awt.BorderLayout; import java.awt.Color; import java.aw ...

  9. java 预览打印_请问JAVA如何实现打印及打印预览功能?

    展开全部 package com.szallcom.tools; import java.awt.BorderLayout; import java.awt.Color; import java.aw ...

最新文章

  1. Firefox 66正式向广告宣战!预设禁止自动播放影片并加入加入 Windows Hello
  2. Groovy正则表达式复杂逻辑判断实例
  3. C# 16进制与字符串、字节数组之间的转换
  4. FPGA实验——译码器原理及实现
  5. python怎么画多重饼状图_Python通过matplotlib画双层饼图及环形图简单示例
  6. numpy常用函数(power、sum、tile、transpose等)
  7. Android开发之实现锁屏功能
  8. Selenium备忘手册 [转]
  9. python gif_python 将png图片格式转换生成gif动画
  10. 前端设定项目奖金有多少_【系列二】建筑工程项目激励模式探讨
  11. Technical Tcode List
  12. 我的世界服务器怎么修改书与笔,我的世界书与笔怎么做 我的世界书与笔怎么用...
  13. 编译原理中LL(1)分析程序的设计---用c++程序语言实现
  14. 单线程无阻塞IO模型在Node.js中的工作方式
  15. geopandas读取shp
  16. 追赶法 matlab编程,科学网—数值分析----三对角方程组的追赶法matlab程序 - 殷春武的博文...
  17. adventureworks mysql_AdventureWorks2012
  18. 信息技术 用计算机做科学实验报告,8.用计算机做科学实验.doc
  19. POJ3744 Scout YYF I 概率DP+矩阵快速幂
  20. SCSI与USB的关系

热门文章

  1. 技能梳理1@树莓派3B+bh1750+震动+dht11+onenet+本地保存
  2. BGP BFD测试案例
  3. CPU 温度监控软件(lm_sensors)
  4. 直播SDK(PPT操作、PPT切换)
  5. win10无法找到网络解决办法
  6. flash 火狐总是崩溃_Firefox插件Flash经常崩溃的原因及解决方法
  7. AI作画—矢量插画风海报
  8. 补题:HNU暑期训练第二场L-Skeletons
  9. 刷屏的AI 绘画,你成功驯服了吗?其背后的AIGC模型你可能还不知道
  10. “杀疯了”的AI绘画,如何实现商业变现?