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

渐变枚举器

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.57/5 (5投票s)

2005 年 8 月 31 日

2分钟阅读

viewsIcon

24993

downloadIcon

332

梯度枚举器是一个简单的实用工具,用于显示两种颜色组合后产生的梯度效果。

Sample Image - gradient_enumerator.jpg

引言

梯度枚举器是一个简单的实用工具,用于显示两种颜色组合后产生的梯度效果。

代码使用 C# 编写。

我最初编写梯度枚举器是为了辅助选择一个大型应用程序的梯度组合。 事实证明它非常有用,因此我分享它,希望其他人也会觉得它有用。

此版本的实用程序适用于 Microsoft 所谓的“系统定义”颜色。 就
代码而言,这些是 System.Drawing 命名空间的 Color 结构中的预定义颜色。

代码

该应用程序由单个 Windows 窗体组成。

这些控件由一组标准单选按钮组成,允许用户更改梯度流的方向、两个完全不必要的按钮来显示关于框并退出应用程序,以及两个组合框,允许用户选择梯度的两种颜色。

梯度本身绘制为窗体的背景,因此,为了使控件与“画布”分离,它们位于面板的顶部,面板绘制自己的默认背景。

初始化时,该实用程序会使用可用颜色的名称填充组合框。

    
private void PopulateColors()
{
    _firstColorCombo.Items.Add(Color.AliceBlue.Name);
    _firstColorCombo.Items.Add(Color.AntiqueWhite.Name);
    _firstColorCombo.Items.Add(Color.Aqua.Name);

    ...

    _firstColorCombo.Items.Add(Color.Yellow.Name);
    _firstColorCombo.Items.Add(Color.YellowGreen.Name);

    foreach ( object color in _firstColorCombo.Items )
    {
        _secondColorCombo.Items.Add(color);
    }

    ...
}

有很多颜色,但由于它们未定义为“enum”,因此不容易通过循环迭代定义的数值,或者将它们全部抓取为一组。 可能有更优雅的方法来做到这一点,但由于它的构建更像是一个抛弃型应用程序,因此颜色是手动添加的。

唯一其他值得关注的代码是执行梯度绘制的方法。 为此,我们重写 OnPaintBackground(...) 方法。

protected override void OnPaintBackground(PaintEventArgs pevent)
{
    Graphics graphics = pevent.Graphics;

    graphics.SmoothingMode = SmoothingMode.AntiAlias;

    Rectangle rectangle = ClientRectangle;

    LinearGradientMode lgm = GetLinearGradientMode();

    Color firstColor, secondColor;

    GetChosenColors(out firstColor, out secondColor);

    LinearGradientBrush brush = new LinearGradientBrush(
        rectangle, firstColor, secondColor, lgm);

    graphics.FillRectangle(brush, rectangle);
}

代码非常简单。 创建一个 LinearGradientBrush 以填充窗体的客户区域(由 ClientRectangle 属性给出),颜色由组合框提供,LinearGradientMode 由单选按钮提供。

返回用户选择的 LinearGradientMode 和颜色的代码也很简单。 这是两个方法

private LinearGradientMode GetLinearGradientMode()
{
    if ( _radVertical.Checked ) return LinearGradientMode.Vertical;
    else if ( _radHorizontal.Checked ) return LinearGradientMode.Horizontal;
    else if ( _radForwardDiagonal.Checked ) return LinearGradientMode.ForwardDiagonal;
    else if ( _radBackwardDiagonal.Checked ) return LinearGradientMode.BackwardDiagonal;
    else return LinearGradientMode.Vertical;
}

private void GetChosenColors(out Color firstColor, out Color secondColor)
{
    firstColor = Color.FromName((string)_firstColorCombo.SelectedItem);
    secondColor = Color.FromName((string)_secondColorCombo.SelectedItem);
}

Color 结构返回给定名称的颜色的能力使我们的工作非常容易。

唯一其他执行任何操作的代码是事件处理程序。 每次用户在颜色组合框中选择一个新项目,或者通过单击单选按钮选择不同的 LinearGradientMode 时,都会强制窗体通过调用 Invalidate() 重新绘制。

可以通过提供从颜色选择器或任意 RGB 值选择的颜色渲染梯度的功能来扩展该实用程序。

就这样了...

尽情享用!

- Andrey Butov
- andreybutov@antair.com
- http://www.antair.com/andrey
© . All rights reserved.