之所以写这个博文总结,是因为在使用duilib的时候需要设置一个背景色,然后发现仅仅设置RGB值貌似不行,所以改成设置ARGB值了。然后没有找到对应的API。第二个原因是每次搞不清楚alpha通道的两个边界值的函数,老是会忘记哪个是全透明,哪个是透明。RGB(255,255,255)到底是白色还是黑色。
目前在windows上主要是使用RGB宏来生成颜色,GDI+ Color类来生成ARGB颜色。
开始我以为GDI中的RGB 和 GDI+中的ARGB 他们的顺序是一样的,结果我看代码验证了下发现是不一样的。
RGB宏对应的内存模型:
RGB宏定义:
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
可以看出r是最低位,b是最高位,g是中间位。32位值的最高位是没有使用的。默认为0x0。
BYTE r = GetRValue(col);
BYTE g = GetGValue(col);
BYTE b = GetBValue(col);
#define GetRValue(rgb) (LOBYTE(rgb))
#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) (LOBYTE((rgb)>>16))
取R的值直接就取最低位。取B的值需要右移16位。G的值类似。
调试截图:
GDI+ ARGB内存模型:
A就是alpha通道的含义,255表示不透明。0表示完全透明。
常用颜色值:
白色:rgb(255,255,255)
黑色:rgb(0,0,0)
红色:rgb(255,0,0)
绿色:rgb(0,255,0)
蓝色:rgb(0,0,255)
参考资料: