⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mylistctrl.cpp

📁 QQ风格LISTCTRL QQ风格LISTCTRL QQ风格LISTCTRL
💻 CPP
字号:
// MyListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "MyListCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl

CMyListCtrl::CMyListCtrl()
{
	m_pFont=new CFont();
	m_pFont->CreatePointFont(90,_T("Arial"));
	m_bOverImage = FALSE;
	m_bOverVedio = FALSE;
	m_bOverMobile = FALSE;
	m_hTailIconA = NULL;
	m_hTailIconB = NULL;
	m_hTailIconC = NULL;
	m_hBackBitmap = NULL;
	m_hDll = AfxLoadLibrary(".\\sqDll\\GeneralTools.dll");

}

CMyListCtrl::~CMyListCtrl()
{
	delete m_pFont;
	if(m_hTailIconA)
		::DestroyIcon(m_hTailIconA);
	if(m_hTailIconB)
		::DestroyIcon(m_hTailIconB);
	if(m_hTailIconC)
		::DestroyIcon(m_hTailIconC);
	if(m_hBackBitmap)
		DeleteObject(m_hBackBitmap);
	if(m_hDll)
		AfxFreeLibrary(m_hDll);

}


BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CMyListCtrl)
	ON_WM_PAINT()
	ON_WM_DRAWITEM()
	ON_WM_MOUSEMOVE()
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
	ON_WM_ERASEBKGND()
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl message handlers
void CMyListCtrl::OnPaint()
{
	CPaintDC dc(this);

	CRect rcClip, rcClient;
	dc.GetClipBox( &rcClip );
	GetClientRect(&rcClient);
	// Create a compatible memory DC 
	CDC memDC;
	if(!memDC.CreateCompatibleDC( &dc ))
		return;
	// Select a compatible bitmap into the memory DC
	CBitmap bitmap, bmpImage;
	if(!bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height()))
	{
		memDC.DeleteDC();
		return;
	}
	CBitmap *OldBitmap = memDC.SelectObject(&bitmap );
	memDC.BitBlt(rcClient.left,rcClient.top,rcClient.Width(), rcClient.Height(),&dc,rcClient.left,rcClient.top,SRCCOPY);

	// First let the control do its default drawing.
	//CListCtrl::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
	
	if( m_hBackBitmap )
	{
		DrawBitmap(m_hDll,&memDC,m_hBackBitmap,rcClient);
	}

	//DrawItem here
	int nItemCount  = GetItemCount();
	int nItem = 0;
	CRect rcItem,rcText,rcIcon;	

	POINT pt;
	GetCursorPos(&pt);
	ScreenToClient(&pt);

	while ((nItem < nItemCount) && (nItem >=0))
	{
		GetItemRect(nItem,rcItem, LVIR_BOUNDS);	//get Rectangle of the icon and Lable
		GetItemRect(nItem,rcText, LVIR_LABEL);
		GetItemRect(nItem,rcIcon, LVIR_ICON);

		//对非在线用户的图像进单色处理
		DWORD nStyle = GetItemData(nItem);
		//if (!(nStyle & TVS_ONLINEUSER))
		//{
			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);
				
			}
		//}
		//对图像进行加边框处理
		CBrush *pOldBrush = (CBrush*) memDC.SelectStockObject(NULL_BRUSH);

		CPen imagePen;
		if(rcIcon.PtInRect(pt))
		{
			imagePen.CreatePen(PS_SOLID, 2, RGB(192, 192, 200));

		}
		else
		{
			imagePen.CreatePen(PS_SOLID, 1, RGB(0, 0, 200));
		}

		CPen* pOldPen = memDC.SelectObject(&imagePen);
		CRect rcImage(rcIcon);
		rcImage.DeflateRect(1,1);
		memDC.RoundRect(rcIcon,CPoint(10,10));

		memDC.SelectObject(pOldPen);
		memDC.SelectObject(pOldBrush);
		imagePen.DeleteObject();

		//文本输出
		CRect rcNewText(rcText);
		CString strText = GetItemText(nItem,0);
		CSize size = memDC.GetTextExtent(strText);
		rcNewText.top = rcNewText.top-2;
		rcNewText.right = rcNewText.right +3;
		if(!m_hBackBitmap)
			memDC.BitBlt(rcNewText.left,rcNewText.top,rcNewText.Width()+2,rcNewText.Height()+2,&dc,rcNewText.left,rcNewText.top,SRCCOPY);
		
		if(rcItem.PtInRect(pt))
		{
			memDC.SetTextColor(RGB(0,0,255));
		}
		else
		{
			memDC.SetTextColor(RGB(0,0,0));
		}
		memDC.SetBkMode(TRANSPARENT);
		memDC.SelectObject(m_pFont);
		rcNewText.OffsetRect(3,0);
		memDC.DrawText(strText,rcNewText,DT_SINGLELINE|DT_LEFT|DT_END_ELLIPSIS);
		
		LUSERITEM userInfo;
		GetUserItemInfo(strText,&userInfo);
		if(userInfo.szUserID !="")
		{
			strText = userInfo.szNoticeMsg;

			rcNewText.top = rcNewText.top + size.cy + 2;
			rcNewText.right = rcClient.right -10;
			if(rcNewText.PtInRect(pt))
			{
				memDC.SetTextColor(RGB(10,255,10));
			}
			else
			{
				memDC.SetTextColor(GetSysColor(COLOR_BTNSHADOW));
			}
			memDC.DrawText(strText,rcNewText,DT_SINGLELINE|DT_LEFT|DT_END_ELLIPSIS);
		}

		//Draw Vedio and Mobile ICON
		CRect rcVideo(rcText);
		rcVideo.left = rcClient.right - 20;
		rcVideo.right = rcVideo.left +14;
		rcVideo.top = rcVideo.top + 2;
		rcVideo.bottom  = rcVideo.top + 14;
		if ( (nStyle & TVS_VIDEO) && (m_hTailIconA !=NULL) )
		{		
				if(!m_hBackBitmap)
					memDC.FillSolidRect(rcVideo,RGB(255,255,255));

				::DrawIconEx(memDC,rcVideo.left,rcVideo.top,m_hTailIconA,
						12,12,0,NULL,DI_NORMAL);

				if( rcVideo.PtInRect(pt) )
				{

					memDC.Draw3dRect(rcVideo,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
					m_bOverVedio =TRUE;

				}
				else
				{
					m_bOverVedio =FALSE;
					

				}

		}

		CRect rcMobile(rcVideo);
		rcMobile.OffsetRect(-16,0);
		if ( (nStyle & TVS_MOBILEMSG) && (m_hTailIconB !=NULL) )
		{
				if(!m_hBackBitmap)
					memDC.FillSolidRect(rcMobile,RGB(255,255,255));

				::DrawIconEx(memDC,rcMobile.left+1,rcMobile.top+1,m_hTailIconB,
						12,12,0,NULL,DI_NORMAL);
				if( rcMobile.PtInRect(pt) )
				{

					memDC.Draw3dRect(rcMobile,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
					m_bOverMobile =TRUE;

				}
				else
				{
					m_bOverMobile =FALSE;
				}

		}


		///////////////
		nItem = GetNextItem(nItem,LVNI_ALL);
	}
	//DrawItem end
	dc.BitBlt(	rcClip.left, rcClip.top, 
				rcClient.Width(), 
				rcClient.Height(), 
				&memDC, 
				rcClip.left, rcClip.top, SRCCOPY );

	//memDC.SelectObject(OldBitmap);
	bitmap.DeleteObject();
	memDC.DeleteDC();
}
void CMyListCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	// TODO: Add your message handler code here and/or call default
	
	CListCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	Invalidate(FALSE);
	CListCtrl::OnMouseMove(nFlags, point);
}

void CMyListCtrl::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	ModifyStyle(0, BS_OWNERDRAW);	
	CListCtrl::PreSubclassWindow();
}

void CMyListCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct)
{

}
int CMyListCtrl::InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex, LUSERITEM* UserInfo)
{
	DEQUELVITEM* pDeqListItem = &m_DequeList;
	if(UserInfo)
		pDeqListItem ->push_back(*UserInfo);
	nItem = CListCtrl::InsertItem(nItem,szItemText,nImageIndex);
	return nItem;

}
void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
	NMTVCUSTOMDRAW*	pListHDR = (NMTVCUSTOMDRAW*)pNMHDR;
	DWORD	dwDrawStage;

	*pResult = CDRF_DODEFAULT;

	dwDrawStage = pListHDR->nmcd.dwDrawStage;

	if(dwDrawStage == CDDS_PREPAINT)
	{

		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	else if(dwDrawStage == CDDS_ITEMPREPAINT)
	{
	}
}
BOOL CMyListCtrl::GetUserItemInfo(LPCTSTR szItemText,LUSERITEM* userInfo)
{
	ASSERT(userInfo !=NULL);

	BOOL bRet = FALSE;
	DEQUELVITEM* pDeqListItem = &m_DequeList;

	DEQUELVITEM::iterator it,itbegin = pDeqListItem->begin(),itend = pDeqListItem->end();
	for ( it = itbegin; it != itend; it++ )
	{
		if( it->szUserID == szItemText)
		{
			*userInfo = (LUSERITEM)*it;	//复制结构数据到userInof;
			bRet = TRUE;
			break;
		}
	}
	return bRet;

}

void CMyListCtrl::SetTailIcon(LPCTSTR strIconFileA,LPCTSTR strIconFileB,LPCTSTR strIconFileC)
{
	HICON hIcon=NULL;
	hIcon = (HICON)::LoadImage(NULL, strIconFileA, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
	if(hIcon)
	{
		if(m_hTailIconA)
			DeleteObject(m_hTailIconA);
		m_hTailIconA = hIcon;

	}

	hIcon = (HICON)::LoadImage(NULL, strIconFileB, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
	if(hIcon)
	{
		if(m_hTailIconB)
			DeleteObject(m_hTailIconB);
		m_hTailIconB = hIcon;

	}
	hIcon = (HICON)::LoadImage(NULL, strIconFileC, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
	if(hIcon)
	{
		if(m_hTailIconC)
			DeleteObject(m_hTailIconC);
		m_hTailIconC = hIcon;

	}

}

BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return CListCtrl::OnEraseBkgnd(pDC);
}
void CMyListCtrl::SetBackBitmap(LPCTSTR lpszResourceName)
{
	HBITMAP hBmp = (HBITMAP)::LoadImageFile(lpszResourceName);
	if(hBmp)
		m_hBackBitmap = hBmp;
}

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	Invalidate(FALSE);	
	CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CMyListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	Invalidate(FALSE);	
	CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}

BOOL CMyListCtrl::GetClickMobileBtn()
{
	return m_bOverMobile;
}

BOOL CMyListCtrl::GetClickVideoBtn()
{
	return m_bOverVedio;
}

BOOL CMyListCtrl::DeleteUserInfo(CString szText)
{
	BOOL bRet = FALSE;
	LUSERITEM itemInfo;
	DEQUELVITEM* pDeqItem = &m_DequeList;
	int nItemCount = -1;
	DEQUELVITEM::iterator it,itbegin = pDeqItem->begin(),itend = pDeqItem->end();
	for ( it = itbegin; it != itend; it++ )
	{
		nItemCount++;
		if(( it->szUserID == szText)||(it->szUserName == szText))
		{
			if ( nItemCount == ( pDeqItem->size() - 1 ) )
			{
				//如果是最后一个
				pDeqItem->pop_back();
			}
			else if ( nItemCount == 0 )
				//如果是第一个
				pDeqItem->pop_front();
			else
				pDeqItem->erase( pDeqItem->begin() + nItemCount );
			bRet = TRUE;
		}
	}
	return bRet;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -