65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 和 C# 实现窗体淡入

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.09/5 (20投票s)

2005年4月10日

CPOL

4分钟阅读

viewsIcon

88826

downloadIcon

4533

介绍如何创建在加载时淡入的窗体。

引言

您是否曾经想让您的应用程序更“酷”?您喜欢 Windows XP 的淡入效果吗?您想在您的应用程序中加入这种效果吗?如果这些问题的答案都是肯定的,那么您来对地方了。

最近,我想为我的应用程序添加淡入功能,并在网上搜索了相关信息。然而,我找到的唯一信息是用 VB.NET 编写的,而我的项目是用 C# 编写的。因此,我决定编写一些代码,让我的整个应用程序都能启用“淡入”功能。

我的想法是只编写一次代码,然后将其应用到我的所有应用程序中。

解决方案

解决方案似乎非常简单:.NET Framework 提供的 Windows Form 类有一个名为 Opacity 的属性。令人惊讶的是,这个属性控制着窗体的不透明度(1 为完全不透明,0 为完全透明)。

所以,我想到在显示窗体时将这个属性从 0 变化到 1,这样我的窗口就会淡入。

第一次尝试

第一次尝试是将我的代码插入到 InitializeComponent() 方法中,并使用 Thread 对象在值变化之间暂停,以创建淡入效果。

执行此操作的代码如下:

this.Opacity = 0;
this.Show();
for (float f=0.0F;f<1F;f=f+0.05F)
{
    this.Opacity = f;
    Thread.Sleep(20);
}
this.Opacity = 1;

这段代码实际上是有效的,但有一个小问题。当线程等待 20 毫秒时,它会处于阻塞状态,无法渲染其他任何东西。因此,窗体上的控件在循环结束之前不会被渲染。这会导致控件显示为黑色块,这是不可接受的。不过,如果您想要淡入的窗体上没有任何控件,可以尝试这种方法。

第二次尝试

这实际上是一次成功的尝试,因为我让一切都按照我想要的方式工作。这次尝试的想法是:不要阻塞当前线程来淡入,而是使用一个计时器,每 20 毫秒触发一次。每次计时器触发时,我都会将窗体的透明度增加一点,当达到 1 时,我将禁用计时器。

每次计时器触发时执行的代码如下:

this.Opacity += 0.05;
if (this.Opacity >=.95)
{
    this.Opacity = 1;
    tmrFade.Enabled = false;
}

计时器在窗体构造函数中along with calling the Show() method of the form, like this (中文:窗体构造函数与调用窗体的 Show() 方法一起触发,如下所示:)

this.Opacity = 0;
this.Show();
tmrFade.Enabled = true;

作为副作用,我可以告诉你,在创建窗体实例时,不必调用 Show() 方法。只需创建实例,窗体就会淡入。

因此,问题几乎解决了。我找到了一种“暂停”淡入的方法,而且通过这种方式,我不会阻止其他控件的渲染。

现在我只需要找到一种方法,不必为我的每个窗体都添加这段代码和计时器。

第二次尝试完成

正如我所说,通过使用计时器并在构造函数中添加几行代码,我可以让一个窗体漂亮地淡入。为了让我的所有窗体都能漂亮地淡入,我使用了继承。

什么是继承?继承意味着,如果您有一个类 A 包含两个方法,并且您从类 A 继承了一个类 B,那么您将能够在类 B 中访问类 A 的方法。如果类 A 是从类 C 继承的,那么在类 B 中,我可以访问类 A 和类 C 的方法。

嗯,我在我的应用程序中也是这样做的:我创建了一个名为 BaseForm 的窗体,它派生自 System.Windows.Forms.Form。所有窗体都应该派生自这个类。在 BaseForm 中,我添加了一个计时器,并按照之前展示的方式进行了编码。

所以,我让 BaseForm 实现了淡入。我需要做的就是让其他窗体实现淡入,只需从 BaseForm 派生即可。

这个方法效果很好,我让我的所有窗体都实现了淡入。然而,当我向一个窗体添加控件时,淡入效果停止工作了。解决这个问题的方法是,在派生窗体的每个构造函数中手动启用计时器,如下所示:

tmrFade.Enabled= true;

我猜,似乎 Visual Studio .NET 2003 在为设计器生成代码时,与派生成员的兼容性不太好。不过,我可能错了。

结论

总之,我想请您对这篇文章提出宝贵的意见。

祝您编码愉快!

© . All rights reserved.