zoukankan      html  css  js  c++  java
  • 一个简单的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

  • 相关阅读:
    运算符优先级(图表)
    VNC+SSH相关应用
    VNC常用操作及常见问题解决办法汇总
    操作系统(二): 进程与线程
    Java实现 蓝桥杯 算法提高 01背包
    Java实现 蓝桥杯 算法提高 01背包
    Java实现 蓝桥杯 算法提高 01背包
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
  • 原文地址:https://www.cnblogs.com/Dincat/p/13456173.html
Copyright © 2011-2022 走看看