• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

用Delphi实现位图显示特技_Delphi

Delphi 搞代码 3年前 (2018-08-09) 139次浏览 已收录 0个评论

作者:张晓辉 王孝军

  在应用程序中引入位图并以多种特技显示,会使程序
界面生动形象,充满魅力。那么在Delphi环境中如何实现
这一切呢?笔者在用Delphi开发一个多媒体系统时发现了
实现位图显示特技的两种方法,下面将对这两种方法予以
介绍,供Delphi爱好者参考。

   一、画布Tcanvas简介

http://www.gaodaima.com/?p=65993用Delphi实现位图显示特技_Delphi

  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定义拷贝的模式,而CopyRec
t执行位图拷贝的操作。当CopyMode定义为缺省值cmSrcCo
py时,CopyRect将源画布上的一部分位图拷贝到目标画布
上的一个矩形区域内。CopyRect的过程声明及参数意义如
下:

  procedureCopyRect(Dest:TRect;Canvas:TCanva
s;Source:TRect);

  Dest目标画布上的矩形区域

  Canvas源画布

  Source源画布上的矩形区域

  下面以一个拉动特技的实现为例,说明如何用CopyRe
ct方法实现特技。该例包括三个构件:Tform1、Teditl
和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);

  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中如何调用WindowsAPI。每
当生成一个新的项目时,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;

  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.

欢迎大家阅读《用Delphi实现位图显示特技_Delphi》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址