程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DELPHI 打印預覽功能

DELPHI 打印預覽功能

編輯:Delphi

  在很多應用程序中,都需要程序具有打印預覽功能,以避免用戶由於選擇不當出現打印錯誤。

          預覽實現方式為通過創建一個Tpanel的派生類並公開它的canvas屬性比例尺或視區范圍,使用較為不方便,筆者通過實踐實現了用圖元文件(Metafile)來實現打印預覽的方法,這種方式不需要調整比例尺和視區范圍。

  DELPHI打印預覽功能基本原理和方法:

    圖元文件也稱作"繪圖類型"的圖形,是以圖形對象(線、圓弧、多邊形)方式而不是像素方式來儲存圖像。圖元文件將圖形定義為編碼的確線段和圖形。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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved