## 1.5 颜色
与 GDI 相比,GDI+的颜色新增了一个透明分量,并且定义了颜色类 Color。
### 1.5.1 颜色类型 ARGB
GDI+中的颜色,与 GDI 中的颜色的最大不同,是增加了一个字节(8 位)的透明分量 alpha(α ),用来表示颜色的不透明度:0 透明(看不见前景色,只有背景色)~255 不透明(看不见背景色,只有前景色,相当于覆盖和拷贝)。背景色指屏幕窗口中原有图形的颜色, 前景色指将要绘制图形的颜色。
因此,GDI+中的颜色一般都是用四个字节表示(Intel CPU 中,多字节整数的低位在前):
+ 整数序(高位→低位):
![](https://box.kancloud.cn/2016-04-18_57144a7df3340.png)
+ 字节序(低字节→高字节):
![](img/1-5-1-2.png)
在 GDI 中没有专门的颜色类,只有一个颜色类型 COLORREF,也定义为:
```
typedef DWORD COLORREF; // 0x00bbggrr (windef.h)
```
和一个生成颜色的宏:
```
COLORREF RGB( BYT E bRed, BYTE bGreen, BYT E bBlue);
```
其中:
```
typedef unsigned char BYTE; // 单字节无符号字符整数
```
在 GDI+中,也将颜色数据定义为无符号 4 字节长整数类型 DWORD,但是改名为 ARGB:
```
typedef DWORD ARGB; // gdipluspixelformats.h
```
### 1.5.2 颜色类 Color
而且 GDI+中还定义了专门的 Color 类,不仅包含了此颜色数据,而且还有多个构造函 数和其他辅助方法、枚举和常量。
Color 类的构造函数中,最常用的是:
```
Color( BYTE a, BYTE r, BYT E g, BYTE b); // a 为 alpha 分量α 但也有一个默认构造函数:
Color( VOID); // 不透明黑色,相当于 Color(255, 0, 0, 0);
```
还有一个与 GDI 兼容的构造函数:
```
Color( BYTE r, BYTE g, BYTE b); // 不透明色,相当于 Color(255, r, g, b);
```
你也可以直接用含颜色数据的 4 字节无符号整数,来构造 Color 类的对象:
```
Color( ARGB argb); // 相当于 Color(a, r, g, b);
```
该整数可以由 Color 类的静态方法 MakeARGB 或动态方法 GetValue 获得:
```
static ARGB MakeARGB( BYT E a, BYTE r, BYTE g, BYTE b);
ARGB GetValue(VOID);
```
你还也可以用 Color 类的方法:
```
COLORREF ToCOLORREF() const;
```
将 Color 对象中的颜色,转换为 GDI 的颜色类型。
Color 类还提供了各个颜色分量的获取方法及其简化版:
```
BYTE GetAlpha() const;
BYTE GetA() const;
BYTE GetRed() const;
BYTE GetR() const;
BYTE GetGreen() const;
BYTE GetG() const;
BYTE GetBlue() const;
BYTE GetB() const;
```
你也可以先用宏:
```
BYTE GetRValue(DWORD rgb); // COLORREF rgb
BYTE GetGValue(DWORD rgb); // COLORREF rgb
BYTE GetBValue(DWORD rgb); // COLORREF rgb
```
获取 COLORREF 的 R、G、B 值,然后再用这些值调用 Color 类的构造函数来创建 Color 对象。例如:
```
COLORREF crCol = colDlg.GetColor();
BYTE r = GetRValue(crCol),
g = GetGValue(crCol),
b = GetBValue(crCol);
Color col(r, g, b); // Color col(crCol | (255<<24));
```
### 1.5.3 颜色枚举常量
GDI+在颜色头文件 GdiplusColor.h 中,定义了 141 个公用颜色枚举常量,都是对应颜色 的英文单词。可以用 Color 类直接访问,例如:Color ::Red。
下面是部分颜色枚举常量(按字母顺序排列):
```
public:
// Common color constants 通用颜色常量
enum {
AliceBlue = 0xFFF0F8FF, // 艾丽丝蓝
AntiqueWhite = 0xFFFAEBD7, // 古董白
Aqua = 0xFF00FFFF, // 水绿
Aquamarine = 0xFF7FFFD4, // 碧绿
Azure = 0xFFF0FFFF, // 天蓝
Beige = 0xFFF5F5DC, // 米色
Bisque = 0xFFFFE4C4, // 汤黄
Black = 0xFF000000, // 黑
BlanchedAlmond = 0xFFFFEBCD, // 布兰奇杏黄
Blue = 0xFF0000FF, // 蓝
BlueViolet = 0xFF8A2BE2, // 蓝紫
Brown = 0xFFA52A2A, // 棕褐
...
Tan = 0xFFD2B48C, // 茶色
Teal = 0xFF008080, // 水鸭青
Thistle = 0xFFD8BFD8, // 蓟色
Tomato = 0xFFFF6347, // 番茄红
Transparent = 0x00FFFFFF, // 透明
Turquoise = 0xFF40E0D0, // 宝石绿
Violet = 0xFFEE82EE, // 紫罗兰
Wheat = 0xFFF5DEB3, // 小麦色
White = 0xFFFFFFFF, // 白
WhiteSmoke = 0xFFF5F5F5, // 烟白
Yellow = 0xFFFFFF00, // 黄
YellowGreen = 0xFF9ACD32 // 黄绿
};
```
图 14-12 是各种颜色枚举字符常量(包括中文译名)所对应的色块表(按字母顺序排列)。