当前位置:C++技术网 > 资讯 > COLOR和COLORREF之间的理解与相互转换

COLOR和COLORREF之间的理解与相互转换

更新时间:2015-10-22 23:17:00浏览次数:1+次

    今天升级软件过程中,遇到点小问题,就是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);  


如果你还是不怎么懂,过段时间,等我升级软件成功,我就把这部分的代码都拿出来,你到时候看看那些代码就不再有疑惑了