射颜:颜色映射 2024-04-17 18:38:26 0 0 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)