Database 版 (精华区)

发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标  题: 在Visual FoxPro中设计豪华封面
发信站: 哈工大紫丁香 (2000年12月13日09:11:39 星期三), 站内信件




在Visual FoxPro中设计豪华封面 
广东肇庆加美海外学校 
张镜明 刘杰 
---- 当你历尽千辛万苦写完一个应用程序后,肯定是希望它倍受欢迎;一个既有
美感又有动感的漂亮封面定会令你的软件魅力倍增。设计封面的一般做法是借助
3DS、PowerPoint、3DCool等工具制作一个可执行文件,然后挂接在你的程序中。
这样做固然好,但也有不少缺点,比如会使你的软件变得臃肿,连接有痕迹,效果
不够理想灵活等。下面介绍的是笔者在Visual FoxPro下设计封面的一些心得,主
要探讨的是如何通过编程的手段来实现动画效果,原理很简单,实现也比较容易,
相信对各位同行会有一定的启发作用。 

---- 在Visual FoxPro中有个叫定时器(计时器)的控件(Timer控制),它能按
一定的时间间隔规则地执行代码,是实现动画效果的“法宝”。 Timer控制有个属
性Interval用来指定计时器控制的 Timer 事件之间的时间间隔毫秒数,一般将这
个属性值设为10,也就是说每隔10毫秒,将会触发一次计时器的Timer 事件;在
Timer 事件中写上有条件地改变某个控件的Height、Width、Top、Left、Visible
等等属性的代码,就能让这个控件按我们的要求动起来。 

---- 我们借助PowerPoint的一些术语来具体看看各种效果的实现方法: 

---- 一、 缓慢移入和飞入: 

---- 这是最容易实现的一种,只需要编程改变控件的Top或Left属性即可。例如,
现有一个名为Form1的表单里,已经建立了一个名为Image1的图象控制,此控件的
Picture属性已设好,想让这幅图片从底部缓慢移入屏幕,要做那些工作呢?首先
,将Image1的Top属性设为450(或根据你屏幕设置改为别的数字),也就是说,让
图片的顶部刚好位于屏幕的下边界;然后,建立一个名为Timer1的计时器,并将
Timer1的Interval属性设为10;接着,在Timer1的Timer事件中,写上几行这样的
代码: 

stayposition=100
speed=3
If Thisform.Image1.top
---- 其中,变量stayposition用于控制图片最后停留的位置,变量speed用于控制
图片的移动速度。运行这个表单,将会看到一幅图片以你需要的速度,从屏幕底部
出发,一直移动到你所需要的位置,然后停下来。如果你想程序运行时,要有一定
的动作(例如单击屏幕),图片才开始移动,我们可以先把Timer1的Enabled属性
设为.F.,然后在Fomr1的Click事件上写上代码:Thisform.Timer1.enabled=.T.即
可。 

---- 当你真正理解底部缓慢移入的原理和实现方法时,所谓的底部飞入、从右下
角缓慢移入、从顶部飞入、从右侧飞入等等效果就轻而易举了,这里简单地说一下
:飞入,将speed的值改大即可;从顶部移入,稍为复杂一点,要将语句If 
Thisform.Image1.top”,并将语句Thisform.Image1.top=Thisform.Image1.
top-speed中的“-”改为“+”,还要修改图片初始的top属性,让图片开始时是处
于屏幕的顶部;从右侧移入,需要修改图片的初始left属性,并将上面程序中的所
有top改为left;而从左上角、右下角等处斜斜移入,则在程序中需要同时改变图
片的top和left属性。不过,所有这些的道理都是一样的。 

---- 二、 切入: 

---- 以右侧切入为例。这种效果看起来是从右到左将图片拉来出来。实现的方法
是:先将图片的width属性设为0;建立并设好计时器控件;在计时器的timer事件
中写上如下代码: 

stopwidth=170
speed=12
If Thisform.Image1.width >stopwidth then
  Thisform.Timer1.enabled=.F.
Else
  Thisform.Image1.width=Thisform.Image1.width+speed
  Thisform.Image1.left=Thisform.Image1.left-speed
Endif
---- 这里,变量stopwidth的值等于图片的原始宽度。同理,上侧切入的效果只需
将上述代码中的width改为height,将left改为top,并将图片的height属性设为0
即可。但由于VFP的一些限制,左侧切入和下侧切入的效果比较难于实现。 

---- 三、 擦除: 

---- 向右擦除的效果与从右侧切入非常相象,只是向右擦除看起来是将图片从左
往右摊开,而从右侧切入看起来是将图片从右往左拉出来。它们的实现方法也几乎
一样,仅将语句Thisform.Image1.left=Thisform.Image1.left-speed去掉就行了
。同样,向上擦除也是类似的,但向左、向下擦除的效果不易实现。 

---- 四、 伸展: 

---- 伸展跟切入的效果的区别在于:伸展过程中,整幅图片都能看见,不过是变
了形的;而切入的过程中,只能看见图片的一部分。伸展与切入的实现也几乎完全
相同,唯一的改动是将图片的stretch属性设为2(等比填充)。同样,其它方向的
伸展也是类似的。 

---- 五、 闪烁: 

---- 这个效果很容易实现。建立计时器,根据你所需要的闪烁速度设好它的
Interval属性,一般可设成500。在计时器的timer事件中写上如下代码: 

if  thisform. Image1.visible=.f. then
   thisform. Image1.visible=.t.
else
   thisform. Image1.visible=.f.   
endif
---- 图片Image1就能按你的需要闪烁起来,想停止闪烁,将计时器的enabled属性
设为.f.即可。 

---- 六、 百叶窗: 

---- 这个效果要实现比较复杂,我们先看水平百叶窗。首先,在图片上面建几个
白色的空白横条标签,刚好能将图片盖住,这些标签的名字分别取成“label1”、
“label2”……;然后建立并设好计时器控件,并在计时器的timer事件中写上如
下代码: 

speed=3
number=5
if  thisform.label1.height >=speed then
for i=1 to number
      j=str(i,int((int(i/10)+9)/10)+1)
      thisform.label&j..height=
      thisform.label&j..height-speed
next i
endif
---- 其中,变量speed用于控制图片出现的速度,number表示标签的个数。一般来
说标签的height属性要设成speed的倍数,而语句j=str(i,
int((int(i/10)+9)/10)+1),是用于根据i的值来确定字符j的长度,避免出错。至
于垂直百叶窗效果,将水平百叶窗效果中的横条标签变成竖条标签,再将代码中的
所有height改为width即可。 

---- 七、 棋盘式: 

---- 棋盘式的实现方法几乎和百叶窗一样,只是空白标签盖在图片上面的方式不
同。在棋盘式中,要先建立许多个标签,但这些标签并不完全把图片遮住,而是设
计成国际象棋的棋盘那样,一个格上放标签,另外一个格露出图片,标签依然取名
为“label1”、“label2”……代码则和百叶窗中的完全相同。 

---- 八、 回旋: 表面看来,回旋这种

---- 效果是图片在绕着一根轴在旋转,但实际我们可以通过改变图片的width属性
来实现这种效果。这时最好建立两个计时器,分别命名为timer1、timer2;
timer2用于控制减少图片的宽度,其timer事件的代码为: 

speed=4
if  thisform.image1.width<=speed then thisform.timer1.enabled=".t." 
thisform.timer2.enabled=".f." else thisform.image1.left="thisform.
image1.left+speed/2" thisform.image1.width="thisform.image1.width-speed"
 endif timer1用于控制增加图片的宽度,其timer事件的代码为: 
imagewidth="200" speed="4" if thisform.image1.width>=imagewidth    
then
    thisform.timer1.enabled=.f.
    thisform.timer2.enabled=.t.
else
    thisform.image1.left=thisform.image1.left-speed/2
    thisform.image1.width=thisform.image1.width+speed
endif
---- 其中,变量speed控制回旋的快慢,值要求是偶数, imagewidth代表图片的
原始宽度,图片的strecth属性要设成2-变比填充。想停止回旋,将timer1和
timer2的enabled属性都设为.f.即可。 

---- 九、 放大缩小: 

---- 这种效果虽然看起来与回旋相差甚远,但实现方法却与回旋几乎一样,只需
要把图片的strecth属性改为1-等比填充即可,代码不必做任何改动。 

---- 十、 变色: 

---- 变色效果一般只应用于文字。变色有许许多多的方式,这里介绍的是随机方
式。建立标签对象label1,设好其caption属性;建立计时器,其Interval属性根
据需要而设,一般可设为500,在timer事件中写上代码: 

i=int(rand()*255)
j=int(rand()*255)
k=int(rand()*255)
thisform.label1.forecolor=rgb(i,j,k)
---- 以上是本人在使用VFP3.0编程中所积累的一点粗浅经验,使用上述方法所设
计出来的软件封面的确堪称豪华。其实,只要懂得了原理,我们可以尽情发挥想象
力,设计出各种各样的漂亮效果。而且这个道理还可以应用于VB编程。最后,需要
补充的一点是,如果想为你的效果增添一点声音,请加上代码: 

SET BELL TO '你需要的声音.WAV', 0
?? CHR(7)
 


------------------------------------------------------------------------
--------

中国计算机世界出版服务公司版权所有 


--

       大海无边天做岸
               山登绝顶我为风

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.556毫秒