用Delphi实现窗体的动态渐进效果(原创) - 网络、编程相关 - 纵然情已逝

(这条文章已经被阅读了 67 次) 时间:2001-11-23 04:18:53 来源:纵然情已逝 (romantic) 原创-IT


纵然情已逝/文

用Delphi实现窗体的动态渐进效果(原创)

摘要:随着计算机应用的不断深入,软件的功能越来越强大,但使用越来越简单,软件的界面也日趋美化,如何制作一个漂亮的程序界面正在成为软件开发人员关心的问题。本文将向您介绍一种利用Delphi来实现程序窗体动态渐进效果的方法。

实现原理
Delphi的许多控件都有Canvas(画布)的属性,在Canvas上可以显示图形,可以实现对颜色的轻松控制。窗体Form也具有该属性。因此利用该特点可以灵活地通过数学运算控制窗体的背景及颜色,从而得到满意窗体背景。
本文实现的是一种通过窗体的Canvas属性来实现色彩的渐进效果,其实现原理是通过循环对颜色进行控制,接着通过SpinEdit控件来控制窗体的色彩变化。而在实现动态背景的渐进效果时,利用控件Timer对程序进行设置,每过设定的一段时间,触发一次Timer控件的OnTimer事件,利用它来实现窗体背景色彩的动态改变,颜色不断的变化,渐进效果也在不断的变化,而且可以调节它变化的速度快慢。

编程实现
首先构造程序的初始控件。在Delphi的可视化编程环境中,新建一个新的标准工程。在新建的窗体上添加一个Panel控件,一个TImage控件(在这个控件的picture属性中初始化一个具有渐进效果的图片,如图所示),三个Label控件,三个SpinEdit控件,以及三个Button控件,得到如图1所示的效果。(注此处插入图片,图片名称为picture1.jpg)

1、编写TForm1.FormPaint()事件,主要利用循环函数来实现窗体的渐进效果的初始化。这里主要是利用了两个函数:RGB()及FillRect()来实现对窗体的颜色的控制。首先根据程序的需要设置两个变量:WinRow和WinHeight,它们是Word类型的,也可以将它们设置为Integer类型的。在下面的代码中,需要用到两个窗体的常用常量:ClientWidth和ClientHeight。具体的代码如下:
procedure TForm1.FormPaint(Sender: TObject);
var
WinRow,WinHeight: Word ;
begin
WinHeight:= (ClientHeight + 255) div 256 ;//对变量WinHeight的值进行初始化
for WinRow := 0 to 255 do //循环从0~255
with Canvas do begin //将窗体的Canvas属性作为操作对象
Brush.Color := RGB(WinRow, ColorGreen,ColorBlue) ;
//设置当前窗体的画布颜色,ColorGreen,ColorBlue为全局的动态变量,可以在FormCreate()中对其进行初始化
FillRect(Rect(0,WinRow*WinHeight, ClientWidth,(WinRow+1)*WinHeight)); //用当前的画布颜色填充窗体
end ;
end;

2、设置TForm1.Timer1Timer()事件。其处理方法与Form1.Paint相似,所不同的是需要事先增加两个用于实现颜色微调的变量:Greens和Blues。它们同样是用来实现改变渐进效果的,同时因为OnTimer事件是定时进行的,需要对变量的范围进行控制,详见代码:
procedure TForm1.Timer1Timer(Sender: TObject);
var
WinRow,WinHeight: Word ;
begin
with form1 do //将当前的窗体作为操作对象
begin
WinHeight:= (ClientHeight + 255) div 256 ; //对变量进行初始化
for WinRow := 0 to 255 do验室 //循环从0~255
with Canvas do begin //对窗体的Canvas(画布)对象进行操作
Brush.Color := RGB(WinRow, Greens, Blues) ; //设置画布的颜色,其中变量Greens和Blues可以通过微调进行变化,从而实现颜色的微调控制
FillRect(Rect(0,WinRow*WinHeight, ClientWidth,(WinRow+1)*WinHeight)); //用当前设置的颜色填充设定的窗体区域,从而实现渐进的效果
end ;
end;
Greens:=Greens+2; //对颜色进行控制,在此也可以自己设定
if Greens>255 then Greens:=0;//对变量Greens进行范围控制
Blues:=Blues+5; //对颜色进行控制,在此也可以自己设定
if Blues>255 then Blues :=0; //对变量Blues进行范围控制
end;

3、处理TForm1.SpinEdit1Change()事件。这个事件是用于实现对颜色变化快慢进行控制的,可以通过得到SpinEdit1的值变化来实现。
timer1.Interval := SpinEdit1.Value ; //将SpinEdit1的Value的值赋给Timer1的Interval,间隔时间越长,变化越慢

4、设置SpinEdit2和SpinEdit3的OnChange()事件。在这个事件中,最重要的是程序中引用了两个用于实现颜色微调的全局变量Greens和Blues,根据它们值的变化,来实现窗体的渐进效果,其代码如下:
Greens:=SpinEdit2.Value ; //把SpinEdit2变化的值赋给Greens
Blues:=SpinEdit3.Value ; //把SpinEdit3变化的值赋给Blues
然后设置触发窗体的Paint()方法: form1.Paint ;

5、处理Button1和Button2的OnClick()事件。这两个事件一个是实现渐进效果的开始控制的,另一个是实现停止功能的,可以通过对Timer的Enabled属性来实现,代码如下:
当单击“开始”按钮时,“停止”按钮可用,“开始”按钮不可用,而Timer1控件为可用,如下代码:
timer1.Enabled :=true; //设Timer1控件为可用,动态渐进效果开始
button1.Enabled :=false; //“开始”按钮设为不可用
button2.Enabled :=true; //“停止”按钮设为可用
相应的,当单击“开始”按钮时,“开始”按钮可用,“停止”按钮不可用,而Timer1控件为不可用,具体的代码段如下:
timer1.Enabled :=false; //设Timer1控件为不可用,动态渐进效果停止
button1.Enabled :=true; //“开始”按钮设为可用
button2.Enabled :=false; //“停止”按钮设为不可用

6、窗体的初始化设计即TForm1.FormCreate()事件。初始化设计主要是初始化一些变量的值和一些按钮的起始状态,这个很简单,详见代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled := false; //初始化Timer1控件为不可用
timer1.Interval := SpinEdit1.Value ; //初始Timer1控件的触发间隔时间

SpinEdit2.MinValue := 0;
SpinEdit2.MaxValue := 255; //初始化SpinEdit2控件的最小值和最大值
SpinEdit3.MinValue := 0;
SpinEdit3.MaxValue := 255; //初始化SpinEdit3控件的最小值和最大值

ColorGreen := SpinEdit2.Value;
ColorBlue := SpinEdit3.Value;
Greens := ColorGreen;
Blues := ColorBlue; //对颜色变量进行初始化

Button1.Enabled :=true;
Button2.Enabled :=false; //初始化“开始”按钮为可用,“停止”按钮为不可用
End;

现在按F9运行一下这个程序,运行效果如图2所示(注:图片名称picture2.jpg),怎么样,效果还不错吧。

完善程序
上述程序实现了利用窗体的Canvas属性实现动态渐进效果的一些方法,为了更好的体现Delphi强大的图形功能,设计更美好的软件界面,可以对此程序进一步完善:
1、实现渐变图案
生活中不乏有很多美丽的图案和花纹,如床单地毯上的图案,它们的构成往往都有一定的规律。可以利用窗体的Canvas属性,通过设计一些数学表达式(例如三角函数),再结合使用循环语句,从而实现现实中许多美丽的渐变图案,说不定还会有意想不到的收获。
2、实现窗体的闪烁效果
有时我们会见到一个不断闪烁变幻的窗体,窗体上的文字及图标和窗体本身都在不停闪烁。那么要实现对文本和窗体的闪烁,可以通过FlashWindow()函数结合Timer控件来实现,在此就不多讲了。
以上程序在简体中文Windows 2000和delphi 6.0环境中调试通过。

写搞日期:2001-10-28
用Delphi实现窗体的渐进效果

用Delphi实现窗体的渐进效果
用Delphi实现窗体的渐进效果输入需要设置字体大小的文本