让你的软件界面更漂亮(六)仿QQ主界面之ListCtrl
2008-01-19 20:25:25 来源:WEB开发网2.让CMyListCtrl 显示灰色图片头像(非在线用户)
显示灰色图片的方法可用图像处理软件处理成单色位图文件后使用,也可用软件代码实现转换,前者的方法处理位图文件个数不多是还行,否则就显得麻烦了,其优点运行速度快。用软件代码转换的方法也是可行的,象LoadImage ()或CopyImage()API都可实现,但要占用很多CUP时间。对比两种方法,我选择后者,原因不用说我想大家也清楚。
实现彩色图片到单色位图转换的方法是先获取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;
}
更多精彩
赞助商链接