一个简单的AquaButton

介绍 这篇文章的主要目的是向你展示如何使用一些GDI+方法来创建aqua按钮。我想分享这段代码的原因是,我在google上搜索了一段解释如何创建aqua按钮的文章,而我发现的所有文章都是基于对已存在的位图的操作,而不是按钮的动态创建。 关于代码 这里给出的代码基本上是一个名为AquaButton的类。这个类相当简单,我相信可以做很多事情来使它更加健壮。请记住,本文的主要目的是与我用来创建aqua按钮所需的特殊效果的GDI+方法有关。 AquaButton代码 在盯着几个aqua按钮看了很长一段时间后,我发现它们是由三种东西组成的:从按钮的主色到白色的线性颜色变化,阴影和气泡效果。所有这些可以很容易地实现与LinearGradientBrush等类创建按钮颜色的渐变光白,PathGradientBrush创建阴影效果,然后创建泡沫,这是一个玩一个泡沫的透明度问题上的按钮。 按钮的主要颜色 要创建按钮的主颜色,我们可以使用如下代码所示的LinearGradientBrush:复制Code

Rectangle rc = new Rectangle(btnOffset,btnOffset, 
          this.ClientSize.Width-8-btnOffset, 
          this.ClientSize.Height-8-btnOffset);
GraphicsPath path1 = this.GetPath(rc, 20);
LinearGradientBrush br1 = new LinearGradientBrush(new Point(0, 0), 
          new Point(0, rc.Height+2), clr, Color.White);

让我们仔细看看第三行代码。这条线创建了一个线性梯度,由背景色指定,朝着白色。注意我指定了这个形状(rc)外面的第二个点。高度+ 2).这样做的原因是为了防止颜色变成完全的白色。下面是创建的图像示例: 按钮的影子 阴影可以使用PathGradientBrush创建,它与按钮具有相同的形状,但稍微偏移角度。隐藏,复制Code

Rectangle rc2 = rc;
rc2.Offset(shadowOffset, shadowOffset);
GraphicsPath path2 = this.GetPath(rc2, 20);
PathGradientBrush br2 = new PathGradientBrush(path2);
br2.CenterColor = ControlPaint.DarkDark(Color.Silver);
br2.SurroundColors = new Color[]{Color.White};

PathGradientBrush在这种情况下很有用,因为它帮助创建了一个从暗银色到白色的周围渐变。下面是创建的图像示例: 注意,在这个例子中,窗体的背景是白色的,所以朝着白色的渐变非常适合。如果使用这个示例代码,最好先找出父元素的背景色,然后创建一个渐变,从父元素的暗色调开始,渐变到父元素的相同颜色。 泡沫的效果 要创建气泡效果,你也可以使用LinearGradientPath;然而,这一次,我们不是操纵颜色梯度,而是操纵透明度梯度。我所说的透明度是什么意思?透明度是在使用color . fromargb()方法创建颜色时可以指定的Alpha参数。这个方法的参数之一是Alpha参数。当这个参数被设置为255时,它意味着颜色是纯色而不是透明的。当你降低这个参数时,创建的颜色会变得越来越透明。让我们看一看代码,看看如何使用这种效果:Hide  复制Code

Rectangle rc3 = rc;
rc3.Inflate(-5, -5);
rc3.Height = 15;
GraphicsPath path3 = GetPath(rc3, 20);
LinearGradientBrush br3 = 
  new LinearGradientBrush(rc3, Color.FromArgb(255, Color.White), 
  Color.FromArgb(0, Color.White), LinearGradientMode.Vertical);

第五行创建了一个线性梯度从白色:颜色。从255(颜色。白色)到透明:颜色。Color.White FromArgb(0)。注意Alpha参数被设置为从255(纯色)到0(完全透明)。 文本概述 最后,按钮显示不同类型的字体。在本例中,我使用文本的大纲为按钮创建不同的文本样式。使用GraphicsPath创建大纲。这个类自动创建显示字符串大纲所需的点数组。当您希望创建外观更好的字符串时,这个类非常有用。你可以用任何笔刷填充路径的内部,也可以像上面描述的那样给按钮添加阴影效果。下面是创建大纲文本最有用的线条:复制Code

GraphicsPath path4 = new GraphicsPath();
path4.AddString(this.Text, this.Font.FontFamily, 
               (int)this.Font.Style, this.Font.Size, 
               rcText, strformat);

Pen txtPen = new Pen(this.ForeColor, 1);
g.DrawPath(txtPen, path4);

一旦你创建了路径(如上所示为path4.AddString),你可以用DrawPath画出路径的轮廓,也可以用任何类型的笔刷填充路径的内部,给你的文本添加一些额外的特殊效果。例如,你可以使用纹理笔刷,有多种颜色的渐变笔刷等等。 脉冲效应 ByteGhost提醒我的一个优点是如何为aqua按钮添加脉冲效果。我也看了Dave Peckham的文章,以获得一个脉冲如何工作的好主意。基本上,它是一个平滑的亮度上下变化。亮度可以控制在一个位图与伽马参数的图像属性。因此,要实现这个特性,我们只需要将按钮存储在一个位图对象中,如下所示:复制Code

buttonBitmapRectangle = new Rectangle(rc.Location, rc.Size);
buttonBitmap = new Bitmap(buttonBitmapRectangle.Width, 
                   buttonBitmapRectangle.Height);
Graphics g_bmp = Graphics.FromImage(buttonBitmap);
g_bmp.SmoothingMode = SmoothingMode.AntiAlias;
g_bmp.FillPath(br1, path1);         //draw the main shape
g_bmp.FillPath(br3, path3);         //draw the bubble
g_bmp.DrawPath(txtPen, path4); //draw the text

在上面的代码中需要注意的是,我没有存储阴影,所以只有按钮有脉冲效果。 一旦位图被存储,我们就可以随意操作它,而不需要调用Invalidate方法来调用OnPaint。下面是负责调整图像亮度的代码:复制Code

private void pulseTimer_Tick(object sender, EventArgs e)
{
 if (this.Focused && pulseOnFocus && buttonBitmap != null)
 {
  gamma += gammaStep;
  if (gamma > this.maxGamma) gammaStep = - gammaStep;
  if (gamma < this.minGamma) gammaStep = Math.Abs(gammaStep);

  imgAttr.SetGamma(gamma);
  this.CreateGraphics().DrawImage(buttonBitmap, 
       buttonBitmapRectangle, 0, 0, buttonBitmap.Width, 
       buttonBitmap.Height, GraphicsUnit.Pixel, imgAttr);
 }
}

我之前没有提到的是,当鼠标悬停在按钮上时,这个类会处理颜色变化。当颜色改变时,位图也会改变,所以即使是悬停颜色,脉冲动作也会继续! 要查看脉冲的实际作用,请在启动演示后按Tab按钮。选项卡将带你到第一个按钮,它启用了脉冲。第一列上的所有按钮都启用了pulse功能。 结论 在本文中,我向您展示了一些具有强大视觉效果的非常简单的方法。我在这里展示的AquaButton类并不是真的那么健壮,需要做很多工作。我只是想分享我的发现如何创建aqua效果,我希望它可以帮助你自定义你的控件。让我澄清一下,我经常会学到一些我在CP中找不到的新东西,我总是说,“能分享这些东西太酷了”;然而,当我创建一个完全健壮的库时,我通常没有时间写这篇文章。下面是“原样”代码,希望它能给你一些新的想法。 历史 28/11/2005 -首次发布。 29/11/2005 -增加脉冲按钮的能力。 本文转载于:http://www.diyabc.com/frontweb/news920.html

原文地址:https://www.cnblogs.com/Dincat/p/13456173.html