颜色类型变量COLORREF的定义如下:
typedef DWORD COLORREF; 可知:COLORREF变量是一个双字,4个字节,32位的值。对应16进制是0x00bbggrr。
补充:1个字节 = 8个二进制位(位);1个字 = 2个字节 = 16位;1个双字 = 2个字 = 4个字节 = 32位
RGB宏颜色处理函数如下(引用别人的:点击打开链接):
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
r、g、b三个颜色分量都是字节型(BYTE)数据,各占8位。其中,r是一个字节,位于第0~7位;g是一个字节,但是左移了8位,右补8个0,称为一个字(WORD),位于第8~15位 ;b是一个字节,但是左移了16位,后面补16个0,成为双字(DWORD),但b位于16~23,如图1所示。双字空出了一个字节,这个字节a常用于颜色融合,也称RGBA。
获取各个颜色分量的宏函数如下:
#define GetRValue(rgb) ((BYTE)(rgb))
#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) ((BYTE)((rgb)>>16))
其中都用到了(BYTE)进行强制类型转换。在强制类型转换时,规则如下:
- 如果新类型能够表示原来的值,则结果就是原值。
- 如果新类型无法表示原来的值,则:
- 如果新类型是无符号的,则结果是原值不断加上或减去去新类型的最大值,直到它能够被新类型表示。(换而言之是原值 %
,b 为新类型的位数)
- 如果新类型是有符号的,那么结果由实现定义。
- 如果新类型是无符号的,则结果是原值不断加上或减去去新类型的最大值,直到它能够被新类型表示。(换而言之是原值 %
由上图可知,GetRValue(rgb)取出来的是r的值;GetGValue(rgb)进行了右移8位,之后取出来的正是g分量的值;GetBValue(rgb)进行了右移16位,之后取出来的正是b分量的值。