WEB开发网
开发学院软件开发VC 让你的软件界面更漂亮(六)仿QQ主界面之ListCtrl 阅读

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

 2008-01-19 20:25:25 来源:WEB开发网   
核心提示:2.让CMyListCtrl 显示灰色图片头像(非在线用户)显示灰色图片的方法可用图像处理软件处理成单色位图文件后使用,也可用软件代码实现转换,让你的软件界面更漂亮(六)仿QQ主界面之ListCtrl(2),前者的方法处理位图文件个数不多是还行,否则就显得麻烦了,转换过程如下:CImageList* pImageLis

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;     
}

上一页  1 2 3 4  下一页

Tags:软件 界面 漂亮

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接