实现动画按钮的几种方法
林 颖
所谓动画按钮是指同一个按钮能显示不同的画面。动画按钮对改进应用程序中用户的界面起到功不可没的作用。在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属性的值,太大了,动画效果不好;太小了有闪烁感。