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

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

(0)

相关推荐

  • COLORREF,COLOR,RGB,CString的转化总结分析

    一.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 函 数 来

  • 微信端口及协议分析(java、C版)

    有朋友公司需求如下,手机通过WIFI连接上网,而老板要求,员工使用手机只能上微信,而不能上其他网页和看在线视频.上网搜索了微信使用协议和端口. 微信通过TCP方式来进行通讯. TCP通讯方式分析 通讯端口分析 远程通讯端口范围: 80,443,80,443,8080. HTTP方式分析 在特征分析中,发现微信会采用HTTP协议进行通讯. 连接的主机(Host)(正则表达式)为:^short\.weixin\.qq\.com,^(mmsns|mmbiz)\.qpic\.cn. TLS方式分析 在特

  • 基于WTL 双缓冲(double buffer)绘图的分析详解

    WTL中有两个Mix-in类: CDoubleBufferImpl和CDoubleBufferWindowImpl,用于创建双缓冲绘图窗口,用法非常简单.下面创建了一个普通的WTL窗口类,在窗口的客户区中有大量的绘图工作,使用CDoubleBufferImpl类来消除绘图时的闪烁现象: 复制代码 代码如下: const COLORREF WHITE_COLOR = RGB(255,255,255);const COLORREF BLUE_COLOR = RGB(0,0,255);class CM

  • Java源码角度分析HashMap用法

    -HashMap- 优点:超级快速的查询速度,时间复杂度可以达到O(1)的数据结构非HashMap莫属.动态的可变长存储数据(相对于数组而言). 缺点:需要额外计算一次hash值,如果处理不当会占用额外的空间. -HashMap如何使用- 平时我们使用hashmap如下 Map<Integer,String> maps=new HashMap<Integer,String>(); maps.put(1, "a"); maps.put(2, "b&quo

  • 基于python分析你的上网行为 看看你平时上网都在干嘛

    简介 想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了. 这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅适用于Chrome浏览器或者以Chrome为内核的浏览器. 在该页面中你将可以查看有关自己在过去的时间里所访问浏览的域名.URL以及忙碌天数的前十排名以及相关的数据图表. 部分截图 代码思路 1. 目录结构 首先,我们先看一下整体目录结构 Code ├─ app_callback.py 回调函数,实

  • Python docx库用法示例分析

    本文实例分析了Python docx库用法.分享给大家供大家参考,具体如下: 打开及保存文件: from docx import Document document = Document('test.docx') document.save('test.docx') 添加文本: document.add_paragraph('test text') 调整文本位置格式为居中: from docx import Document from docx.enum.text import WD_ALIGN

  • react-diagram 序列化Json解读案例分析

    本文目标 本文档的目标在于解释react-diagram框架模型序列化的Json,由于缺乏文档,我这边只能通过不断尝试和调试来进行测试. 序列化案例1:空画布 { "id": "27", "offsetX": 0, "offsetY": 0, "zoom": 100, "gridSize": 0, "layers": [ { "id": "

  • Python利用Charles 实现全部自动答题思路流程分析

    利用Charles 达成"我是达人"答题类爆破思路 最近公司需要使用"我是答题"小程序,对武汉疫情进行知识问题:榜单靠前的也有一定的学分奖励:虽然平时总不屑于公司组织的此类活动,但是看了这次活动形式,还是决定直接"爆破 0x01 思路18年大火的直播答题中,对某答题app也进行了类似爆破,并薅了不少羊毛,到了后期已经做到了全自动化的答题,并且是100%正确正常情况下小程序和服务端通信流程 使用charles对请求进行串改流程 因为我的主力电脑就是MacOS

  • Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析

    目录 知识点 第三方库 开发环境: 爬虫程序 导入模块 发送请求 获取数据(网页源代码) 解析网页(re正则表达式,css选择器,xpath,bs4/六年没更新了,json) 向详情页网站发送请求(get,post) 解析网页 保存数据 数据可视化 导入模块 导入数据 旅游胜地Top10及对应费用 出游方式分析 出游时间分析 出游玩法分析 知识点 requests 发送网络请求 parsel 解析数据 csv 保存数据 第三方库 requests >>> pip install requ

  • Python实现微信好友数据爬取及分析

    前言 随着微信的普及,越来越多的人开始使用微信.微信渐渐从一款单纯的社交软件转变成了一个生活方式,人们的日常沟通需要微信,工作交流也需要微信.微信里的每一个好友,都代表着人们在社会里扮演的不同角色. 今天这篇文章会基于Python对微信好友进行数据分析,这里选择的维度主要有:性别.头像.签名.位置,主要采用图表和词云两种形式来呈现结果,其中,对文本类信息会采用词频分析和情感分析两种方法.常言道:工欲善其事,必先利其器也.在正式开始这篇文章前,简单介绍下本文中使用到的第三方模块: itchat:微

随机推荐