不仅仅是另一个颜色选择器...
为您的VB.NET应用程序提供一个高级颜色选择器控件。

引言
这是一个完全用VB.NET编写的高级颜色选择对话框。
背景
于是我,又一次回来了。我需要一个颜色选择控件来处理我正在开发的一个项目,就像大多数开发者一样,我转到我的工具栏,看看Microsoft在Visual Studio中为我准备了什么。
没过多久,我就写好了一个颜色选择对话框,并准备好使用……运行我的应用程序,点击选择颜色图标,然后它就出现了——或者说,某种东西出现了。我想,严格来说,它确实是一个颜色选择工具……我的意思是,对话框上有颜色,你可以选择它们……但是(我是在委婉地说)它太丑了。
于是我转到The Code Project,看看其他开发者有什么成果。我发现有几个接近我想要的,但最好的一个是由Danny Blanchard用C#写的一个较早的项目,它模仿了Photoshop的颜色选择器。
所以我决定采用Danny的代码,看看我是否能足够地解读C#,将他的控件转换为VB.NET控件,这就是我工作的成果。
Using the Code
本文有两个ZIP文件:ColorPickerProject.ZIP包含对话框的源代码,ColorPickerDemo.ZIP包含一个非常简单的VB.NET项目,该项目使用了该对话框。
StartPosition |
允许您设置对话框的启动位置 |
HeaderText |
这是显示在对话框最顶部的文字 |
DialogLabel |
这将是显示在颜色框上方标签中的文字 |
RGB |
获取或设置对话框当前指向的颜色 |
ColorPickerChanged
:每当对话框的RGB
属性发生更改时(无论是通过鼠标移动还是键盘输入),都会引发此事件。您可以在显示对话框之前添加一个处理程序来捕获该事件,如下所示:
Private Sub SelectColor()
Dim OriginalColor As Color = Color.FromArgb(120, 120, 120)
Dim cp As New ColorPicker.cp
cp.StartPosition = FormStartPosition.CenterScreen
cp.HeaderText = "This is a demo of the Color Picker Dialog Box"
cp.DialogLabel = "Select Background Color"
cp.RGB = OriginalColor
AddHandler cp.ColorPickerChanged, AddressOf ColorChanged
cp.ShowDialog()
If cp.DialogResult = Windows.Forms.DialogResult.OK Then
SampleLabel.BackColor = cp.RGB
Else
SampleLabel.BackColor = OriginalColor
End If
End Sub
Private Sub ColorChanged(ByVal _rgb As Color, ByVal _MarkerColor As Color)
SampleLabel.BackColor = _rgb
SampleLabel.ForeColor = _MarkerColor
SampleLabel.Refresh()
End Sub
关注点
您可能会从上面的截图注意到,我没有允许用户更改CMYK值。这是出于多种原因,其中最重要的是:我不使用CMYK!哈哈。另外,CMYK到RGB不是一个精确的科学。RGB的颜色比CMYK多得多,这意味着每个CMYK值都有多个RGB值。最终,这会导致RGB到CMYK的转换是准确的……但反之则不然。
有趣的是,很少有印刷行业的领导者同意如何进行双向转换……每个人似乎都使用自己的转换方式,结果是近似的,但并不完全准确……听起来很奇怪?让我来解释一下这是如何工作的。
CMYK(青色、品红色、黄色和黑色)是为了节省印刷商的成本而开发的。您知道,黑色油墨比彩色油墨便宜得多。印刷商发现,他们可以通过减少少量彩色油墨的使用量,并增加黑色油墨的使用量,就能非常逼真地近似真实的色彩图像……您使用的彩色油墨越少——您就越需要使用黑色来弥补色彩的损失。当然,您只能进行到一定程度,否则图像就会失去其色彩信息。尽管如此,您可以将RGB转换为CMYK值,然后减少CMY并增加K,仍然得到相同的RGB……这就是为什么您不能说“这就是转换公式”。充其量,您只能说“这是转换的一种方式”。
到目前为止还在阅读CMYK与RGB辩论的任何人,真的需要考虑多离开一下电脑了!相信我……这相当无聊。
尽管如此,我确实找到了一个Adobe使用的漂亮的转换公式,这就是我将其放入此控件中的。
有人用过HSL吗?HSL是色相、饱和度和亮度(亮度),这是另一种看待颜色方式,并且是所有颜色转换过程的基础。此对话框将所有RGB值转换为HSL值,然后在文本框中显示结果。您可以选择通过单击所需值旁边的单选按钮来锁定任何HSL或RGB值。
历史
重新上传了演示项目——原始项目没有正确指向本地DLL,如果将其加载到Visual Studio中,可能会导致未解析的警告。
Danny的原始控件的链接未包含在我最初的文章中。我已重新添加了他提到在背景部分中的链接。