支持命名颜色和 HSV 值的颜色类





3.00/5 (3投票s)
2001年10月23日
4分钟阅读

73619

701
一篇介绍 CColor 类 - 一个支持命名颜色、系统颜色以及转换为 HSV 值的 RGB 封装的文章。
引言
ATL 和 MFC 都没有一个封装颜色的类。在 Win32 API 中,颜色可以表示为 COLORREF
值或 OLE_COLOR
值。两者之间的转换不会自动处理。系统还有一个调色板,只能通过使用 GetSysColor
函数进行转换。 .NET 库定义了一个也包含命名颜色的颜色类。最后,在处理颜色时,程序员经常需要访问 HSV(色相、饱和度和亮度)属性。CColor 类是我尝试满足所有这些需求的尝试。
类成员
构造函数
CColor(ULONG clrRef = -1L)
将颜色初始化为 clrRef 值。此值可以是
COLORREF
值(由RGB
宏提供)或 OLE_COLOR 值。如果未提供值,则颜色初始化为空(-1L)。
CColor(LPTSTR szString)
将颜色初始化为 szString 的解析值。字符串格式必须是十进制 RGB 值的逗号分隔列表(例如,“255,128,0”)或网页颜色字符串格式(例如,“#ff8000”)。
CColor(BYTE R, BYTE G, BYTE B)
将颜色初始化为 R、G 和 B 提供的 RGB 值。
CColor(int nSysColorIndex)
将颜色初始化为 nSysColorIndex 的系统颜色值。可接受值的列表可在
GetSysColor
API 函数的文档中找到。
CColor(CColor::KnownColor knownColor)
- 将颜色初始化为枚举类型值 knownColor 的值。仅当为项目定义了
__KNOWN_COLORS__
时,此构造函数才可用。
属性
R
获取/设置颜色的 R(红色)值。
G
获取/设置颜色的 G(绿色)值。
B
获取/设置颜色的 B(蓝色)值。
名称
如果颜色是已知颜色,则获取颜色的名称。如果颜色未知,则返回 NULL。仅当为项目定义了
__KNOWN_COLORS__
时,此属性才可用。
色相
获取颜色的色相。仅当为项目定义了
__HSV_COLORS__
时,此属性才可用。
饱和度
获取颜色的饱和度。仅当为项目定义了
__HSV_COLORS__
时,此属性才可用。
亮度
获取颜色的亮度(或值)。仅当为项目定义了
__HSV_COLORS__
时,此属性才可用。
运算符
operator COLORREF() const
返回颜色的当前
COLORREF
值。如果颜色是系统颜色,则会转换为实际的 RGB 值。
CColor& operator = (ULONG clrRef)
将颜色设置为 clrRef 值。此值可以是
COLORREF
值(由 RGB 宏提供)或OLE_COLOR
值。
CColor& operator = (LPTSTR szString)
将颜色设置为 szString 的解析值。字符串格式必须是十进制 RGB 值的逗号分隔列表(例如,“255,128,0”)或网页颜色字符串格式(例如,“#ff8000”)。
CColor& operator = (int nSysColorIndex)
将颜色设置为 nSysColorIndex 的系统颜色值。可接受值的列表可在 GetSysColor API 函数的文档中找到。
CColor& operator = (CColor::KnownColor knownColor)
- 将颜色设置为枚举类型值 knownColor 的值。仅当为项目定义了
__KNOWN_COLORS__
时,此运算符才可用。
bool operator < (const CColor& clr) const
仅当当前颜色的 HSV 值低于 clr 的 HSV 值时,才返回 true。仅当为项目定义了
__HSV_COLORS__
时,此运算符才可用。
bool operator == (ULONG clrRef) const
仅当 clrRef 的转换值等于当前颜色的转换值时,才返回 true。
bool operator == (LPTSTR szString) const
仅当 szString 的解析值等于当前颜色的转换值时,才返回 true。
bool operator == (CColor::KnownColor knownColor) const
仅当前颜色等于 knownColor 时,才返回 true。
方法
void GetHSV(double& h, double& s, double& v) const
获取当前颜色的色相(h)、饱和度(s)和亮度(v)。仅当为项目定义了
__HSV_COLORS__
时,此方法才可用。
LPTSTR GetRGBString(LPTSTR szColor, CColor::StringFormat fmt = CColor::CSV) const
构建一个由 szColor 指向的字符串,并根据指定的格式(fmt)返回其值。支持的格式为
- CSV - RGB 值的逗号分隔值(例如,“128,128,128”)
- Web - 通用网页颜色格式(#rrggbb)(例如,“#808080”)
- HexPairs - RGB 颜色的零填充十六进制值(RRGGBB)(例如,“808080”)
bool IsEmpty() const
仅当尚未分配任何颜色时,才返回 true。
bool IsSystemColor() const
仅当颜色定义为系统颜色时,才返回 true。
bool IsKnownColor() const
仅当颜色是
KnownColor
枚举类型中定义的枚举颜色之一时,才返回 true。仅当为项目定义了__NAMED_COLORS__
时,此方法才可用。
历史
2001 年 10 月 23 日 - 首次提交。
示例代码
// // Example of using the CColor class // // Set initial values using either constructors or assignment operators CColor clr1(CColor::Control), clr2(RGB(0,0,255)), clr3, clr4, clr5; clr3 = "255,15,1"; clr4 = "#ff0f01"; LPCTSTR szName; bool b; szName = clr1.Name; // This will return "Control" b = clr1.IsSystemColor(); // This will return true szName = clr3.Name; // This will return NULL b = clr3.IsSystemColor(); // This will return false if (clr3 == clr4) // This will evaluate to true b = clr5.IsEmpty(); // This will return true // Set R, G, and B values clr5.R = 128; clr5.G = 128; clr5.B = 128; if (clr5 < clr1) // This will evaluate to true since clr1 is darker than clr5 if (clr5.IsKnownColor()) // Evaluates to true since RGB(128,128,128) is known as Gray if (clr5 == CColor::Gray) { // Get the R, G, and B values for clr1 BYTE r,g,b; r = clr1.R; g = clr1.G; b = clr1.B; } // Get the HSV values of clr3 double h,s,v; h = clr3.Hue; s = clr3.Saturation; v = clr3.Brightness;