用Delphi实现位图显示特技
点击次数:28 次 发布日期:2008-11-09 08:41:47 作者:源代码网
|
源代码网推荐 源代码网推荐 在应用程序中引入位图并以多种特技显示,会使程序 源代码网推荐 界面生动形象,充满魅力。那么在Delphi环境中如何实现 源代码网推荐 这一切呢?笔者在用Delphi开发一个多媒体系统时发现了 源代码网推荐 实现位图显示特技的两种方法,下面将对这两种方法予以 源代码网推荐 介绍,供Delphi爱好者参考。 源代码网推荐 源代码网推荐 一、画布Tcanvas简介 源代码网推荐 源代码网推荐 Delphi中与绘图和位图操作有关的对象是画布Tcanva 源代码网推荐 s。Tcanvas对象功能强大,封装了WindowsAPI的GDI,用 源代码网推荐 户可以很方便地在画布上绘制直线、矩形、椭圆、多边形 源代码网推荐 等基本图形,还可以显示、拷贝位图,却不必关心设备上 源代码网推荐 下文等GDI概念,极大地方便了用户。Tcanvas对象本身并 源代码网推荐 不是一个构件,不单独使用,它总是作为其它对象的属性 源代码网推荐 来使用的。Delphi有四个对象具有画布属性,它们是TForm 源代码网推荐 、TImage、TPaintbox和Tbitmap,其中前三者是可视化构 源代码网推荐 件。至于Tcanvas的详细情况,可以参考Delphi的联机帮 源代码网推荐 助。 源代码网推荐 源代码网推荐 实现简单的位图显示特技,实际上就是以不同的方式 源代码网推荐 逐渐将源位图拷贝到Tcanvas类型的对象上,如从位图的 源代码网推荐 中央开始拷贝一个矩形区域到屏幕中央,矩形区域不断扩 源代码网推荐 大直到拷贝整个位图,其视觉效果就是位图从屏幕中央向 源代码网推荐 四周扩散。不同的拷贝方式就形成了多种特技形式,如扩 源代码网推荐 散、拉动和百叶窗等。对于每种特技形式灵活运用,又可 源代码网推荐 演变出多种花样,如扩散可以演变为从上向下、从左向右 源代码网推荐 、从中间向四周和相反方向的扩散,以及从一角向对角方 源代码网推荐 向扩散的特技花样。 源代码网推荐 源代码网推荐 实现上述位图显示特技的原理很简单,关键是怎样实 源代码网推荐 现位图的拷贝。在Delphi中有两种拷贝位图的方法,相应 源代码网推荐 地就有两种实现位图显示特技的方法,一种是用Tcanvas 源代码网推荐 对象的方法CopyRect,另一种是调用WindowsAPI的BitBlt 源代码网推荐 函数。下面就以两种特技的实现为例分别介绍这两种方法 源代码网推荐 。 源代码网推荐 源代码网推荐 二、方法之一:调用CopyRect 源代码网推荐 源代码网推荐 Tcanvas对象与拷贝位图有关的是CopyMode属性和Cop 源代码网推荐 yRect方法,其中CopyMode定义拷贝的模式,而CopyRec 源代码网推荐 t执行位图拷贝的操作。当CopyMode定义为缺省值cmSrcCo 源代码网推荐 py时,CopyRect将源画布上的一部分位图拷贝到目标画布 源代码网推荐 上的一个矩形区域内。CopyRect的过程声明及参数意义如 源代码网推荐 下: 源代码网推荐 源代码网推荐 procedureCopyRect(Dest:TRect;Canvas:TCanva 源代码网推荐 s;Source:TRect); 源代码网推荐 源代码网推荐 Dest目标画布上的矩形区域 源代码网推荐 源代码网推荐 Canvas源画布 源代码网推荐 源代码网推荐 Source源画布上的矩形区域 源代码网推荐 源代码网推荐 下面以一个拉动特技的实现为例,说明如何用CopyRe 源代码网推荐 ct方法实现特技。该例包括三个构件:Tform1、Teditl 源代码网推荐 和Tbuttonl,变量step控制拉动的步骤。程序运行后,从 源代码网推荐 Teditl中输入待显示位图文件名,然后单击Tbuttonl,这 源代码网推荐 时位图从左侧出现并逐渐向右侧移动,好似位图被从左向 源代码网推荐 右拉动一样,拉动结束后位图左上角坐标为(x0,y0)。 源代码网推荐 该例程序清单如下所示: 源代码网推荐 源代码网推荐 procedureTForml.ButtonlClick(Sender:TObject 源代码网推荐 ); 源代码网推荐 源代码网推荐 conststepΚ200; 源代码网推荐 源代码网推荐 x0Κ20; 源代码网推荐 源代码网推荐 y0Κ20; 源代码网推荐 源代码网推荐 varbitmap:tbitmap; 源代码网推荐 源代码网推荐 midx:integer;{中间变量,当前步骤所拷贝位图 源代码网推荐 的宽} 源代码网推荐 源代码网推荐 ratiox:real;{每步位图宽度增加量} 源代码网推荐 源代码网推荐 i:integer; 源代码网推荐 源代码网推荐 rect1,rect2:trect;{源、目标矩形区域} 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 bitmap:Κtbitmap.create; 源代码网推荐 源代码网推荐 bitmap.loadfromfile(edit1.text); 源代码网推荐 源代码网推荐 ratiox:Κbitmap.width/step; 源代码网推荐 源代码网推荐 fori:Κotostepdo 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 midx:Κround(ratiox*i); 软件开发网 www.mscto.com 源代码网推荐 源代码网推荐 withrect1do 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 left:Κbitmap.width-midx; 源代码网推荐 源代码网推荐 topΚ0; 源代码网推荐 源代码网推荐 right:Κbitmap.width; 源代码网推荐 源代码网推荐 bottom:Κbitmap.height; 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 withrect2do 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 left:Κx0; 源代码网推荐 源代码网推荐 top:Κy0; 源代码网推荐 源代码网推荐 right:Κx0+midx; 源代码网推荐 源代码网推荐 bottom:Κyo+bitmap.height; 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 canvas.copyrect(rect2,bitmap.canvas,rect1 源代码网推荐 ); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 bitmap.free; 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 三、方法之二:调用BitBlt函数 源代码网推荐 源代码网推荐 这里涉及到了在Delphi中如何调用WindowsAPI。每 源代码网推荐 当生成一个新的项目时,Delphi自动地把WinType和WinPr 源代码网推荐 ocs单元名添加到所生成单元文件中的uses子句中,这两 源代码网推荐 个单元包含了Delphi调用WindowsAPI所必须的类型定义和 源代码网推荐 例程声明。这样,只需使用正确的参数就可以直接调用Win 源代码网推荐 dowsAPI,而不需要再作其它任何声明。 源代码网推荐 源代码网推荐 BitBlt及类似的StretchBlt函数是Windows功能强大 源代码网推荐 的图形处理函数,它的功能与TCanvas的CopyRect函数一样 源代码网推荐 ,不仅能够将位图或位图的一部分从一处拷贝到另一处, 源代码网推荐 它还可以根据256个不同的光栅操作码将三幅位图结合起 源代码网推荐 来,从而呈现不同的视觉效果。在WindowsAPI函数中,所 源代码网推荐 有的blt函数的鼻祖都是BitBlt函数。在Delphi中BitBlt函 源代码网推荐 数声明及参数意义如下: 源代码网推荐 源代码网推荐 functionBitBlt(DestDC:HDC;X,Y,nWidth,Hei 源代码网推荐 ght:Integer;SrcDC;HDC;XSrc,YSRC:Ingeger;Rop 源代码网推荐 :LongInt):Bool; 源代码网推荐 源代码网推荐 DestDC源设备上下文句柄 源代码网推荐 源代码网推荐 X,Y源矩形左上角坐标 源代码网推荐 源代码网推荐 nWidth,Height目标矩形的宽度和高度 源代码网推荐 源代码网推荐 SrcDC目标矩形句柄 源代码网推荐 源代码网推荐 XSrc,TSrc源位图矩形左上角坐标 源代码网推荐 源代码网推荐 Rop光栅操作码。对于简单的拷贝,其值为SRCCOPY 源代码网推荐 源代码网推荐 下面同样以一个例子来说明如何用BitBlt实现特技。 源代码网推荐 本例所实现的特技是将选定的位图从屏幕中心开始向四周 源代码网推荐 扩散,最后整个位图全部显示出来。此例的程序清单如下 源代码网推荐 : 源代码网推荐 源代码网推荐 procedureTForm1,Button2Click(Sender:TObject 源代码网推荐 ); 源代码网推荐 源代码网推荐 conststepΚ200; 源代码网推荐 源代码网推荐 var 源代码网推荐 源代码网推荐 bitmap:tbitmap; 源代码网推荐 源代码网推荐 x0,y0:integer;{屏幕中心坐标} 源代码网推荐 源代码网推荐 midx,midy:integer; 源代码网推荐 源代码网推荐 ratiox,ratioy:teal; 源代码网推荐 软件开发网 www.mscto.com 源代码网推荐 i:integer; 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 bitmap:Κtbitmap.create; 源代码网推荐 源代码网推荐 bitmap.loadfromfile(edit1.text); 源代码网推荐 源代码网推荐 x0:Κround(form1.width/2); 源代码网推荐 源代码网推荐 y0:Κround(form1.height/2); 源代码网推荐 源代码网推荐 ratiox:Κbitmap.width/step; 源代码网推荐 源代码网推荐 ratioy:Κbitmap.height/step; 源代码网推荐 源代码网推荐 fori:Κ0tostepdo 源代码网推荐 源代码网推荐 begin 源代码网推荐 源代码网推荐 midx:Κround(ratiox*i); 源代码网推荐 源代码网推荐 midy:Κround(ratioy*i); 源代码网推荐 源代码网推荐 bitblt(form1.canvas.handle,x0-midx,y0-m 源代码网推荐 idy,round(ratiox*i*1),round(ratioy*i*2) 源代码网推荐 ,bitmap.canvas.handle,x0-midy,y0-midy,,src 源代码网推荐 copy); 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 bitmap.free; 源代码网推荐 源代码网推荐 end. 软件开发网 www.mscto.com 源代码网推荐 源代码网供稿. |
