ccidnet????

出版日期:2000-01-12 总期号:352 本年期号:02

本期导读
新闻与市场
家用pc
软件天地
电脑诊室
网络时代
diy烽火
电脑教育
游戏乐园
实现动画按钮的几种方法

林颖

  所谓动画按钮是指同一个按钮能显示不同的画面。动画按钮对改进应用程序中用户的界面起到功不可没的作用。在delphi中提供了位图按钮的构件,利用系统提供的属性可以轻松地实现动画按钮。以下是笔者总结出来的几种方法。



  利用visible属性

  由于delphi的每个构件都有visible属性。因此只需利用这个属性使两个按钮交替显示即可实现按钮的动画。

  具体实现如下:

  1、在屏幕的适当位置放两个形状、大小一模一样的位图按钮,分别为bitbtn1和bitbtn2;

  2、利用glyph属性为两个按钮分别设置位图;

  3、把bitbtn2的visible属性设置成false;

  4、在bitbtn1的onmousedown事件中写下如下命令:

  bitbtn1.visible:=false;

  bitbtn2.visible:=true;

  form1.bitbtn2mousedown(sender,button,shift,3,5);//这句是该方法的关键语句。

  按下bitbtn1按钮的同时用程序模拟按下bitbtn2按钮;form1是按钮所在的form的名字;

  5、在bitbtn2的onmouseup事件中写下如下命令:

  bitbtn2.visible:=false;

  bitbtn1.visible:=true;

  6、有时候将鼠标按下后并未松开鼠标,而是按住鼠标键的同时从按钮上移开,此时必须显示按钮bitbtn1,因此还必须在form1的onmousetup事件中添入如下语句:

  bitbtn3.visible:=false;

  bitbtn1.visible:=true;

  这种方法的优点是两个画面中不但位图可以不一样,连文字都可以不一样,因此文字的颜色也可以很方便地随意设置;缺点是按钮按下去时缺少凹进去的感觉。



  利用位图的loadfromfile

  由于位图按钮中的图画是位图格式的,因此可以利用loadfromfile方法在鼠标按下去和弹起时改变位图文件。具体方法如下:

  1、准备按钮的两个图像所对应的位图文件1.bmp和2.bmp;

  2、在屏幕的适当位置设置按钮,并把glyph属性设置成1.bmp的图像;

  3、在按钮的onmousedown事件中键入如下语句:

  bitbtn2.glyph.loadfromfile(′2.bmp′);

  4、在按钮的onmouseup事件中键入如下语句:

  bitbtn2.glyph.loadfromfile(′1.bmp′);

  显然这种方法要比第一种方法的效果更好,更简单。



  利用numglyph属性

  在bitbtn构件中有一个numglyph属性,利用它,系统可以把装入的glyph等分成若干个位图,并在按钮的不同状态显示不同的位图,由此实现按钮的动画。其中第一幅位图显示在默认状态,第二幅位图显示在enable属性为false时的状态,第三幅位图用于onclick状态,第四幅位图用于当按钮始终保持被按下的状态时使用(就像复选框的功能一样)。具体实现如下(在本例中只要求实现当按钮按下时按钮位图发生变化):

  1、准备两幅大小一样的位图:1.bmp 和 2.bmp;

  2、利用画图工具把1.bmp文件和2.bmp文件中的位图水平拼接起来,生成一个新的位图文件new.bmp。由于1.bmp文件中的位图用在按钮默认状态,2.bmp文件中的位图用于按钮按下后的状态,因此拼接后1.bmp文件中的位图处于第一幅位图的位置,2.bmp文件中的位图必须处于第三幅位图的位置,所以在拼接过程中1.bmp与2.bmp的位图中间要留出一个与位图大小一样的空白区(即第二个位图的位置要空出来);

  3 在form的适当位置设置一个bitbtn构件,在glyph属性上设置成new.bmp;

  4、把numglyph属性设置成3;

  利用这种方法,不用编写任何的程序代码,即可实现当按钮按下后,按钮图像发生变化的动画效果。在使用这种方法时,要注意在glyph属性中设置的位图的宽度=位图的高度×numglyph。

  如果在准备位图时只准备了一幅图像,而在numglyph中把值设置成3,系统会自动地把该位图三等分后再在不同的状态显示不同的图像。所以用这种方法实现位图的动画比较的方便。



  利用timer构件

  以上三种方法实现的动画按钮都是只有当按下按钮时,按钮的图像才发生变化。利用timer组件,不按下按钮也可以随意地改变按钮上的图像,具体方法如下:

  1、在form中设置一个timer1,并在适当位置设置一个位图按钮bitbtn1;

  2、在timer1的ontimer事件中输入如下语句:

  if state then

  bitbtn1.glyph.loadfromfile(′1.bmp′)

  else bitbtn2.glyph.loadfromfile(′2.bmp′);

  state:=not state;

  //state为状态指示

  程序运行时,按扭上就轮流显示两幅图画。 如果多准备一些位图文件,多设几个状态动感就更强。这种方法要注意timer1的intervel属性的值,太大了,动画效果不好;太小了有闪烁感。