目前在许多学习软件
游戏光盘中
经常会看到各种图形显示技巧
凭着图形的移动
交错
雨滴状
百页窗
积木堆叠等显现方式
使画面变得更为生动活泼
更能吸引观众
本文将探讨如何在Delphi中实现各种图形显示技巧
一基本原理
在Delphi中实现一副图像的显示是非常简单的只要在Form中定义一个TImage组件设置其picture属性然后选择任何有效的ICOBMPEMF或WMF文件进行Load所选文件就显示在TImage组件中了但这只是直接将图形显示在窗体中毫无技巧可言为了使图形显示具有别具一格的效果可以按下列步骤实现
定义一个TImage组件把要显示的图形先装入到TImage组件中也就是说把图形内容从磁盘载入内存中作为图形缓存
创建一新的位图对象其尺寸跟TImage组件中的图形一样
利用画布(Canvas)的CopyRect功能(将一个画布的矩形区域拷贝到另一个画布的矩形区域)使用一定技巧动态形成位图文件内容然后在窗体中显示位图
二实现方法
下面介绍各种图形显示技巧
推拉效果
将要显示的图形由上下左右方向拉进屏幕内显示同时将屏幕上原来的旧图覆盖掉此种效果可分为四种上拉下拉左拉右拉但原理都差不多以上拉效果为例
原理首先将放在暂存图形的第一条水平线搬移至要显示的位图的最后一条接着再将暂存图形的前两条水平线依序搬移至要显示位图的最后两条水平线然后搬移前三条前四条直到全部图形数据搬完为止在搬移的过程中即可看到显示的位图由下而上浮起而达到上拉的效果
程序算法
procedure TFormButtonClick(Sender: TObject);
var
newbmp: TBitmap;
ibmpheightbmpwidth:integer;
begin
newbmp:= TBitmapCreate;
newbmpWidth:=imageWidth;
newbmpHeight:=imageHeight;
bmpheight:=imageHeight;
bmpwidth:=imageWidth;
for i:= to bmpheight do
begin
newbmpCanvasCopyRect(Rect
(bmpheight-ibmpwidthbmpheight)
imageCanvas
Rect(bmpwidthi));
formCanvasDraw(newbmp);
end;
newbmpfree;
end;
垂直交错效果
原理将要显示的图形拆成两部分奇数条扫描线由上往下搬移偶数条扫描线则由下往上搬移而且两者同时进行从屏幕上便可看到分别由上下两端出现的较淡图形向屏幕中央移动直到完全清楚为止
程序算法
procedure TFormButtonClick(Sender: TObject);
var
newbmp:TBitmap;
ijbmpheightbmpwidth:integer;
begin
newbmp:= TBitmapCreate;
newbmpWidth:=imageWidth;
newbmpHeight:=imageHeight;
bmpheight:=imageHeight;
bmpwidth:=imageWidth;
i:=;
while i< =bmpheight do
begin
j:=i;
while j > do
begin
newbmpCanvasCopyRect(Rect(j-bmpwidthj)
imageCanvas
Rect(bmpheight-i+j-bmpwidthbmpheight-i+j));
newbmpCanvasCopyRect(Rect
(bmpheight-jbmpwidthbmpheight-j+)
imageCanvas
Rect(i-jbmpwidthi-j+));
j:=j-;
end;
formCanvasDraw(newbmp);
i:=i+;
end;
newbmpfree;
end;
水平交错效果
同垂直交错效果原理一样只是将分成两组后的图形分别由左右两端移进屏幕程序算法从略
雨滴效果
原理将暂存图形的最后一条扫描线依序搬移到可视位图的第一条到最后一条扫描线让此条扫描线在屏幕上留下它的轨迹接着再把暂存图形的倒数第二条扫描线依序搬移到可视位图的第一条到倒数第二条扫描线其余的扫描线依此类推
程序算法
procedure TFormButtonClick(Sender: TObject);
var
newbmp:TBitmap;
ijbmpheightbmpwidth:integer;
begin
newbmp:= TBitmapCreate;
newbmpWidth:=imageWidth;
newbmpHeight:=imageHeight;
bmpheight:=imageHeight;
bmpwidth:=imageWidth;
for i:=bmpheight downto do
for j:= to i do
begin
newbmpCanvasCopyRect(Rect(j-bmpwidthj)
imageCanvas
Rect(i-bmpwidthi));
formCanvasDraw(newbmp);
end;
newbmpfree;
end;
百叶窗效果
原理将放在暂存图形的数据分成若干组然后依次从第一组到最后一组搬移第一次每组各搬移第一条扫描线到可视位图的相应位置第二次搬移第二条扫描线接着搬移第三条第四条扫描线其余扫描线依此类推
程序算法
procedure TFormButtonClick(Sender: TObject);
var
newbmp:TBitmap;
ijbmpheightbmpwidth:integer;
xgroupxcount:integer;
begin
newbmp:= TBitmapCreate;
newbmpWidth:=imageWidth;
newbmpHeight:=imageHeight;
bmpheight:=imageHeight;
bmpwidth:=imageWidth;
xgroup:=;
xcount:=bmpheight div xgroup;
for i:= to xcount do
for j:= to xgroup do
begin
newbmpCanvasCopyRect(Rect
(xcount*j+i-bmpwidthxcount*j+i)
imageCanvas
Rect(xcount*j+i-bmpwidthxcount*j+i));
formCanvasDraw(newbmp);
end;
newbmpFree;
end;