关于COLORREF与RGBQUAD的颜色转换问题

观察以下代码:

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);
通过单击菜单项,先后弹出两个消息框,第一个消息框如下:

第二个消息框如下:


你可能感兴趣的:(windows,struct,存储,mfc,byte)