颜色映射

    GDI进行绘图的时候,需要根据用户的设置更改客户区位图的颜色。这时候可有几种选择。
选择:用ExFloodFill或FloodFill函数填充对应一个颜色或者指定边界颜色,在边界内填充。
这种做法有一个缺点,就是必须指定填充的坐标点。就像资源编辑器绘制位图的Fill工具。如
果你需要填充的区域不是连续的,那么需要调用两次ExFloodFill,而且ExFloodFill的效率比较
低。如果在客户区需要填充很多的图片,这时候要是OnDraw的话,效果惨不忍睹。所以这种方
法可以用在图片不是很多,位图不是很复杂的情况下。
   还有一种方法就是颜色映射。把位图中的某一颜色映射成另一颜色,再用MemoryDC显示出来。由于这种方法先
把图像在内存中绘制好然后再显示出来,所以效率很高。下面就演示一下过程:
  由于时间有限,还是贴出代码。
  
 .
 .
 .
 //颜色映射
 COLORMAP mapRed;                                          //颜色映射对象
 mapRed.from = RGB(0,255,255);                      //原始颜色
 mapRed.to = CAlertCell::GetColorAlarm2();    /*映射颜色,GetColorAlarm2()是我的一个自定义函数
                                                                                     返回一个COLORREF对象。*/
 COLORMAP mapGreen;                                      //第二个映射对象
 mapGreen.from = RGB(0,255,255);
 mapGreen.to = CAlertCell::GetColorNormal();
 COLORMAP mapYellow;                                     //第三个映射对象
 mapYellow.from = RGB(0,255,255);
 mapYellow.to = CAlertCell::GetColorAlarm1();
 //End

 //创建红色位图
 CBitmap bmpRed;
 bmpRed.LoadMappedBitmap(IDB_BUBBLE,0,&mapRed,1); 
 CDC memDC_Red;
 memDC_Red.CreateCompatibleDC(pDC);
 CBitmap* pOldBM_Red = memDC_Red.SelectObject(&bmpRed);

 //创建绿色位图
 CBitmap bmpGreen;
 bmpGreen.LoadMappedBitmap(IDB_BUBBLE,0,&mapGreen,1);
 CDC memDC_Green;
 memDC_Green.CreateCompatibleDC(pDC);
 CBitmap* pOldBM_Green = memDC_Green.SelectObject(&bmpGreen);
 
 //创建黄色位图
 CBitmap bmpYellow;
 bmpYellow.LoadMappedBitmap(IDB_BUBBLE,0,&mapYellow,1);
 CDC memDC_Yellow;
 memDC_Yellow.CreateCompatibleDC(pDC);
 CBitmap* pOldBM_Yellow = memDC_Yellow.SelectObject(&bmpYellow);
 
 COLORREF cColor;
 CDC* pMemDC;
 switch(Check())
 {
 case 0:
  cColor = CAlertCell::GetColorNormal();
  pMemDC = &memDC_Green;
  break;
 case 1:
  cColor = CAlertCell::GetColorAlarm1();
  pMemDC = &memDC_Yellow;
  break;
 default:
  cColor = CAlertCell::GetColorAlarm2();
  pMemDC = &memDC_Red;
  break;
 }

 pDC->StretchBlt(m_coordinate_x + m_dimension_cWidth / 8, //坐标X
         m_coordinate_y + m_dimension_cHeight / 8,                      //坐标Y
         (int)(32 * m_dimension_scale),                                              //目标图像宽,m_dimension_scale是缩放比例,
                                                                                                                //跟据客户区的大小改变缩放比例
         (int)(32 * m_dimension_scale),                                              //目标图像高
         pMemDC,                                                                                     //内存上下文对象
         0,                                                                                                    //源图像的左上角X坐标
         0,                                                                                                    //源图像的左上角Y坐标
         32,                                                                                                  //源图像的宽
         32,                                                                                                  //源图像的高
         SRCCOPY);                                                                                 //Flag标记。代表把源图像复制到目标位置
 .
 .
 .
 .
 补充:要映射颜色就需要知道源位图的颜色。VC本来并不支持,虽然红绿蓝黄可能大家都知道。但要是想准确
 确定屏幕某一区域颜色的RGB值,就得借助工具了。我向大家推荐一个小工具《好色鬼》^^.
 http://www.superlyrics.net/lrc/download/sp_soft_color.htm
 把好色鬼窗口的的色框拖拽到屏幕的区域上,就可显示出颜色的RGB值了。
 
 还有一个必须要注意的是要颜色映射的位图资源一定要是16才行。不然你映射成什么依然没有反应。
 以上是个人的一点经验。如过你有什么意见请让我知道。mailto:albert.undead@gmail.com 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值