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

.NET 颜色选择器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (19投票s)

2001年10月23日

CPOL

7分钟阅读

viewsIcon

271876

downloadIcon

8652

一个包含三个用 C# 编写的颜色选择器控件的控件库

引言

几年来我一直使用 Chris Maunder 出色的 CColourPicker MFC 控件,我认为用 C# 编写一个类似的控件将是一个有用的 .NET 学习练习。  我并没有完全复制它,最终得到了三个控件而不是一个。  

到目前为止,我对结果相当满意,不得不说,与 MFC/C++ 相比,使用 .NET/C# 编程是一种享受。  如果我有时间,我会继续为颜色选择器控件添加功能。  请告诉我您可能有的任何功能请求,我将在将来尝试将它们包含在内。

控件库代码演示了

  1. 创建 .NET 控件
  2. .NET 控件继承
  3. 自定义事件
  4. 设计时属性
  5. 一些 GDI+
  6. 使用 X Marks The DOT,一个可扩展的文档生成器,将 XML 文档编译成类似 Platform SDK 的帮助文件。

创建控件

本节列出了一些我在创建控件时发现的有趣内容。

属性和特性

.NET 语言的一项非常实用的功能是能够将元数据添加到代码的各个位置。  对于控件来说,一个有趣的添加元数据的位置是控件的属性上。
 
例如,这里是 ColorPanel 控件中的几个属性:

[Browsable(true)]
[Category("ColorPanel")]
[DefaultValue(defaultColorSet)]
[Description("Get/set the palette of colors to be displayed.")]
public PJLControls.ColorSet ColorSet
{
    get { ... }
    set { ... }
}[Browsable(true)]
[Category("ColorPanel")]
[Description("Get/set the pick color.")]
public System.Drawing.Color Color
{
    get { ... }
    set { ... }
}

public void ResetColor()
{
   Color = defaultColor;
}

public bool ShouldSerializeColor()
{
   return Color != defaultColor 
}

这里值得关注的项目是属性和 ResetColor/ShouldSerializeColor 方法。

如果您为属性添加 [Browsable(true)] 特性,那么当您在 Forms 设计器中选择控件的实例时,该属性将显示在 VS.NET 的属性窗口中。  您还可以使用 [Category("your category")] 特性为属性分配类别。  如果您不提供类别属性,则该属性将出现在“Miscellaneous”(杂项)类别中。

如果您现在添加 [Description("description here")] 特性,那么属性窗口将在选择属性时显示描述,如下图所示。

最后一个有趣的属性是 [DefaultValue()]。  提供此属性有两个后果。  第一个是,如果您在属性窗口中右键单击该属性,您将看到一个小的弹出菜单,其中“Reset”(重置)项已启用。  如果您选择 Reset,该属性将重置为您在默认值中提供的值。  另一个后果是,Forms 设计器现在知道它是否需要添加代码来更改属性值(即序列化属性值)。

例如,这是 Forms 设计器为演示中的 ColorPanel 生成的初始化代码:

private void InitializeComponent()
{
   ...

   this.colorPanel.ColorSortOrder = PJLControls.ColorSortOrder.Brightness;
   this.colorPanel.CustomColors = new System.Drawing.Color[]
   {
      System.Drawing.Color.FromArgb(((System.Byte)(255)), ((System.Byte)(192)), 
                                    ((System.Byte)(192))),
      System.Drawing.Color.FromArgb(((System.Byte)(255)), ((System.Byte)(128)), 
                                    ((System.Byte)(128))),
      System.Drawing.Color.Red,
      ...
   }

   ...
}

粗体显示的属性是 Forms 设计器知道没有默认值的属性,因此它会初始化这些属性,而不会初始化其他属性。

但是, DefaultValue 属性构造函数似乎只接受简单类型,所以如果您有一个复杂类型,则需要实现两个方法 - ResetPropertyName ShouldSerializePropertyName。   这两个方法都相对容易理解,上面有一个例子。  Forms 设计器识别这些方法,这些方法会产生与 DefaultValue 属性相同的影响。

IsInputKey

当您想接收键盘事件时,只需挂接 OnKeyDown 事件的处理程序或重写 OnKeyDown 虚拟方法。

但是,默认情况下,某些您可能感兴趣的键,例如 TAB、箭头键等,不会发送给您,它们会被发送到托管控件的窗体以进行对话框导航。  如果您想在 OnKeyDown 中看到它们,请重写 IsInputKey 并为要查看的键码返回 true。  这是一个例子。

protected override bool IsInputKey( System.Windows.Forms.Keys keyData )
{
   bool bIsInputKey = true;

   switch( keyData )
   {
      case Keys.Left:
         break;
      case Keys.Right:
         break;
      case Keys.Down:
         break;
      case Keys.Up:
         break;
      default:
         bIsInputKey = base.IsInputKey(keyData);
         break;
   }

   return bIsInputKey;
}

控制方式

ColorPicker

 

描述

ColorPicker 模拟了 ComboBox 风格的用户界面,但会下拉一个颜色面板(好吧,我知道,这之前已经做过了)。  下拉面板是托管在模态窗体中的 ColorPanel 控件的实例。  该控件完全支持鼠标和键盘导航。

键盘导航

使用 Tab 键切换到控件,然后使用向下箭头下拉颜色面板。  然后您可以使用箭头键进行导航,使用 Enter 键选择颜色,或使用 Escape 键取消。  我刚刚注意到一个问题是,您无法通过 Tab 键离开下拉的颜色面板。

属性

ColorPicker 支持以下属性,除了 BorderStyle 之外,所有这些属性都可以在 Visual Studio 属性浏览器中“ColorPicker”类别下找到。  BorderStyle 在“Appearance”(外观)类别中。

属性名 类型 描述
_Text 字符串 与 Text 属性相同 - 我无法使“Text”属性正常工作。 
AutoSize(自动调整大小) 布尔值 如果设置为 true,则控件的高度是固定的。
BorderStyle System.Windows.Forms.BorderStyle 设置/获取控件的边框样式。
Color System.Drawing.Color 设置/获取选取的颜色。
ColorSet PJLControls.ColorSet 选择使用哪个颜色面板。
ColorSortOrder PJLControls.ColorSortOrder 选择颜色面板的排序顺序。
ColorWellSize System.Drawing.Size 设置/获取颜色面板中颜色的尺寸。
Columns int

如果设置为 0,则下拉面板的宽度与选择器相同。 
如果 > 0,则下拉面板有这么多列。

CustomColors System.Drawing.Color[] 用户可以提供一个颜色数组来显示。  当 ColorSet 属性设置为 ColorSet.Custom 时显示自定义颜色数组。
DisplayColor bool 指示是否在选择器组合框中显示选取的颜色。
DisplayColorName bool 指示是否在组合框中显示选取的颜色名称。  如果为 false,则显示 _Text 属性的值。
PanelBorderStyle System.Windows.Forms.BorderStyle 设置/获取下拉面板的边框样式。

事件

支持 ColorChanged 事件,该事件在用户选择新颜色时触发。

ColorPanel

描述

此控件显示一个颜色网格,用作 ColorPicker 控件的下拉列表。  显示的颜色要么来自 System.Drawing.Colors 枚举,要么由用户使用 CustomColors 属性提供。

属性

ColorPanel 支持以下属性,除了 BorderStyle 之外,所有这些属性都可以在 Visual Studio 属性浏览器中“ColorPanel”类别下找到。  BorderStyle 在“Appearance”(外观)类别中。

属性名 类型 描述
BorderStyle System.Windows.Forms.BorderStyle 设置/获取控件的边框样式。
Color System.Drawing.Color 设置/获取选取的颜色。
ColorSet PJLControls.ColorSet 选择使用哪个颜色面板。
ColorSortOrder PJLControls.ColorSortOrder 选择颜色面板的排序顺序。
ColorWellSize System.Drawing.Size 设置/获取颜色面板中颜色的尺寸。
Columns int

如果设置为 0,则面板可以调整大小。
如果 > 0,则面板有这么多列。

CustomColors System.Drawing.Color[] 用户可以提供一个颜色数组来显示。  当 ColorSet 属性设置为 ColorSet.Custom 时显示自定义颜色数组。

事件

支持 ColorChanged 事件,该事件在用户选择新颜色时触发。

CustomColorPicker

描述

灵感来自 Peter McMahon 的 ColorPicker.NET

此控件允许您选择任何 RGB 值。  它显示 RGB 颜色立方体的一个切片。  您选择 Z 轴为红色、绿色或蓝色,然后控件会在立方体中以适当的 Z 轴值显示 X-Y 轴。  您可以连续滚动 Z 轴并查看颜色面板的变化,但这可能只在 500MHz+ 的处理器上才能平滑运行。

属性

CustomColorPicker 支持以下属性,所有这些属性都可以在 Visual Studio 属性浏览器中“ColorPicker”类别下找到。 

属性名 类型 描述
Color System.Drawing.Color 设置/获取选取的颜色。
EnableContinuousScrollZ bool 选择使用哪个颜色面板。

事件

支持 ColorChanged 事件,该事件在用户选择新颜色时触发。

发布历史

v1.0, 2001 年 10 月 23 日

  • 首次发布

v1.1, 2001 年 11 月 07 日

  • 增加了更多的设计时支持,形式为 DefaultValue 属性、ResetPropertyName/ShouldSerializePropertyName 方法对,以及 Description 属性。
  • 为允许用户设置颜色面板宽度而添加了 Columns 属性。
  • 为允许使用自定义颜色面板而添加了 CustomColors 属性。
  • 各种 bug 修复。
  • 改进/更平滑地调整设计时 ColorPanel 的大小。

兼容性

需要 VS.NET beta 2 来构建代码。   需要 .NET beta 2 运行时来运行编译后的示例。

已知错误

无法通过 Tab 键离开颜色选择器的下拉列表。

© . All rights reserved.