当前位置: 首页 > 文档资料 > Gdip 编程基础 >

1.5 颜色

优质
小牛编辑
130浏览
2023-12-01

与 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 是各种颜色枚举字符常量(包括中文译名)所对应的色块表(按字母顺序排列)。