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

多标签颜色选择器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (20投票s)

2006年1月6日

Zlib

2分钟阅读

viewsIcon

80825

downloadIcon

1906

另一个用 C# 编写的颜色选择器控件。

Sample Image

引言

目的是创建一个控件,模拟 Visual Studio 中的颜色选择器。它由三个标签组成,允许用户选择预定义的、命名的或系统颜色,或者混合他/她自己的自定义颜色。

背景

该控件派生自 TabControl。它包含三个选项卡页面

  • 命名 页面,具有自定义绘制的包含命名颜色的列表框,
  • 系统 页面,具有自定义绘制的包含系统颜色的列表框,以及
  • 自定义 选项卡,其中包含一个用户控件,允许用户使用自定义 alpha、红色、绿色和蓝色分量定义颜色。

当用户选择颜色时,将触发 ColorSelected 事件。ColorSelectedEventArgs 对象包含所选颜色。

自定义颜色控件是一个用户控件,包含每个分量的轨迹栏和一个预览框。由于可以设置非均匀背景并部分地用所选颜色绘制该框,因此用户可以清楚地观察到颜色透明度效果。

使用代码

通过将相应的 MultiTabColorPicker.dll 添加到引用列表中,并将 System.Windows.Forms.ColorPicker 命名空间(控件已在其中定义)包含在内,该控件可以轻松嵌入到对话框中。为了检测颜色选择更改,用户只需附加到 ColorSelected 事件即可。此事件在控件的属性网格的事件中是可见的(并设置为默认值)。ColorSelected 事件和相应的 ColorSelectedEventArgs 的定义如下

public class ColorSelectedEventArgs : System.EventArgs { 
  public ColorSelectedEventArgs(Color colorSelected) {
    ColorSelected = colorSelected;
  }

  public readonly Color ColorSelected; 
}

public delegate void ColorSelectedEventHandler(object sender, 
                     ColorSelectedEventArgs e);

因此,在客户端,只需要从 ColorSelectedEventArgs 获取 ColorSelected 字段

m_colorPicker.ColorSelected += 
           new ColorSelectedEventHandler(this.ColorSelected);
// ...
private void ColorSelected(object sender, ColorSelectedEventArgs e) {
  m_labelSample.ForeColor = e.ColorSelected; 
}

该控件还公开了一些额外的属性

  • CustomColorSampleBackground 定义了自定义颜色预览控件的背景的绘制方式。可以将其设置为几个预定义的值之一:Uniform, ShadesOfControl, GradientGray, 和 GradientColor;
  • CustomColorSamplePosition 定义了框的哪个部分用所选的自定义颜色绘制。可以设置为 Entire, Top, Middle, 或 Bottom.
  • NameColorsSortOrder 定义了命名颜色列表中颜色的排序顺序:HSB, Alphabetical, 或 None.

关注点

最具挑战性的部分是以与 Visual Studio 中完全相同的顺序获取颜色列表。所有颜色的列表都是通过反射创建的

Type color =(typeof(Color)); 
PropertyInfo[] propertyInfos = 
        color.GetProperties(BindingFlags.Public | BindingFlags.Static); 
ArrayList colors = new ArrayList(); 
foreach (PropertyInfo pi in propertyInfos) { 
  if (pi.PropertyType.Equals(typeof(Color))) { 
     Color c = (Color)pi.GetValue(color, null); 
     colors.Add(c); 
  } 
}

然后使用 HSB_ColorComparer 类对列表进行排序

internal class HSB_ColorComparer : IComparer { 
  public int Compare(Color c1, Color c2) { 
    int alphaDiff = c1.A - c2.A; 
    float hueDiff = c1.GetHue() - c2.GetHue(); 
    float saturationDiff = c1.GetSaturation() - c2.GetSaturation(); 
    float brightnessDiff = c1.GetBrightness() - c2.GetBrightness(); 
    return (int)(((alphaDiff * 360 + hueDiff + 
                   saturationDiff) * 255 + brightnessDiff) * 255); 
  }
  
  int IComparer.Compare(object obj1, object obj2) { 
    return Compare((Color)obj1, (Color)obj2); 
  }
}

这种排序产生一个与 Visual Studio 中的列表几乎相同的列表,除了三个项目被放错位置。此外,提供了一个 NameColorComparer 类,用于按名称字母顺序对颜色进行排序。

演示项目还展示了如何将控件嵌入到非模态窗体中,该窗体充当弹出窗口。当它失去焦点时,或者当用户选择颜色或按下 ESC 按钮时,此弹出窗口将自动关闭(实际上是隐藏的)。

历史

  • Ver. 1.0 - 初始版本,提交于 2006 年 1 月 2 日。
© . All rights reserved.