一个快速、紧凑的 C# 颜色选择控件






4.62/5 (10投票s)
2005年2月22日
3分钟阅读

78842

1303
一个颜色选择控件,可以快速让用户找到他们想要的颜色。
引言
你有没有想过选择一个颜色,然后对自己说:“我只是想要一个浅橙红色,但不要太刺眼”? 然后你得到了像 Windows 颜色选择对话框这样的选择控件,你必须花五分钟(或更长时间)来操作控件,才能最终得到你想要的颜色? 这个控件的设计考虑到了这个问题。它允许用户快速找到他们想要使用的颜色,并且它使用相对较小的屏幕空间来实现这一点。 该控件是可调整大小的,因此您可能会将其压缩得比演示中显示的还要小。它使用 .NET 双缓冲控件支持来实现无闪烁更新和即时用户反馈。
要使用该控件,您首先通过单击色调栏来选择您的颜色。它很好而且是线性的,因此您可以快速获得正确的色调(它使用的屏幕空间比您通常看到的大圆圈要少)。您可以单击大的向左或向右箭头来调整色调一步。按住按钮会启动一个计时器,其作用很像键盘重复,可以缓慢地移动色调。说到键盘,您也可以使用键盘上的向右和向左箭头来选择色调。
一旦你有了色调,移动亮度(更正式的名称是“光度”)和饱和度的滑块,就可以快速调整颜色的亮度和纯度。想要灰度?只需将饱和度一直调到零,然后调整亮度即可获得你的灰色阴影。
如果你想直接输入红色、绿色和蓝色值,左键单击显示所选颜色的区域将调出 Windows 颜色选择对话框。它将完全展开,因此您可以直接转到红色、绿色和蓝色编辑框。 选择“确定”会将颜色选择控件调整为你在此对话框中选择的颜色。
背景
我看过许多其他可用的颜色选择控件。 它们要么太重,因为它们会弹出一个复杂的对话框,要么太难快速找到颜色。 在设计此控件时,我采用了 Christian Rodemeyer 的名为 CColor
的 C++ 项目中的色调/亮度/饱和度 (HLS) 到红色/绿色/蓝色 (RGB) 转换代码,该项目位于 CodeProject 上 这里。 谢谢 Christian!
使用代码
在您的表单代码顶部包含一个 #using CustomUIControls;
语句。然后,通过右键单击您的项目并选择“添加引用...”,然后浏览到 DLL 所在的位置,添加对CustomUIControls.dll的引用。然后将控件添加到您的表单。最后,如果您希望在用户更改控件中的颜色时收到通知,请从 IColorSelectCallback
接口派生您的控件。源代码中通过 TextStylePicker
控件提供了一个如何使用颜色选择控件的示例,该控件允许您选择文本的前景色、背景色和字体。此外,还有一个带有图形箭头的按钮,您也可以重复使用它。这是一个在表单上使用颜色选择控件的概要示例
public class MyCustomForm : System.Windows.Forms.Form, IColorSelectCallback
{
// ... member variables ...
private ColorSelectControl cscColorSelect;
// ... form designer ...
private void InitializeComponent()
{
// ... add this here once, then you can
// mess with the properties in Form Designer ...
this.cscColorSelect = new CustomUIControls.ColorSelectControl();
}
// ... form load, you can initialize properties if you wish ...
private void OnFormLoad(object sender, System.EventArgs e)
{
// set the starting color
cscColorSelect.SelectedColor = m_ForeColor;
// put ourselves in as callback
cscColorSelect.CallbackHost = this;
}
//////////////////////////////////////////////////////
// Interface Implementation
//////////////////////////////////////////////////////
#region IColorSelectCallback Members
/// <summary>
/// One of the custom color select controls has changed its color
/// </summary>
/// <param name="ControlID">The unique ID of the control that changed</param>
/// <param name="clrNewColor">The new color</param>
public void ColorChanged(int ControlID, Color clrNewColor)
{
// ... do stuff here because the color has changed ...
} // ColorChanged()
#endregion
} // class MyCustomForm
历史
- 版本 1.0
- 初始发布。