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

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (3投票s)

2001年10月23日

4分钟阅读

viewsIcon

73619

downloadIcon

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)

将颜色初始化为 RGB 提供的 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;
© . All rights reserved.