COLORREF,COLOR,RGB,CString的转化总结分析_C 语言

一、COLORREF与RGB的相互转化
RGB(r,g,b)是一个宏
实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

rgb(r,g,b)   =   一个整型值   =   r   +   g   *   256   + b*255*256  

COLORREF 是 一 个 32-bit 整 型 数 值,它 代 表 了 一 种 颜 色。你 可以 使 用 RGB 函 数 来 初 始 化 COLORREF
它的定义
typedef DWORD   COLORREF;

COLORREF变量有两种赋值方法
第一种
COLORREF cf = RGB(,,);
第二种

复制代码 代码如下:

 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并没有直接实现。那么就需要我们自己处理了。这里给出两个函数。

复制代码 代码如下:

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()得到的数值中颜色排列是AARRGGBB

三、 注意

复制代码 代码如下:

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 和字符之间的转换
一、格式化字符串的功能很强大

复制代码 代码如下:

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;
}
///////////////////////////////////////////////////////

时间: 2024-09-15 02:26:38

COLORREF,COLOR,RGB,CString的转化总结分析_C 语言的相关文章

C语言的递归思想实例分析_C 语言

本文实例分析C语言的递归思想,分享给大家供大家参考之用.具体方法如下: 通俗点来说,递归就是自己调用自己. 递归的难点一是理解递归的执行调用过程,二是设置一个合理的递归结束条件. 下面来看一段摘自书中的简单程序: #include <STDIO.H> long fact(int n); long rfact(int n); int main(void) { int num; printf("This program calculates factorials.\n"); p

opencv 做人脸识别 opencv 人脸匹配分析_C 语言

机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确拒绝率很低. 任一节点判断没有人脸特征则结束运算,宣布不是人脸. 全部节点通过,则宣布是人脸. 工业上,常用人脸识别技术来识别物体. 对图片进行识别 复制代码 代码如下: #include "opencv2/core/core.hpp" #include "opencv2/obj

C++编译器无法捕捉到的8种错误实例分析_C 语言

本文实例分析了C++编译器无法捕捉到的8种错误,分享给大家供大家参考之用.有助于深入理解C++运行原理,具体分析如下: 众所周知,C++是一种复杂的编程语言,其中充满了各种微妙的陷阱.在C++中几乎有数不清的方式能把事情搞砸.幸运的是,如今的编译器已经足够智能化了,能够检测出相当多的这类编程陷阱并通过编译错误或编译警告来通知程序员.最终,如果处理得当的话,任何编译器能检查到的错误都不会是什么大问题,因为它们在编译时会被捕捉到,并在程序真正运行前得到解决.最坏的情况下,一个编译器能够捕获到的错误只

C++ 多重继承和虚拟继承对象模型、效率分析_C 语言

一.多态 C++多态通过继承和动态绑定实现.继承是一种代码或者功能的传承共享,从语言的角度它是外在的.形式上的,极易理解.而动态绑定则是从语言的底层实现保证了多态的发生--在运行期根据基类指针或者引用指向的真实对象类型确定调用的虚函数功能!通过带有虚函数的单一继承我们可以清楚的理解继承的概念.对象模型的分布机制以及动态绑定的发生,即可以完全彻底地理解多态的思想.为了支持多态,语言实现必须在时间和空间上付出额外的代价(毕竟没有免费的晚餐,更何况编译器是毫无感情): 1.类实现时增加了virtual

C语言函数的递归和调用实例分析_C 语言

一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. 二.递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1.可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减. 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用. 2

深入C++实现函数itoa()的分析_C 语言

函数itoa()是将整数型转换为c语言风格字符串的函数,原型:char * itoa(int data, char*p, int num):data是传入的带转化的数字,为整型变量(data的最大值为2的31次方减去1),p是传入的字符型指针,指向存储转换后字符串空间的首地址:num指定要转换成几进制的数字字符串(二进制,八进制,十进制,十六进制).如有不足之处,还望指正!!! 复制代码 代码如下: // TestInheritance.cpp : 定义控制台应用程序的入口点.//#includ

C++虚析构函数的使用分析_C 语言

在C++中,不能声明虚构造函数,但可以声明虚析构函数.多态性是指不同的对象对同一消息有不同的行为特性.虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的.析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,析构函数最好都是virtual的.首先解释一下虚构函数和指针之间是如何交互的,以及虚析构函数的具体含义.例如以下代码,其中SomeClass是含有非virtual析构函数的一个类:SomeClass *p= new SomeCla

C++中new与delete、malloc与free应用分析_C 语言

一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了.本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析一下,供大家参考. 一.new和delete new和delete是C++的运算符,用于动态分配内存和释放内存. 1.new表达式 标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad

Cocos2d-x学习笔记之Hello World源码分析_C 语言

首先我们来说一下游戏的原理,游戏类似于一场电影,早期的电影不就是靠一张张的图片放出来的吗?把场景人物什么的画在一幅幅图片上,然后从第一张图片开始播放就可以了.游戏更是如此,其实我们玩的游戏看到的画面都是美工做出来的,我们程序员要做的事情是组织这些图片,比如先弄个背景图片,然后在某一个坐标上放置一个人物的图片,我们写好程序,控制这个图片的移动路径,等机器运行的时候每秒都要刷新画面,我们就看到人物动了起来.而刷新页面的快慢就是我们所说的帧率,这个在程序中我们可以控制.整体的意思就是游戏不过是一些图片