16进制转成RGB

2459人阅读 评论(6) 收藏 举报

 1、背景

        在工作中,我需要将一些关于控件的信息记录在xml文件中,这些信息包含控件的位置,大小以及一些颜色信息等,这些颜色属性定义成color="#ffaabbcc"的格式,在此主要讨论这个16进制标识的颜色与VC中的COLORREF之间的转换。

2、实现思路

      考虑到color属性的特殊性——"#ffaabbcc"在此不关心它的前几位,只在意最后六位,两位两位地分别对应颜色值R,G,B。从这个16进制的颜色表示中要获得RGB三个颜色分量的值,可以考虑按位&,如将ffaabbcc & 0xff0000,得到R的值;fffaabbcc & 0x00ff00得到G的值;同理也可以将ffaabbcc & 0x0000ff得到B的值。在这个过程中,还要注意移位的问题,如取得R的值时就要右移16G的值要右移8B的值不移动,这样才能得到正确的RGB分量值——RGB(170,187,204)。

3、实现过程

      为了阐述以上实现思想,笔者创建一个基于对话框的MFC应用程序,建立如图所示的界面。控件与其属性如下表所示:

表1.控件ID与属性设置
控件IDREADONLY属性关联变量
IDC_HEXSTRINGFALSECString m_hex
IDC_RGBTRUECString m_rgb
IDC_RTRUECString m_r
IDC_GTRUECString m_g
IDC_BTRUE

CString m_b

IDC_BTN_TRANSCaption:转换Command:OnBtnTrans()

        为IDC_BTN_TRANS添加事件,编辑代码:

void CStringToRGBDlg::OnBtnTrans() 
{

    UpdateData();
    m_hex.TrimLeft();
    m_hex.TrimRight();
    
if  ( m_hex  ==   ""  )
    {
        MessageBox(
" 请输入十六进制颜色值! " );
        
return ;
    }
    
// 判断长度    
    
int     length  =  m_hex.GetLength();
    
if  ( length! = 9  )    //在此为了简便,将字符串的长度规定为9位
    {
        MessageBox(
" 输入的十六进制位数不对,请参照示例重新输入! " , " 十六进制与RGB转换 " ,MB_OK);    
        ((CEdit
* )GetDlgItem(IDC_HEXSTRING)) -> SetSel( 0 , 9 , TRUE );
        GetDlgItem(IDC_HEXSTRING)
-> SetFocus();
        
return ;
    }
    
// 判断是否含有非法字符
    
// ......
    CString strTemp;
    
strTemp = m_hex.Mid(3,length);

    
if  (  - 1  ! = strTemp.FindOneOf("~!@#$%^&*()_+|-=/{}[]:;'<>?,./ghijklmnopqrstuvwxyzGHIJKLMNOPQRSTUVWXYZ"))  //过滤非法字符
    {
        MessageBox(
" 字符串中包含有非法字符!请确定是否输入了十六进制之外的字符 " );
        ((CEdit*)GetDlgItem(IDC_HEXSTRING))->SetSel(0,9,TRUE);
        GetDlgItem(IDC_HEXSTRING)
->SetFocus();
         return ;
    }

    
// 合法,则进行转换。程序的主要代码,如果要用到这个转换,则将下面这部分代码拷贝做一点小修改即可
    
long  longTemp  =  strtol(strTemp.GetBuffer( 100 ),NULL, 16 );     //先将有用的字符串转换成长整型赋给变量
       int  R  =  (longTemp  &  0xFF0000 ) >> 16 ;    //先取出表示颜色分量R,移位得到真实的颜色分量值
    
int  G =  (longTemp  &  0x00FF00 ) >> 8 ;
    
int  B  =   longTemp  &  0x0000FF;
        m_r.Format("%d",R);
        m_g.Format("%d",G);
        m_b.Format("%d",B);


    m_rgb.Format(
" RGB(%d,%d,%d) " ,R,G,B);
    UpdateData(
FALSE );
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值