🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 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 是各种颜色枚举字符常量(包括中文译名)所对应的色块表(按字母顺序排列)。