在應用程序中引入位圖並以多種特技顯示會使程序界面生動形象充滿魅力那麼在Delphi環境中如何實現這一切呢?筆者在用Delphi開發一個多媒體系統時發現了實現位圖顯示特技的兩種方法下面將對這兩種方法予以介紹供Delphi愛好者參考
一畫布Tcanvas簡介
Delphi中與繪圖和位圖操作有關的對象是畫布TcanvasTcanvas對象功能強大封裝了WindowsAPI的GDI用戶可以很方便地在畫布上繪制直線矩形橢圓多邊形等基本圖形還可以顯示拷貝位圖卻不必關心設備上下文等GDI概念極大地方便了用戶Tcanvas對象本身並不是一個構件不單獨使用它總是作為其它對象的屬性來使用的
Delphi有四個對象具有畫布屬性它們是TFormTImageTPaintbox和Tbitmap其中前三者是可視化構件至於Tcanvas的詳細情況可以參考Delphi的聯機幫助
實現簡單的位圖顯示特技實際上就是以不同的方式逐漸將源位圖拷貝到Tcanvas類型的對象上如從位圖的中央開始拷貝一個矩形區域到屏幕中央矩形區域不斷擴大直到拷貝整個位圖其視覺效果就是位圖從屏幕中央向四周擴散不同的拷貝方式就形成了多種特技形式如擴散拉動和百葉窗等對於每種特技形式靈活運用又可演變出多種花樣如擴散可以演變為從上向下從左向右從中間向四周和相反方向的擴散以及從一角向對角方向擴散的特技花樣
實現上述位圖顯示特技的原理很簡單關鍵是怎樣實現位圖的拷貝在Delphi中有兩種拷貝位圖的方法相應地就有兩種實現位圖顯示特技的方法一種是用Tcanvas對象的方法CopyRect另一種是調用WindowsAPI的BitBlt函數下面就以兩種特技的實現為例分別介紹這兩種方法
二方法之一調用CopyRect
Tcanvas對象與拷貝位圖有關的是CopyMode屬性和CopyRect方法其中CopyMode定義拷貝的模式而Copy Rect執行位圖拷貝的操作當CopyMode定義為缺省值cmSrcCopy時CopyRect將源畫布上的一部分位圖拷貝到目標畫布上的一個矩形區域內CopyRect的過程聲明及參數意義如下
procedureCopyRect(DestTRectCanvasTCanva
sSourceTRect)
Dest目標畫布上的矩形區域
Canvas源畫布
Source源畫布上的矩形區域
下面以一個拉動特技的實現為例說明如何用CopyRect方法實現特技該例包括三個構件TformTeditl和Tbuttonl變量step控制拉動的步驟程序運行後從Teditl中輸入待顯示位圖文件名然後單擊Tbuttonl這時位圖從左側出現並逐漸向右側移動好似位圖被從左向右拉動一樣拉動結束後位圖左上角坐標為(xy)該例程序清單如下所示
procedureTForml.ButtonlClick(SenderTObject
)
conststepΚ
xΚ
yΚ
varbitmaptbitmap
midxinteger{中間變量當前步驟所拷貝位圖
的寬}
ratioxreal{每步位圖寬度增加量}
iinteger
rectrecttrect{源目標矩形區域}
begin
bitmapΚtbitmap.create
bitmap.loadfromfile(edit.text)
ratioxΚbitmap.width/step
foriΚotostepdo
begin
midxΚround(ratiox*i)
withrectdo
begin
leftΚbitmap.width-midx
topΚ
rightΚbitmap.width
bottomΚbitmap.height
end
withrectdo
begin
leftΚx
topΚy
rightΚx+midx
bottomΚyo+bitmap.height
end
canvas.copyrect(rectbitmap.canvasrect
)
end
bitmap.free
end
三方法之二調用BitBlt函數
這裡涉及到了在Delphi中如何調用WindowsAPI每當生成一個新的項目時Delphi自動地把WinType和WinProcs單元名添加到所生成單元文件中的uses子句中這兩個單元包含了Delphi調用WindowsAPI所必須的類型定義和例程聲明這樣只需使用正確的參數就可以直接調用WindowsAPI而不需要再作其它任何聲明
BitBlt及類似的StretchBlt函數是Windows功能強大的圖形處理函數它的功能與TCanvas的CopyRect函數一樣不僅能夠將位圖或位圖的一部分從一處拷貝到另一處它還可以根據個不同的光柵操作碼將三幅位圖結合起來從而呈現不同的視覺效果在WindowsAPI函數中所有的blt函數的鼻祖都是BitBlt函數在Delphi中BitBlt函數聲明及參數意義如下
functionBitBlt(DestDCHDCXYnWidthHei
ghtIntegerSrcDCHDCXSrcYSRCIngegerRop
LongInt)Bool
DestDC源設備上下文句柄
XY源矩形左上角坐標
nWidthHeight目標矩形的寬度和高度
SrcDC目標矩形句柄
XSrcTSrc源位圖矩形左上角坐標
Rop光柵操作碼對於簡單的拷貝其值為SRCCOPY
下面同樣以一個例子來說明如何用BitBlt實現特技本例所實現的特技是將選定的位圖從屏幕中心開始向四周擴散最後整個位圖全部顯示出來此例的程序清單如下
procedureTFormButtonClick(SenderTObject
)
conststepΚ
var
bitmaptbitmap
xyinteger{屏幕中心坐標}
midxmidyinteger
ratioxratioyteal
iinteger
begin
bitmapΚtbitmap.create
bitmap.loadfromfile(edit.text)
xΚround(form.width/)
yΚround(form.height/)
ratioxΚbitmap.width/step
ratioyΚbitmap.height/step
foriΚtostepdo
begin
midxΚround(ratiox*i)
midyΚround(ratioy*i)
bitblt(form.canvas.handlex-midxy-m
idyround(ratiox*i*)round(ratioy*i*)
bitmap.canvas.handlex-midyy-midysrc
copy)
end
bitmap.free
end.
From:http://tw.wingwit.com/Article/program/Delphi/201311/25071.html