多标签颜色选择器






4.60/5 (20投票s)
另一个用 C# 编写的颜色选择器控件。
引言
目的是创建一个控件,模拟 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 日。