其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

用Delphi实现位图显示特技


发布日期:2020年09月16日
 
用Delphi实现位图显示特技

在应用程序中引入位图并以多种特技显示会使程序界面生动形象充满魅力那么在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方法实现特技该例包括三个构件TformTeditl和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中如何调用WindowsAPI每当生成一个新的项目时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.

上一篇:DELPHI超级Internet控件集--INDY

下一篇:利用Delphi开发网络数据库应用