实现彩色图片到单色位图转换的方法是先获取CMyListCtrl的ImageList 并提取ListCtrl中
的Item 对应的图像后,用代码转换成单色位图并在原位置显示。转换过程如下:
CImageList* pImageList=NULL;
pImageList = GetImageList(LVSIL_SMALL);
if(pImageList !=NULL)
{
HICON hIcon=NULL;
hIcon = pImageList->ExtractIcon(nItem);
HBITMAP hbitmap,hBitmapMask;
ICONINFO* iconinfo = new ICONINFO;
if(::GetIconInfo(hIcon, iconinfo))
{
hbitmap = iconinfo->hbmColor;
hBitmapMask = iconinfo->hbmMask;
if (!(nStyle & TVS_ONLINEUSER))
//hbitmap = BitmapColorToGray(m_hDll,&memDC,hbitmap);
hbitmap = (HBITMAP) CopyImage(hbitmap, IMAGE_BITMAP,0, 0,LR_COPYDELETEORG|LR_MONOCHROME);
DrawBitmap(m_hDll, &memDC,hbitmap,rcIcon);
DeleteObject(hbitmap);
DeleteObject(hBitmapMask);
}
delete iconinfo;
::DestroyIcon(hIcon);
}
实现彩色图片到单色位图转换的语句为:hbitmap = (HBITMAP) CopyImage(hbitmap, IMAGE_BITMAP,0, 0,LR_COPYDELETEORG|LR_MONOCHROME);
写了一个实现彩色图片到单色位图转换算法,其代码如下:
//这是本人写的一个转换算法。效果好,但运行时间稍长
HBITMAP BitmapColorToGray(CDC* pDC,HBITMAP hBitmap)
{
BITMAP bmpInfo;
::GetObject(hBitmap,sizeof(BITMAP),&bmpInfo);
if(pDC)
{
CDC memDC;
if( !memDC.CreateCompatibleDC(pDC) )
{
return NULL;
}
HBITMAP oldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
DWORD r,g,b;
for (int H =0; H <= bmpInfo.bmHeight; H++)
{
for(int W = 0; W <= bmpInfo.bmWidth; W ++)
{
r = GetRValue(memDC.GetPixel(W,H));
g = GetGValue(memDC.GetPixel(W,H));
b = GetBValue(memDC.GetPixel(W,H));
r = (r * 3 + g * 6 + g) / 10;
g = r;
b = g;
memDC.SetPixel(CPoint(W,H),RGB(r,g,b));
}
}
hBitmap = (HBITMAP)memDC.SelectObject(oldBitmap);
memDC.DeleteDC();
}
return hBitmap;
}