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

不仅仅是另一个颜色选择器...

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.63/5 (14投票s)

2007 年 6 月 28 日

CPOL

4分钟阅读

viewsIcon

64849

downloadIcon

2337

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

Screenshot - ColorPicker.jpg

引言

这是一个完全用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的原始控件的链接未包含在我最初的文章中。我已重新添加了他提到在背景部分中的链接。

不仅仅是另一个颜色选择器…… - CodeProject - 代码之家
© . All rights reserved.