## 1.5 顏色
與 GDI 相比,GDI+的顏色新增了一個透明分量,并且定義了顏色類 Color。
### 1.5.1 顏色類型 ARGB
GDI+中的顏色,與 GDI 中的顏色的最大不同,是增加了一個字節(8 位)的透明分量 alpha(α ),用來表示顏色的不透明度:0 透明(看不見前景色,只有背景色)~255 不透明(看不見背景色,只有前景色,相當于覆蓋和拷貝)。背景色指屏幕窗口中原有圖形的顏色, 前景色指將要繪制圖形的顏色。
因此,GDI+中的顏色一般都是用四個字節表示(Intel CPU 中,多字節整數的低位在前):
+ 整數序(高位→低位):

+ 字節序(低字節→高字節):

在 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 是各種顏色枚舉字符常量(包括中文譯名)所對應的色塊表(按字母順序排列)。