让你的软件界面更漂亮(六)-- 仿QQ主界面之ListCtrl

http://tech.ddvip.com   2007年12月30日    社区交流

本文详细介绍让你的软件界面更漂亮(六)-- 仿QQ主界面之ListCtrl

  显示灰色图片的方法可用图像处理软件处理成单色位图文件后使用,也可用软件代码实现转换,前者的方法处理位图文件个数不多是还行,否则就显得麻烦了,其优点运行速度快。用软件代码转换的方法也是可行的,象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 、视频可用 ,手机短消息等用户信息)

来源:vckbase    作者:朱一松    责编:豆豆技术应用

正在加载评论...