COLORREF,COLOR,RGB,CStringの転化総括分析

5034 ワード

一、COLORREFとRGBの相互変換RGB(r,g,b)はマクロであり、実際にはそれが行われていることは((COLORREF)((BYTE)(r)|((WORD)((BYTE)(g))))|((DWORD)(BYTE)<16))である.
rgb(r,g,b)=整数値=r+g*256+b*255*256
COLORREFは32ビット整数値で、色を表しています.RGB関数を使用してCOLORREFの定義typedef DWORD COLORREFを初期化できます.
COLORREF変数には、第1のCOLORREF cf=RGB(,);第2種
 
  
 CColorDialog colorDialog;
 COLORREF color;


    if( colorDialog.DoModal() == IDOK )
    {
        color = colorDialog.GetColor();
    }


このコードはMFCの色ダイアログを使用しています
COLORREFからRGB成分値を取り出すにはどうすればいいですか?マクロGetRValue GetGValue GetBValueを使用できます
彼らの定義は以下のとおりである.define GetRValue(rgb)#define GetGValue(rgb)((BYTE)(((WORD)>>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));


}


これはapi関数で書かれたColorrefとcolorの直線間の変換です.
////////////////////////////////////////////////////////////////////
COLORREFと文字間の変換1、文字列のフォーマット機能が強い
 
  
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;
}
///////////////////////////////////////////////////////


http://www.jb51.net/article/41396.htm