让你的软件界面更漂亮(六)-- 仿QQ主界面之ListCtrl
2007-12-30 21:37:45 来源:WEB开发网显示灰色图片的方法可用图像处理软件处理成单色位图文件后使用,也可用软件代码实现转换,前者的方法处理位图文件个数不多是还行,否则就显得麻烦了,其优点运行速度快。用软件代码转换的方法也是可行的,象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;
}
3.MyListCtrl 要包含丰富的用户信息(如 ID,NAME 、IP Address 、视频可用 ,手机短消息等用户信息)
更多精彩
赞助商链接