觀察以下代碼:
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);
通過單擊菜單項,先後彈出兩個消息框,第一個消息框如下:
第二個消息框如下: