COLORREFとRGBの相互変換

8536 ワード

一、COLORREFとRGBの相互転化


RGB(r,g,b)はマクロであり、実際には(COLORREF)((BYTE)(r)|((BYTE)(g)<<8)|((DWORD)(BYTE)(b)<<16))rgb(r,g,b)=整数値=r+g*256+b*255*256 COLORREFは32ビット整数値であり、色を表す.RGB関数を使用してCOLORREFを初期化できます

その定義


typedef DWORD COLORREF; COLORREF変数には2つの付与方法があります.
    COLORREF cf = RGB(,,);

第2種
    CColorDialog colorDialog;
    COLORREF color;
    if( colorDialog.DoModal() == IDOK )
    {
        color = colorDialog.GetColor();
    }

このコードはMFCの色ダイアログを使用しています
COLORREFからRGB成分値を取り出すにはどうすればいいですか?マクロGetRValue GetGValue GetBValueを使用して、次のように定義できます.
#define GetRValue(rgb)      ((BYTE)(rgb))
#define GetGValue(rgb)      ((BYTE)(((WORD)(rgb)) >> 8))
#define GetBValue(rgb)      ((BYTE)((rgb)>>16))

二、ColorとColorRef(intタイプ表示の色)の相互変換


実際のソフトウェア開発の過程で、よく非を使う必要がある.Netプラットフォームのコード.このときColorRef(つまりintタイプで表される色値またはDWORD値で表される色)に遭遇する可能性があります.これとNetプラットフォームの下の色の相互変換MSは直接実現されていない.では、私たちが自分で処理する必要があります.ここでは2つの関数を示します.
uint GetCustomColor(Color color)
{            
     int nColor = color.ToArgb();            
     int blue = nColor & 255;            
     int green = nColor >> 8 & 255;            
     int red = nColor >> 16 & 255;            
     return Convert.ToUInt32(blue << 16 | green << 8 | red);        
}

Color GetArgbColor(int color)       
 {            
     int blue = color & 255;            
     int green = color >> 8 & 255;            
     int red = color >> 16 & 255 ;            
     return Color.FromArgb(blue, green, red);        
 } 

注:COLORREFの色の配列はBGRで、Colorを通ります.ToArgb()で得られた数値における色配列はAARRGBBである
CColorDialog dlg;
if(dlg.DoModal() == IDOK)
{
    //m_FillColor = dlg.GetColor();
    COLORREF ctmpColor = dlg.GetColor();
    Color tmpColor;
    tmpColor.SetFromCOLORREF(ctmpColor);
    ARGB argb = Color::MakeARGB(m_nFillTran, tmpColor.GetR(),tmpColor.GetG(),tmpColor.GetB());
    //Graphics graphics(pDC->m_hDC);
    //HatchBrush hBrush(HatchStyleDashedHorizontal,Color(100,255,0,0), Color(argb));
    tmpColor = argb;
    m_FillColor = tmpColor.ToCOLORREF();
    //m_FillColor = RGB(Color(argb));
}

COLORREFと文字の変換


一、文字列をフォーマットする機能が強い
int iRed = GetRValue(pMarkInfo->lfColor);
int iGreen = GetGValue(pMarkInfo->lfColor);
int iBlue = GetBValue(pMarkInfo->lfColor);
CString szColor;
szColor.Format(_T("#%02X%02X%02X"), iRed, iGreen, iBlue);
/////////////////////////////////////////////////////
CString m_BackColor.m_frame_color = "#0290D8";
DWORD r,g,b;
sscanf(m_BackColor.m_frame_color,"#%2X%2X%2X",&r,&g,&b);
COLORREF rgb = RGB(r,g,b);
brush.CreateSolidBrush (rgb)
//////////////////////////////////////////////////
//COLORREF 
BOOL CDataManager::GetRGBText(std::string &strRGBText , COLORREF color)
{
     //COLORREF col = RGB( 255 , 12 , 4);
     BYTE Red = GetRValue(color); /// 
     BYTE Green = GetGValue(color); /// 
     BYTE Blue = GetBValue(color); /// 
     char chR[4];
     itoa(Red ,chR , 10 );
     char chG[4];
     itoa(Green , chG , 10);
     char chB[4];
     itoa(Blue , chB , 10);
     std::string strR , strG, strB;
     strR = chR ;
     strG = chG;
     strB = chB;
     strRGBText = strR + "," + strG + "," + strB;
     return TRUE;
}
// COLORREF, ("32","34","21")
BOOL CDataManager::GetColorRGB(CString strColorText , COLORREF& color)
{
    char chR[4] = "", chG[4] = "", chB[4] = ""; 
    sscanf( strColorText, "%[^,],%[^,],%[^,]", chR, chG, chB);
    color = RGB(atoi(chR), atoi(chG), atoi(chB));
    return TRUE;
}