高级颜色选择器控件






4.97/5 (10投票s)
1999年12月12日

94805

2229
一个替换颜色选择器控件,可让您对 RGB 和 HSB 选择进行完全的视觉控制。
是否曾经想要过像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 的一些建议,包括将两个渐变位图作为资源包含在内的非常好的建议。