网站首页

家园论坛

老版论坛

家园博客

业界新闻

技术文档

下载中心

速查中心

图片中心

硬件资讯
上一篇:让你的软件界面更漂亮(四) 下一篇:让你的软件界面更漂亮(五)
让你的软件界面更漂亮(六)

来源: 作者: 添加日期:2007-10-31 15:13:45 点击次数:

QQ软件主界面的ListCtrl 是可以说非常经典了,一个字漂亮! 这个ListCtrl的所包含的信息之丰富,更是让我们这些软件工程师望Q兴叹! 今天,我将和大家一起来写一个属于自已的CMyListCtrl。

一、实现CMyListCtrl要完成的任务及实现方法分析。

1.MyListCtrl 显示彩色图片头像(在线用户头)

让CMyListCtrl 显示彩色图片作为头像很容易,用CImageList 加载规格相同的图片到其中,然后让CimageList和CMyListCtrl关联就可实现, 向ImageList 添加图片或图标的三种方法代码总结如下:

CImageList m_imageList;

m_imagelist.Create(40, 40, ILC_MASK|ILC_COLOR32, 1, 1);

//添加ID 为IDI_ICON的图标

m_imageList.Add( AfxGetApp()->LoadIcon(IDI_ICON));

//从图标文件中加载并添加

HICON hIcon = (HICON)LoadImage(NULL, ".\\image\\SQQun.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE)

m_imagelist.Add(hIcon);

//从位图文件中加载并添加

CBitmap *pBitmap=new CBitmap;

pbitmap ->m_hObject = (HBITMAP) LoadImage(NULL, "face.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_imagelist.Add(pBitmap, RGB(255,255, 255)/*mask color*/);

…

Delete pBitmap;

把 CMyListCtrl 和CimageList 关联并向ListCtrl 添加用户代码

//先创建ListCtrl (m_MyFriendListCtrl)

if(m_MyFriendListCtrl.Create(LVS_SMALLICON | WS_TABSTOP|WS_CHILD, 
                   CRect(50,100,206,180), this, IDD_TALKER_LIST/*ID*/))                                                       
{
          //关联

         m_MyFriendListCtrl.SetImageList(&m_imagelistBig,LVSIL_SMALL);
         m_MyFriendListCtrl.SetBackBitmap(_T(".\\image\\mainFrame-centerMid.bmp"));

        //往ListCtrl 中添加好友

         for(int i=0; i<10; i++)
        {
             CString strTemp;
             strTemp.Format("我的好友%d",i);

             LUSERITEM userInfo;

             userInfo.szUserID = strTemp.GetBuffer(strTemp.GetLength());
             strTemp.ReleaseBuffer();
             userInfo.szNoticeMsg = _T("天不怕!地不怕!");
             m_MyFriendListCtrl.InsertItem(i,strTemp, i,&userInfo);//第三个参数 Index of the ImageList
             m_MyFriendListCtrl.SetItemData(i,(i%2)? i|0x00000020:i);
         }

         m_MyFriendListCtrl.ShowWindow(SW_SHOW);
}

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

本新闻共3页,当前在第1页  1  2  3  

 
设为首页 | 加入收藏 | 业务办理 | 友情链接 | 论坛版面 | 浙ICP备07502118号 |