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

高级颜色选择器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (10投票s)

1999年12月12日

viewsIcon

94805

downloadIcon

2229

一个替换颜色选择器控件,可让您对 RGB 和 HSB 选择进行完全的视觉控制。

  • 下载演示项目 - 287 Kb
  • Sample Image - ColorSpace.jpg

    是否曾经想要过像Corel PhotoHouse这样的应用程序中那种漂亮的颜色选择对话框?如果想要,这就是了!!

    首先,讲一些关于我如何完成这件事的通用内容。

    最重要的一部分,显然是 RGB 到 HSB 的颜色空间转换。我在 Codeguru 上的一个讨论板上得到了一些帮助(实际上很多帮助) (谢谢!)

    一旦有了这段代码,你就会遇到下一个问题,即创建用于显示颜色空间的适当位图。

    创建色调位图非常容易,因为你只需要遍历每个色调值(0-360),然后迭代每个饱和度值(0-255)。 我使用标准亮度值 255 作为位图,因为其他值会产生非常暗淡的结果。

    接下来,这是困难的部分 - 就是创建 RGB 位图的部分。这有点难,因为你不仅要创建渐变,还要无缝地将它们拼接在一起。我通过首先创建矩形渐变,然后使用一些纹理映射代码(由 Micheal Abrash - Zen 提供)将它们拼接在一起来实现这一点。

    现在,下一步是给整个东西一个用户界面。 同样,HSB 部分很容易,因为找到一个点的角度以及它与另一个点的距离非常简单。 对于那些对代码感到愤怒的数学大师,请原谅我 - 我采用了我所知道的最简单的方法 -

    x2 + y2 = a2.

    然后我们来到 RGB 空间。 同样,这需要大量的 3D 数学知识 - 我再次采取了最简单的方法 - 因为我知道我正在使用的位图以及顶点的坐标,我使用一些 2D 数学知识将点从 3D 空间映射到 2D 空间,反之亦然。 它不是非常优雅,但它有效,这就是我获得报酬的原因。

    如果你看看 CColorPickerDlg 的构造函数,你会注意到我为顶点和中心设置了某些值。 我是从我正在使用的位图中得到的。 你可以很容易地使用不同的位图,如果你不喜欢我提供的那个(尽管我无法想象为什么!!!),只需在这里设置不同的值即可。 实际进行数学计算的代码应进行相应调整。

    不幸的是 - 这段代码是在很匆忙的情况下熬夜写的!!所以,我没有写太多注释。我将在未来几周内尝试发布更新,其中包含一些升级以及大量注释。

    现在 - 对于重要的事情 - 你怎么使用它? 简单 - 将对话框资源 - IDD_DIALOG_COLORS 从演示项目的资源文件中复制到你的项目中。

    接下来 - 将两个位图资源 IDB_BITMAP_HSB 和 IDB_BITMAP_HSB 从演示项目复制到你自己的工作区中。

    然后,在你要从中调用的文件(演示中的视图)中包含 ColorPickerDlg.h,并使用以下代码片段

        CColorPickerDlg dlg(m_color) // where m_color is the color you want to inialize
                                     // want to inialize with
        if(dlg.DoModal() == IDOK)
    	{
    		// User pressed ok 
    		m_color = dlg.GetColor();
    	}
    

    就是这样。 是的,请包含

    • ColorPickerDlg.cpp
    • Dib.cpp
    • Common.cpp

    在你的项目中。 后两个是支持文件,提供一些 DIB 操作例程以及一些数学计算。

    我提供的演示应用程序使用灰色 = (192,192,192) 作为默认背景。选择查看 | 颜色空间以调用颜色选择器。当你选择不同的颜色时,它被用作背景。

    CColorPickerDlg 也会自动处理 WM_SYSCOLORCHANGE 消息,以确保始终不显示奇怪的图像。

    感谢 Chris Mauder 的一些建议,包括将两个渐变位图作为资源包含在内的非常好的建议。

    © . All rights reserved.