观察以下代码:
COLORREF rgb = pDC->GetBkColor();
BYTE r,g,b;
r = GetRValue(rgb);
g = GetGValue(rgb);
b = GetBValue(rgb);
COLORREF的存储为 0x00BBGGRR,即R在低位。
在小端存储模式中,低地址存放低位数据,高地址存放高位数据,windows使用小端存储。
十六位数字0x11223344在小段模式存储为 "低地址..44 33 22 11..高地址"
我们称读作:0x11223344,存作:44332211,(注意是十六进制数据)
假设一个颜色值 RR GG BB,使用COLORREF表示,则读作:0x00BBGGRR,存作:RRGGBB00
而RGBQUAD是一个结构体,定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
结构体变量存储的时候,跟字符串存储方式一样,是从开始到结束顺序存储,
如果把RGBQUAD当做一个字符串,则读为:"AARRGGBB",
如果把RGBQUAD当做一个int型数字,则读为:0xAARRGGBB,AA为alpha通道。
我们将数字0x11223344的最高位、次高位、次低位、最低位认作11、22、33、44。
这样,在COLORREF中,红色R被读成最低位,蓝色B被读成次高位,最高位是0。
而在RGBQUAD中,红色R被读成次高位,蓝色B被读成最低位,最高位是alpha通道AA。
二者顺序正好是相反的。
为了验证上述说法,新建一个MFC项目,在cview类添加一个菜单响应函数,函数内代码如下
COLORREF rgb;
//rgb = pDC->GetBkColor(); //COLORREF的存储为 0x00BBGGRR,即R在低位。
rgb = 0x00332211; //3是蓝色B,1是红色R
BYTE r,g,b;
r = GetRValue(rgb);
g = GetGValue(rgb);
b = GetBValue(rgb);
RGBQUAD rgbquad;
rgbquad.rgbBlue = b;
rgbquad.rgbGreen = g;
rgbquad.rgbRed = r;
CString strrgb,strrgbquad;
strrgb.Format("rgb=%x",rgb);
strrgbquad.Format("rgbquad=%x",rgbquad);
MessageBox(strrgb);
MessageBox(strrgbquad);
通过单击菜单项,先后弹出两个消息框,第一个消息框如下:
第二个消息框如下: