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

渐变窗体 - 简单方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.30/5 (44投票s)

2005年8月24日

4分钟阅读

viewsIcon

149282

downloadIcon

3039

本文向您展示如何轻松地在窗体中将渐变实现为背景。

引言

我注意到很多程序员都不关心软件的外观。主要是因为他们认为这太难或花费的时间太长。在 .NET 中,您可以做一些事情,以最小的努力使您的应用程序看起来更好。其中之一就是在窗体上设置渐变背景。有时,即使是淡淡的渐变也足以使您的产品在人群中脱颖而出。

我在 CodeProject 中查找,看到 Erdal Halici 已经发表了一篇关于 GradientForms 的文章,网址为 https://codeproject.org.cn/csharp/MdiClientRevisited.asp。我发现他的方法对于这样一个简单的任务来说相当复杂和冗长。这就是我写这篇文章的原因。本文将向您展示如何以一种非常简单的方式做到这一点,使用一个您可以在应用程序中使用的小型基类。我保证您唯一需要做的就是设置颜色。这不难,对吧? :)

女士们先生们,启动你们的 Visual Studio!

好、坏和渐变

有些人会花时间为他们的应用程序寻找合适的颜色。他们寻找一致的背景,使他们的产品脱颖而出并具有可识别性。我赞赏这一点,但为什么不更进一步选择两种颜色呢?

有些人甚至懒得寻找颜色。该应用程序只是使用您在许多应用程序中看到的那个令人讨厌的灰色背景色。你应该为你自己感到羞愧!

渐变

然后有些人会在他们的背景中应用渐变。除了选择颜色之外,它不需要任何额外的努力,而且您的应用程序具有额外的视觉效果,并且猜猜怎么着:用户喜欢这些视觉效果。

制作 BaseGradientForm

首先

BaseGradientForm 只是一个具有一些预定义属性和方法的普通窗体。您以通常创建窗体的方式创建它。我们唯一要做的就是添加一些属性等等。

我们需要三个属性才能实现它

  • Color1:第一个渐变颜色。
  • Color2:第二个渐变颜色。
  • ColorAngle:渐变的角度。

这些没有做任何特别的事情。这些是像任何其他属性一样的普通属性。只有一个区别:当我们设置一个值(从代码中,或者在我们派生窗体的设计窗口中)时,我们需要窗体重新绘制自身。为了实现这一点,我们需要调用一个方法来告诉我们的窗体(或控件,当在控件上使用时)重新绘制自身。用于此目的的方法是 Invalidate。我们需要在更改这三个属性中的任何一个属性时,以及因此设置时,重新绘制窗体自身。所以,我们添加该行来设置所有三个属性。

private Color _Color1 = Color.Gainsboro;
private Color _Color2 = Color.White;
private float _ColorAngle = 30f;

public Color Color1
{
  get { return _Color1; }
  set 
  { 
    _Color1 = value; 
    this.Invalidate(); // Tell the Form to repaint itself
  }
}

public Color Color2
{
  get { return _Color2; }
  set 
  { 
    _Color2 = value; 
    this.Invalidate(); // Tell the Form to repaint itself
  }
}

public float ColorAngle
{
  get { return _ColorAngle; }
  set 
  { 
    _ColorAngle = value; 
    this.Invalidate(); // Tell the Form to repaint itself
  }
}

绘制我们的毕加索

每当窗体收到重绘的调用时,无论是来自我们的 Invalidate 还是来自操作系统,它都会触发两个事件:PaintPaintBackground。实际上,您将代码放在这两个事件中的哪一个中都没有关系,但在这里我们将覆盖 PaintBackground 来做我们的事情。在此方法中,我们在窗体上绘制一个矩形。此矩形将具有与我们的窗体相同的尺寸。这样它将覆盖整个窗体并将充当背景。

protected override void OnPaintBackground(PaintEventArgs pevent)
{
  // Getting the graphics object
  Graphics g = pevent.Graphics;

  // Creating the rectangle for the gradient
  Rectangle rBackground = new Rectangle(0, 0, 
                            this.Width, this.Height);

  // Creating the lineargradient
  System.Drawing.Drawing2D.LinearGradientBrush bBackground 
      = new System.Drawing.Drawing2D.LinearGradientBrush(rBackground, 
                                        _Color1, _Color2, _ColorAngle);

  // Draw the gradient onto the form
  g.FillRectangle(bBackground, rBackground);

  // Disposing of the resources held by the brush
  bBackground.Dispose();
}

Bug?

当您测试我们编写的代码时,您会注意到当您开始调整窗体大小时会发生奇怪的事情。这不是因为小动物接管了您的系统,而是因为窗体在调整大小时没有收到“重绘自己事件”。我们真的必须自己做一切,不是吗?幸运的是,我们不需要做覆盖 Resize 事件的艰巨任务,而只需在 BaseFormGradient 的构造函数中添加一行,告诉窗体在调整大小时重绘。

this.SetStyle( ControlStyles.ResizeRedraw, true );

使用代码

BaseForm

您知道当您编写一个应用程序,从而创建一个窗体时,您总是创建一个 baseform 吗?您是这样做的,对吧?在将BaseFormGradient.cs添加到您的项目后,只需让该 baseform 继承自 'BaseFormGradient',瞧!您的窗体就具有了渐变功能!

没有 BaseForm?

不用担心(开心吗?),即使您没有 baseform,您仍然可以拥有渐变功能。在将BaseFormGradient.cs添加到您的项目后,只需让您的窗体继承自 'BaseFormGradient'。

应用渐变

您需要做的就是设置渐变的颜色和角度。是的,我是认真的,就是这样!

© . All rights reserved.