颜色映射
来源:互联网 发布:Linux启weblogic 编辑:程序博客网 时间:2024/04/23 20:43
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
- 颜色映射
- 5.6 图像颜色映射
- vtk颜色映射
- python colormap(颜色映射)
- matlab颜色映射colormap() pcolor()
- VTK 曲面构建+颜色映射
- RGB颜色和数值的映射关系
- VTK入门(二)--颜色映射
- VTK lookuptable创建颜色映射表
- VTK图形处理之颜色映射
- Opencv映射到HSV颜色空间
- POJ 1046(颜色映射 简单数学) 解题报告
- 映射
- 映射
- 映射
- 映射
- 映射
- 映射
- 4.文档空间:下表这些标记控制文本块显示的空间位置
- i can say ABC(2006-7-18)
- 现在完成时
- 安裝Eclipse SVN Plugin
- 流程发送动作
- 颜色映射
- [转bbs]师大女生VS川大女生
- XMLBEANS 2.0 —— 一位JAVA开发人员的视点
- 北京租房实用攻略
- 带着审视的目光 回顾STL的使用
- 《实用多媒体技术》课程标准
- 面试的技巧
- C#中的委托(Delegate)
- 人脉炼金术