今天升级软件过程中,遇到点小问题,就是GDI+编程中的COLORREF类型转换成MFC中Color类型。这两个类型其实有联系的,我们就下面开始吧。
COLORREF是color和reference的缩写,表示颜色值,实际上是unsigned long类型。可以配合RGB()宏来设置。
COLORREF类型变量值描绘一个颜色时对应于下面16进制的格式:
0x00bbggrr
可以用这样一个结构体来描述:
RGB_value struct
{
byte red;
byte green;
byte blue;
byte unused;
};
其中第一字节为 0 而且始终为 0,其它三个字节分别表示蓝色、绿色和红色,刚好和 RGB 的次序相反。这个结构体用起来挺别扭。对于COLORREF,我们通常使用宏RGB对其进行赋值。如何从COLORREF中获取RGB分量值:
COLORREF colorrrefRGB =RGB(120,250,110);
BYTE r = GetRValue(colorrrefRGB);
BYTE g = GetGValue(colorrrefRGB);
BYTE b = GetBValue(colorrrefRGB);
1、从Color到COLORREF:
int nColor=crColor.ToArgb();
int blue=nColor&255;
int green=nColor>>8&255;
int red=nColor>>16&255;
//注意COLORREF中颜色的排列是BGR,而通过Color.ToArgb()得到的数值中颜色排列是AARRGGBB
int nColorRef=blue<<16|green<<8|red;
2、从COLORREF到Color(注意COLORREF中颜色的排列是BGR,红色分量在最后面):
int red=nColorRef&255;
int green=nColorRef>>8&255;
int blue=nColorRef>>16&255;
Color crColor=Color.FromArgb(red,green,blue); // C#编写
Color crColor(red,green,blue); // C++编写
或者直接通过下面的代码:
Color.FromArgb(nColorRef&255,nColorRef>>8&255,nColorRef>>16&255);
或者是:在GDI+中使用的是画笔工具是Pen,不是CPen,颜色参数也是COLOR或画刷(必须在构造函数进行初始化,本身是一个带有参数的类)而不是COLORREF,必须发生转换。1.COLOR------COLORREF
c.SetFromCOLORREF(color);
color=c.ToCOLORREF();
2,COLORREF----COLOR
COLORREF color;
Color c(GetRValue(color),GetGValue(color),GetBValue(color));//Color是类,COLORREF是长整型,需要转换获取值
m_bBrush.SetColor(c);