在DELPHI中实现打印的预览

PCPOP.COM 2005年10月18日 类型:转载 作者:《电脑报》 编辑:王琛

--------------------------------------------------------------------------------

在很多应用程序中,都需要程序具有打印预览功能,以避免用户由于选择不当出现打印错误。预览实现方式为通过创建一个Tpanel的派生类并公开它的canvas属性比例尺或视区范围,使用较为不方便,笔者通过实践实现了用图元文件(Metafile)来实现打印预览的方法,这种方式不需要调整比例尺和视区范围。

基本原理和方法:

使用图元文件的好处在于图元文件也称作"绘图类型"的图形,是以图形对象(线、圆弧、多边形)方式而不是像素方式来储存图像。图元文件将图形定义为编码的确线段和图形。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部分加入许多程序单元,但打印程序单元却不在此列,只能手工给它加上。

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

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

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过程,使真实打印和打印愈来愈览共用此过程

procedure TF_print.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*spm));

LineTo(trunc((sX0+200)*dpm),trunc(sy*dpm));

font.size:=12;

sy::=sy+5;

textout(trunc(sx0*dpm),trunc(ay*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 获取打印机默认纸张_在DELPHI中实现打印的预览相关推荐

  1. delphi 获取打印机默认纸张_如何设置一台打印机打印不同尺寸的纸张

    Delphi(Pascal) codevar PrtInfo2: PPrinterInfo2;//具体的内容 查查MSDN DeviceMode: PDeviceMode;//具体的内容 查查MSDN ...

  2. delphi 获取打印机默认纸张_Delphi 动态调整打印机纸张大小

    修 改与当前打印机相关的DevMode 结构中的成员.DocumentProperties 函数申明如下: Delphi代码 LONG DocumentProperties ( HWND hWnd, ...

  3. delphi 获取打印机默认纸张_Delphi中如何控制打印方向,纸张大小等 | 学步园

    如何在程序里控制打印纸张大小(A3,A4)和打印方向?不想打开设置窗口 --------------------------------------------------------------- ...

  4. java设置打印机默认纸张_更改打印机默认纸张尺寸 (Change printer default paper size)...

    英文原文 You are in the right direction in changing the default printer settings. .NET doesn't provide d ...

  5. PrintDocument打印、预览、打印机设置和打印属性的方法(较完整)

    C# 中打印.预览.打印机设置和打印属性的方法http://www.veryhuo.com 2011-10-08 烈火学院 投递稿件 我有话说private void Form1_Load(objec ...

  6. swiper高度自适应_小程序 swiper 图片高度自适应+预览图片

    一.概述: 在开发小程序的项目中,经常会用到swiper这个轮播组件,但是使用的时候会有一个问题,swiper系统会默认一个高度而且是px为单位的,如下: swiper { display:block ...

  7. c++ 获取窗体默认字体_告别瞎眼,让Windows字体显示不逊苹果电脑

    macOS上的字体显示效果非常舒服细腻,与之相比,Windows系统的字体显示效果就有些粗糙(最直观的感受就是锯齿超多). Windows 系统上糟糕的字体显示体验主要是因为两个原因:1.默认字体&q ...

  8. postek二次开发_20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK...

    demo代码如下: private void btnPrint_Click(object sender, EventArgs e) { if (this.btnPrint.Text == " ...

  9. 20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK

    demo代码如下: private void btnPrint_Click(object sender, EventArgs e){if (this.btnPrint.Text == "停止 ...

最新文章

  1. 程序员春运抢票的正确姿势!
  2. 风险项目投资选择与管理
  3. AIX卷管理介绍以及利用空闲PP来创建文件系统
  4. Win2003 IIS下,ASP.NET无法访问数据库和网页
  5. 操作系统进程线程程序
  6. TSQL--查找连续登陆用户
  7. label标签for属性的使用
  8. 新时代、新挑战、新机遇
  9. android键盘表情流畅切换实现
  10. 北京林业大学本科毕业论文答辩和论文选题PPT模板
  11. 汽车金融信用评分卡模型-论文毕业设计复现
  12. 【CUDA开发】CUDA的安装、Nvidia显卡型号及测试
  13. 在线图片编辑网站汇总
  14. DC-DC电源模块的九个主要性能指标和作用
  15. matplotlib sci论文画图技巧
  16. Odoo11入门请假单模块学习教程源码
  17. 搜狗搜索引擎+浏览器,双轮驱动读图时代
  18. 尚驰洗车:兰州高端洗车店精致洗车流程
  19. Android性能优化之工具篇 — — 开发者选项
  20. 眩光和鬼影产生的原因分析

热门文章

  1. facebook开源项目全景投影转换Transform360
  2. 【报告分享】中国娱乐社交企业出海发展专题2021-易观智库(附下载)
  3. windows 10“查看设备和打印机“中,存在大量”多媒体设备”
  4. 2013工程量清单计价规范GB50500-2013
  5. 端口映射的几种实现方法(转)
  6. 2019各地高层次人才引进计划推荐
  7. java计算机毕业设计面向餐饮行业的会员营销系统源码+系统+数据库+lw文档+mybatis+运行部署
  8. 汇总 深圳工业交换机的厂家
  9. iTab新标签页重磅更新 |这些功能绝对有你想要的新体验!
  10. matlab实现基于24位真彩色BMP图像的文件信息隐藏方法(实验内容)