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

使用 GDI+ 创建玻璃按钮

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (208投票s)

2007年2月19日

CPL

2分钟阅读

viewsIcon

983010

downloadIcon

21210

如何仅使用 GDI+(而非 WPF)创建带动画效果的玻璃按钮。

屏幕截图

使用带有图像的标准玻璃按钮的示例应用程序。

Sample application using a standard glass button with image.

相同的应用程序,但这次它有一个自定义的玻璃按钮。

Sample application using a customized glass button.

托管四个玻璃按钮的 MFC 应用程序。

MFC application which hosts four glass buttons.

引言

我打赌你已经见过 Windows Vista 中的动画任务按钮了。我见过。我一直在想如何创建一个类似的控件。幸运的是,我找到了一个网页,其中介绍了如何使用 Microsoft Expression Blend (创建玻璃按钮:完整教程) 来做到这一点。使用 Microsoft Expression Blend 创建的玻璃按钮(以及整个应用程序)需要 .NET Framework 3.0 才能运行。由于有些人现在还不能或不想使用 .NET Framework 3.0,我决定使用 GDI+ 重写那个很酷的控件,以便它能够与 .NET Framework 2.0 一起工作。

将 XAML “转换”为 C# (GDI+)

上面提到的网页上的教程很容易完成,生成的 XAML 代码非常易于理解,因此在“转换”过程中没有遇到大的问题。

例如,我翻译了以下代码

<Border HorizontalAlignment="Stretch" 
        Margin="0,0,0,0" x:Name="shine" 
        Width="Auto" CornerRadius="4,4,0,0">

  <Border.Background>
    <LinearGradientBrush EndPoint="0.494,0.889" 
                         StartPoint="0.494,0.028">
      <GradientStop Color="#99FFFFFF" Offset="0" />

      <GradientStop Color="#33FFFFFF" Offset="1" />
    </LinearGradientBrush>
  </Border.Background>

</Border>

into

using (GraphicsPath bh = CreateTopRoundRectangle(rect2, 4))
{
  int opacity = 0x99;
  if (isPressed) opacity = (int)(.4f * opacity + .5f);
  using (Brush br = new LinearGradientBrush(rect2, 
                          Color.FromArgb(opacity, shineColor),
                          Color.FromArgb(opacity / 3, shineColor),
                          LinearGradientMode.Vertical))
  {
    g.FillPath(br, bh);
  }
}

(这只是 DrawButtonBackground 方法的一部分。)

即使是悬停按钮的动画也通过使用 Timer 类轻松实现。不幸的是,当玻璃按钮相当大时,动画不是很流畅。

如何使用 GlassButton 类?

GlassButton 类继承自 Button 类,因此可以使用相同的方式进行使用。现在也支持在玻璃按钮上显示图像。甚至在 Visual Studio 的窗体设计器中,指南线也能正常工作。

历史

  • 1.3.2 (2008.11.02) — 重要! 这是该控件最后一个“独立”版本。下一个版本将包含在一个托管在 CodePlex 的新项目中。
    • 修复了在某些情况下导致按钮图像被释放的错误
  • 1.3.1 (27.10.2008)
    • 源代码现在同时提供 C# 和 VB.NET 版本
    • 修复了次要 bug
  • 1.3 (19.11.2007)
    • 当按钮禁用时,图像会变灰
    • 添加了属性 'FadeOnFocus'
    • 提高了性能
    • 修复了次要 bug
  • 1.2 (31.03.2007)
    • “禁用”外观与“启用”外观不同
    • 添加了一些 'PropertyChange' 事件
    • 提高了性能
    • 将源代码与编译好的库和演示应用程序分开
    • 添加了 MFC 演示应用程序
    • 添加了工具箱位图
    • 修复了次要 bug
  • 1.1.1 (22.02.2007)
    • 修复了次要 bug
  • 1.1 (21.02.2007)
    • 添加了图像支持
  • 1.0 (19.02.2007)
    • 第一版
© . All rights reserved.