目前在許多學習軟件
游戲光盤中
經常會看到各種圖形顯示技巧
憑著圖形的移動
交錯
雨滴狀
百頁窗
積木堆疊等顯現方式
使畫面變得更為生動活潑
更能吸引觀眾
本文將探討如何在Delphi中實現各種圖形顯示技巧
一
基本原理
在Delphi中
實現一副圖像的顯示是非常簡單的
只要在Form中定義一個TImage組件
設置其picture屬性
然後選擇任何有效的
ICO
BMP
EMF或
WMF文件
進行Load
所選文件就顯示在TImage組件中了
但這只是直接將圖形顯示在窗體中
毫無技巧可言
為了使圖形顯示具有別具一格的效果
可以按下列步驟實現
定義一個TImage組件
把要顯示的圖形先裝入到TImage組件中
也就是說
把圖形內容從磁盤載入內存中
作為圖形緩存
創建一新的位圖對象
其尺寸跟TImage組件中的圖形一樣
利用畫布(Canvas)的CopyRect功能(將一個畫布的矩形區域拷貝到另一個畫布的矩形區域)
使用一定技巧
動態形成位圖文件內容
然後在窗體中顯示位圖
二
實現方法
下面介紹各種圖形顯示技巧
推拉效果
將要顯示的圖形由上
下
左
右方向拉進屏幕內顯示
同時將屏幕上原來的舊圖覆蓋掉
此種效果可分為四種
上拉
下拉
左拉
右拉
但原理都差不多
以上拉效果為例
原理
首先將放在暫存圖形的第一條水平線搬移至要顯示的位圖的最後一條
接著再將暫存圖形的前兩條水平線
依序搬移至要顯示位圖的最後兩條水平線
然後搬移前三條
前四條
直到全部圖形數據搬完為止
在搬移的過程中即可看到顯示的位圖由下而上浮起
而達到上拉的效果
程序算法
procedure TForm
Button
Click(Sender: TObject);
var
newbmp: TBitmap;
i
bmpheight
bmpwidth:integer;
begin
newbmp:= TBitmap
Create;
newbmp
Width:=image
Width;
newbmp
Height:=image
Height;
bmpheight:=image
Height;
bmpwidth:=image
Width;
for i:=
to bmpheight do
begin
newbmp
Canvas
CopyRect(Rect
(
bmpheight-i
bmpwidth
bmpheight)
image
Canvas
Rect(
bmpwidth
i));
form
Canvas
Draw(
newbmp);
end;
newbmp
free;
end;
垂直交錯效果
原理
將要顯示的圖形拆成兩部分
奇數條掃描線由上往下搬移
偶數條掃描線則由下往上搬移
而且兩者同時進行
從屏幕上便可看到分別由上下兩端出現的較淡圖形向屏幕中央移動
直到完全清楚為止
程序算法
procedure TForm
Button
Click(Sender: TObject);
var
newbmp:TBitmap;
i
j
bmpheight
bmpwidth:integer;
begin
newbmp:= TBitmap
Create;
newbmp
Width:=image
Width;
newbmp
Height:=image
Height;
bmpheight:=image
Height;
bmpwidth:=image
Width;
i:=
;
while i< =bmpheight do
begin
j:=i;
while j >
do
begin
newbmp
Canvas
CopyRect(Rect(
j-
bmpwidth
j)
image
Canvas
Rect(
bmpheight-i+j-
bmpwidth
bmpheight-i+j));
newbmp
Canvas
CopyRect(Rect
(
bmpheight-j
bmpwidth
bmpheight-j+
)
image
Canvas
Rect(
i-j
bmpwidth
i-j+
));
j:=j-
;
end;
form
Canvas
Draw(
newbmp);
i:=i+
;
end;
newbmp
free;
end;
水平交錯效果
同垂直交錯效果原理一樣
只是將分成兩組後的圖形分別由左右兩端移進屏幕
程序算法從略
雨滴效果
原理
將暫存圖形的最後一條掃描線
依序搬移到可視位圖的第一條到最後一條掃描線
讓此條掃描線在屏幕上留下它的軌跡
接著再把暫存圖形的倒數第二條掃描線
依序搬移到可視位圖的第一條到倒數第二條掃描線
其余的掃描線依此類推
程序算法
procedure TForm
Button
Click(Sender: TObject);
var
newbmp:TBitmap;
i
j
bmpheight
bmpwidth:integer;
begin
newbmp:= TBitmap
Create;
newbmp
Width:=image
Width;
newbmp
Height:=image
Height;
bmpheight:=image
Height;
bmpwidth:=image
Width;
for i:=bmpheight downto
do
for j:=
to i do
begin
newbmp
Canvas
CopyRect(Rect(
j-
bmpwidth
j)
image
Canvas
Rect(
i-
bmpwidth
i));
form
Canvas
Draw(
newbmp);
end;
newbmp
free;
end;
百葉窗效果
原理
將放在暫存圖形的數據分成若干組
然後依次從第一組到最後一組搬移
第一次每組各搬移第一條掃描線到可視位圖的相應位置
第二次搬移第二條掃描線
接著搬移第三條
第四條掃描線
其余掃描線依此類推
程序算法
procedure TForm
Button
Click(Sender: TObject);
var
newbmp:TBitmap;
i
j
bmpheight
bmpwidth:integer;
xgroup
xcount:integer;
begin
newbmp:= TBitmap
Create;
newbmp
Width:=image
Width;
newbmp
Height:=image
Height;
bmpheight:=image
Height;
bmpwidth:=image
Width;
xgroup:=
;
xcount:=bmpheight div xgroup;
for i:=
to xcount do
for j:=
to xgroup do
begin
newbmp
Canvas
CopyRect(Rect
(
xcount*j+i-
bmpwidth
xcount*j+i)
image
Canvas
Rect(
xcount*j+i-
bmpwidth
xcount*j+i));
form
Canvas
Draw(
newbmp);
end;
newbmp
Free;
end;
From:http://tw.wingwit.com/Article/program/Delphi/201311/8405.html