|  | @@ -0,0 +1,497 @@
 | 
	
		
			
				|  |  | +#include "pch.h"
 | 
	
		
			
				|  |  | +#include "NavListCtrl.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef _DEBUG
 | 
	
		
			
				|  |  | +#define new DEBUG_NEW
 | 
	
		
			
				|  |  | +#undef THIS_FILE
 | 
	
		
			
				|  |  | +static char THIS_FILE[] = __FILE__;
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CNavListCtrl::CNavListCtrl()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	m_crHighlight = RGB(254, 242, 205);
 | 
	
		
			
				|  |  | +	m_crHighlightBorder = RGB(233, 175, 0);
 | 
	
		
			
				|  |  | +	m_crHover = RGB(7, 162, 254);
 | 
	
		
			
				|  |  | +	nHoverItem = -1;
 | 
	
		
			
				|  |  | +	nLastHoverItem = -1;
 | 
	
		
			
				|  |  | +	m_bmpItemSelected.LoadImage("Skin\\DefaultTheme\\ItemSelected.bmp");
 | 
	
		
			
				|  |  | +	m_bmpFaceBG.LoadImage("Skin\\DefaultTheme\\FaceBG.bmp");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	m_hTailIconCamera = (HICON)::LoadImage(AfxGetApp()->m_hInstance, "Skin\\DefaultTheme\\icon\\CameraProp.ico", IMAGE_ICON, 14, 14, LR_LOADFROMFILE);
 | 
	
		
			
				|  |  | +	m_hTailIconEmail = (HICON)::LoadImage(AfxGetApp()->m_hInstance, "Skin\\DefaultTheme\\icon\\EmailProp.ico", IMAGE_ICON, 14, 14, LR_LOADFROMFILE);
 | 
	
		
			
				|  |  | +	m_hTailIconMobile = (HICON)::LoadImage(AfxGetApp()->m_hInstance, "Skin\\DefaultTheme\\icon\\MobileProp.ico", IMAGE_ICON, 14, 14, LR_LOADFROMFILE);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CNavListCtrl::~CNavListCtrl()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	if (m_hTailIconCamera)
 | 
	
		
			
				|  |  | +		::DestroyIcon(m_hTailIconCamera);
 | 
	
		
			
				|  |  | +	if (m_hTailIconEmail)
 | 
	
		
			
				|  |  | +		::DestroyIcon(m_hTailIconEmail);
 | 
	
		
			
				|  |  | +	if (m_hTailIconMobile)
 | 
	
		
			
				|  |  | +		::DestroyIcon(m_hTailIconMobile);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +BEGIN_MESSAGE_MAP(CNavListCtrl, CListCtrl)
 | 
	
		
			
				|  |  | +	//{{AFX_MSG_MAP(CNavListCtrl)
 | 
	
		
			
				|  |  | +	ON_WM_NCCALCSIZE()
 | 
	
		
			
				|  |  | +	ON_WM_MOUSEMOVE()
 | 
	
		
			
				|  |  | +	ON_WM_MEASUREITEM_REFLECT()
 | 
	
		
			
				|  |  | +	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
 | 
	
		
			
				|  |  | +	ON_WM_LBUTTONDOWN()
 | 
	
		
			
				|  |  | +	//}}AFX_MSG_MAP
 | 
	
		
			
				|  |  | +	ON_WM_SIZE()
 | 
	
		
			
				|  |  | +	ON_WM_ERASEBKGND()
 | 
	
		
			
				|  |  | +	ON_WM_PAINT()
 | 
	
		
			
				|  |  | +	ON_WM_TIMER()
 | 
	
		
			
				|  |  | +END_MESSAGE_MAP()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/////////////////////////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  | +// CNavListCtrl message handlers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void CNavListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// TODO: Add your message handler code here and/or call default
 | 
	
		
			
				|  |  | +	ShowScrollBar(SB_HORZ, FALSE);
 | 
	
		
			
				|  |  | +	CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void CNavListCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	lpLVCustomDraw->clrText = RGB(58, 25, 255); // white text
 | 
	
		
			
				|  |  | +	//lpLVCustomDraw->clrTextBk = RGB(222,0,0); 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/*
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(lpLVCustomDraw->nmcd.dwDrawStage==CDDS_PREPAINT)
 | 
	
		
			
				|  |  | +		*pResult=CDRF_NOTIFYITEMDRAW;
 | 
	
		
			
				|  |  | +	if(lpLVCustomDraw->nmcd.dwDrawStage==CDDS_ITEMPREPAINT)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		for(int i=0;i<10;i++)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			if(lpLVCustomDraw->nmcd.dwItemSpec==(unsigned)i)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				lpLVCustomDraw->clrText=RGB(255,0,0);
 | 
	
		
			
				|  |  | +				lpLVCustomDraw->clrTextBk=RGB(255,255,0);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	*/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// TODO: 在此添加控件通知处理程序代码
 | 
	
		
			
				|  |  | +	* pResult = 0;
 | 
	
		
			
				|  |  | +	*pResult |= CDRF_NOTIFYPOSTPAINT;
 | 
	
		
			
				|  |  | +	*pResult |= CDRF_NOTIFYITEMDRAW;
 | 
	
		
			
				|  |  | +	*pResult |= CDRF_NOTIFYSUBITEMDRAW;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int CNavListCtrl::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 CNavListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 | 
	
		
			
				|  |  | +	//CRect rcItem(lpDrawItemStruct->rcItem);
 | 
	
		
			
				|  |  | +	int nItem = lpDrawItemStruct->itemID;
 | 
	
		
			
				|  |  | +	CImageList* pImageList;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Save dc state
 | 
	
		
			
				|  |  | +	int nSavedDC = pDC->SaveDC();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Get item image and state info
 | 
	
		
			
				|  |  | +	LV_ITEM lvi;
 | 
	
		
			
				|  |  | +	lvi.mask = LVIF_IMAGE | LVIF_STATE;
 | 
	
		
			
				|  |  | +	lvi.iItem = nItem;
 | 
	
		
			
				|  |  | +	lvi.iSubItem = 0;
 | 
	
		
			
				|  |  | +	lvi.stateMask = 0xFFFF;		// get all state flags
 | 
	
		
			
				|  |  | +	GetItem(&lvi);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Should the item be highlighted
 | 
	
		
			
				|  |  | +	BOOL bHighlight = ((lvi.state & LVIS_DROPHILITED)
 | 
	
		
			
				|  |  | +		|| ((lvi.state & LVIS_SELECTED)
 | 
	
		
			
				|  |  | +			&& ((GetFocus() == this)
 | 
	
		
			
				|  |  | +				|| (GetStyle() & LVS_SHOWSELALWAYS)
 | 
	
		
			
				|  |  | +				)
 | 
	
		
			
				|  |  | +			)
 | 
	
		
			
				|  |  | +		);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Get rectangles for drawing
 | 
	
		
			
				|  |  | +	CRect rcClient;
 | 
	
		
			
				|  |  | +	GetClientRect(&rcClient);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CRect rcBounds, rcLabel, rcIcon;
 | 
	
		
			
				|  |  | +	GetItemRect(nItem, rcBounds, LVIR_BOUNDS);
 | 
	
		
			
				|  |  | +	GetItemRect(nItem, rcLabel, LVIR_LABEL);
 | 
	
		
			
				|  |  | +	GetItemRect(nItem, rcIcon, LVIR_ICON);
 | 
	
		
			
				|  |  | +	CRect rcCol(rcBounds);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	POINT pt;
 | 
	
		
			
				|  |  | +	GetCursorPos(&pt);
 | 
	
		
			
				|  |  | +	ScreenToClient(&pt);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CString sLabel = GetItemText(nItem, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Labels are offset by a certain amount  
 | 
	
		
			
				|  |  | +	// This offset is related to the width of a space character
 | 
	
		
			
				|  |  | +	int offset = pDC->GetTextExtent(_T(" "), 1).cx * 2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CRect rcHighlight;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	int nExt;
 | 
	
		
			
				|  |  | +	switch (m_nHighlight)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +	case 0:
 | 
	
		
			
				|  |  | +		nExt = pDC->GetOutputTextExtent(sLabel).cx + offset;
 | 
	
		
			
				|  |  | +		rcHighlight = rcLabel;
 | 
	
		
			
				|  |  | +		if (rcLabel.left + nExt < rcLabel.right)
 | 
	
		
			
				|  |  | +			rcHighlight.right = rcLabel.left + nExt;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	case 1:
 | 
	
		
			
				|  |  | +		rcHighlight = rcBounds;
 | 
	
		
			
				|  |  | +		rcHighlight.left = rcLabel.left;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	default:
 | 
	
		
			
				|  |  | +		rcHighlight = rcBounds;
 | 
	
		
			
				|  |  | +		rcHighlight.left = rcBounds.left + 1;
 | 
	
		
			
				|  |  | +		rcHighlight.right = rcClient.right - 2;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 画背景
 | 
	
		
			
				|  |  | +	CRect rcIconBG(rcIcon);
 | 
	
		
			
				|  |  | +	rcIconBG.right += 12;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CEnBitmap bmpFaceBG;
 | 
	
		
			
				|  |  | +	if (bHighlight)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		//nItem是当前高亮的项
 | 
	
		
			
				|  |  | +		if (m_bmpItemSelected.m_hObject != NULL)
 | 
	
		
			
				|  |  | +			m_bmpItemSelected.ExtendDraw(pDC, rcHighlight, 20, 10, TRUE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		//画图标背景
 | 
	
		
			
				|  |  | +		if (m_bmpFaceBG.m_hObject != NULL)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			m_bmpFaceBG.DrawImage(bmpFaceBG, 1, 1, 2, 1);
 | 
	
		
			
				|  |  | +			bmpFaceBG.ExtendDraw(pDC, rcIconBG, 20, 10);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	else
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		//if(nHoverItem == nItem)
 | 
	
		
			
				|  |  | +		//	pDC->FillRect(rcHighlight, &CBrush(m_crHover));
 | 
	
		
			
				|  |  | +		//else
 | 
	
		
			
				|  |  | +		pDC->FillRect(rcHighlight, &CBrush(RGB(255, 255, 255)));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		//画图标背景
 | 
	
		
			
				|  |  | +		if (m_bmpFaceBG.m_hObject != NULL)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			m_bmpFaceBG.DrawImage(bmpFaceBG, 2, 1, 2, 1);
 | 
	
		
			
				|  |  | +			bmpFaceBG.ExtendDraw(pDC, rcIconBG, 20, 10);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	// Draw normal and overlay icon
 | 
	
		
			
				|  |  | +	pImageList = GetImageList(LVSIL_SMALL);
 | 
	
		
			
				|  |  | +	if (pImageList)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		UINT nOvlImageMask = lvi.state & LVIS_OVERLAYMASK;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		pImageList->Draw(pDC, lvi.iImage,
 | 
	
		
			
				|  |  | +			CPoint(rcIcon.left + 6, rcIcon.top + 6), ILD_TRANSPARENT | nOvlImageMask);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Draw item label - Column 0
 | 
	
		
			
				|  |  | +	rcLabel.top += 5;
 | 
	
		
			
				|  |  | +	rcLabel.left += offset / 2 + 7;
 | 
	
		
			
				|  |  | +	rcLabel.right -= offset;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pDC->DrawText(sLabel, -1, rcLabel, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP
 | 
	
		
			
				|  |  | +		| DT_END_ELLIPSIS);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	LUSERITEM userInfo;
 | 
	
		
			
				|  |  | +	GetUserItemInfo(sLabel, &userInfo);
 | 
	
		
			
				|  |  | +	CSize size = pDC->GetTextExtent(sLabel);
 | 
	
		
			
				|  |  | +	if (userInfo.szUserID != "")
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		sLabel = userInfo.szNoticeMsg;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		rcLabel.top = rcLabel.top + size.cy + 3;
 | 
	
		
			
				|  |  | +		rcLabel.right = rcClient.right;
 | 
	
		
			
				|  |  | +		//if(rcLabel.PtInRect(pt))
 | 
	
		
			
				|  |  | +		//{
 | 
	
		
			
				|  |  | +		//	pDC->SetTextColor(RGB(10,255,10));
 | 
	
		
			
				|  |  | +		//}
 | 
	
		
			
				|  |  | +		//else
 | 
	
		
			
				|  |  | +		//{
 | 
	
		
			
				|  |  | +		pDC->SetTextColor(GetSysColor(COLOR_BTNSHADOW));
 | 
	
		
			
				|  |  | +		//}
 | 
	
		
			
				|  |  | +		pDC->DrawText(sLabel, rcLabel, DT_SINGLELINE | DT_LEFT | DT_END_ELLIPSIS);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//Draw TailIcon
 | 
	
		
			
				|  |  | +	DWORD nStyle = GetItemData(nItem);
 | 
	
		
			
				|  |  | +	CRect rcCamera = GetTailIconRect(nItem, TVS_CAMERA);
 | 
	
		
			
				|  |  | +	if ((nStyle & TVS_CAMERA) && (m_hTailIconCamera != NULL))
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		if (rcCamera.PtInRect(pt))
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			pDC->FillSolidRect(rcCamera, m_crHighlight);
 | 
	
		
			
				|  |  | +			pDC->Draw3dRect(rcCamera, m_crHighlightBorder, m_crHighlightBorder);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		::DrawIconEx(*pDC, rcCamera.left + 2, rcCamera.top + 2, m_hTailIconCamera, 14, 14, 0, NULL, DI_NORMAL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CRect rcEmail = GetTailIconRect(nItem, TVS_EMAIL);
 | 
	
		
			
				|  |  | +	if ((nStyle & TVS_EMAIL) && (m_hTailIconEmail != NULL))
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		if (rcEmail.PtInRect(pt))
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			pDC->FillSolidRect(rcEmail, m_crHighlight);
 | 
	
		
			
				|  |  | +			pDC->Draw3dRect(rcEmail, m_crHighlightBorder, m_crHighlightBorder);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		::DrawIconEx(*pDC, rcEmail.left + 2, rcEmail.top + 2, m_hTailIconEmail, 14, 14, 0, NULL, DI_NORMAL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CRect rcMobile = GetTailIconRect(nItem, TVS_MOBILE);
 | 
	
		
			
				|  |  | +	if ((nStyle & TVS_MOBILE) && (m_hTailIconMobile != NULL))
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		if (rcMobile.PtInRect(pt))
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			pDC->FillSolidRect(rcMobile, m_crHighlight);
 | 
	
		
			
				|  |  | +			pDC->Draw3dRect(rcMobile, m_crHighlightBorder, m_crHighlightBorder);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		::DrawIconEx(*pDC, rcMobile.left + 2, rcMobile.top + 2, m_hTailIconMobile, 14, 14, 0, NULL, DI_NORMAL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Draw labels for remaining columns
 | 
	
		
			
				|  |  | +	LV_COLUMN lvc;
 | 
	
		
			
				|  |  | +	lvc.mask = LVCF_FMT | LVCF_WIDTH;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (m_nHighlight == 0)		// Highlight only first column
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
 | 
	
		
			
				|  |  | +		pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	rcBounds.right = rcHighlight.right > rcBounds.right ? rcHighlight.right + 10 :
 | 
	
		
			
				|  |  | +		rcBounds.right + 10;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	for (int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		rcCol.left = rcCol.right;
 | 
	
		
			
				|  |  | +		rcCol.right += lvc.cx;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		//Draw the background if needed
 | 
	
		
			
				|  |  | +	   //if( m_nHighlight == HIGHLIGHT_NORMAL )
 | 
	
		
			
				|  |  | +	   //	pDC->FillRect(rcCol, &CBrush(::GetSysColor(COLOR_WINDOW)));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		sLabel = GetItemText(nItem, nColumn);
 | 
	
		
			
				|  |  | +		if (sLabel.GetLength() == 0)
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// Get the text justification
 | 
	
		
			
				|  |  | +		UINT nJustify = DT_LEFT;
 | 
	
		
			
				|  |  | +		switch (lvc.fmt & LVCFMT_JUSTIFYMASK)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +		case LVCFMT_RIGHT:
 | 
	
		
			
				|  |  | +			nJustify = DT_RIGHT;
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case LVCFMT_CENTER:
 | 
	
		
			
				|  |  | +			nJustify = DT_CENTER;
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		default:
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		rcLabel = rcCol;
 | 
	
		
			
				|  |  | +		rcLabel.left += offset;
 | 
	
		
			
				|  |  | +		rcLabel.right -= offset;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		pDC->DrawText(sLabel, -1, rcLabel, nJustify | DT_SINGLELINE |
 | 
	
		
			
				|  |  | +			DT_NOPREFIX | DT_VCENTER | DT_END_ELLIPSIS);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Restore dc
 | 
	
		
			
				|  |  | +	pDC->RestoreDC(nSavedDC);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CRect CNavListCtrl::GetTailIconRect(int nItem, DWORD dwServeFlag)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	CRect rcIcon, rcClient;
 | 
	
		
			
				|  |  | +	GetItemRect(nItem, rcIcon, LVIR_ICON);
 | 
	
		
			
				|  |  | +	GetClientRect(&rcClient);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	DWORD nStyle = GetItemData(nItem);
 | 
	
		
			
				|  |  | +	switch (nStyle & dwServeFlag)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +	case TVS_CAMERA:
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		rcIcon.left = rcClient.right - 22;
 | 
	
		
			
				|  |  | +		rcIcon.right = rcIcon.left + 18;
 | 
	
		
			
				|  |  | +		rcIcon.bottom = rcIcon.top + 18;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	break;
 | 
	
		
			
				|  |  | +	case TVS_EMAIL:
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		rcIcon.left = rcIcon.right + 10;
 | 
	
		
			
				|  |  | +		rcIcon.right = rcIcon.left + 18;
 | 
	
		
			
				|  |  | +		rcIcon.top = rcIcon.bottom - 20;
 | 
	
		
			
				|  |  | +		rcIcon.bottom = rcIcon.top + 18;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	break;
 | 
	
		
			
				|  |  | +	case TVS_MOBILE:
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		rcIcon.left = rcIcon.right + 10;
 | 
	
		
			
				|  |  | +		if (nStyle & TVS_EMAIL)
 | 
	
		
			
				|  |  | +			rcIcon.left += 18;
 | 
	
		
			
				|  |  | +		rcIcon.right = rcIcon.left + 18;
 | 
	
		
			
				|  |  | +		rcIcon.top = rcIcon.bottom - 20;
 | 
	
		
			
				|  |  | +		rcIcon.bottom = rcIcon.top + 18;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	break;
 | 
	
		
			
				|  |  | +	default:
 | 
	
		
			
				|  |  | +		rcIcon.SetRectEmpty();
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return rcIcon;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +BOOL CNavListCtrl::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 CNavListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	int nItem = HitTest(point);
 | 
	
		
			
				|  |  | +	if (nItem != -1)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		CString strTip;
 | 
	
		
			
				|  |  | +		CRect rcServe;
 | 
	
		
			
				|  |  | +		for (DWORD dwFlag = TVS_CAMERA;dwFlag < TVS_ONLINEUSER;dwFlag++)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			rcServe = GetTailIconRect(nItem, dwFlag);
 | 
	
		
			
				|  |  | +			if (rcServe.PtInRect(point))
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				strTip.Format("位置:nItem=%d,dwServeFlag=%#0.8x", nItem, dwFlag);
 | 
	
		
			
				|  |  | +				break;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		if (!strTip.IsEmpty())
 | 
	
		
			
				|  |  | +			MessageBox(strTip);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	CListCtrl::OnLButtonDown(nFlags, point);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//调整行高
 | 
	
		
			
				|  |  | +void CNavListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMis)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	lpMis->itemHeight = 52;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +void CNavListCtrl::OnSize(UINT nType, int cx, int cy)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	CListCtrl::OnSize(nType, cx, cy);
 | 
	
		
			
				|  |  | +	SetColumnWidth(0, cx);
 | 
	
		
			
				|  |  | +	RedrawWindow();
 | 
	
		
			
				|  |  | +	// TODO: 在此处添加消息处理程序代码
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +BOOL CNavListCtrl::OnEraseBkgnd(CDC* pDC)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// TODO: 在此添加消息处理程序代码和/或调用默认值
 | 
	
		
			
				|  |  | +	return TRUE;
 | 
	
		
			
				|  |  | +	//return CListCtrl::OnEraseBkgnd(pDC);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void CNavListCtrl::OnPaint()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	CPaintDC dc(this); // device context for painting
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CRect rcClient;
 | 
	
		
			
				|  |  | +	GetClientRect(&rcClient);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CDC memdc;
 | 
	
		
			
				|  |  | +	memdc.CreateCompatibleDC(&dc);
 | 
	
		
			
				|  |  | +	CBitmap bitmap;
 | 
	
		
			
				|  |  | +	bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
 | 
	
		
			
				|  |  | +	memdc.SelectObject(&bitmap);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	memdc.FillSolidRect(rcClient, RGB(255, 255, 255));
 | 
	
		
			
				|  |  | +	CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &memdc,
 | 
	
		
			
				|  |  | +		0, 0, SRCCOPY);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void CNavListCtrl::OnMouseMove(UINT nFlags, CPoint point)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// TODO: Add your message handler code here and/or call default
 | 
	
		
			
				|  |  | +	nHoverItem = HitTest(point);
 | 
	
		
			
				|  |  | +	if (nLastHoverItem >= 0)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		CRect rcItem;
 | 
	
		
			
				|  |  | +		GetItemRect(nLastHoverItem, rcItem, LVIR_BOUNDS);
 | 
	
		
			
				|  |  | +		InvalidateRect(rcItem);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	nLastHoverItem = nHoverItem;
 | 
	
		
			
				|  |  | +	if (nHoverItem >= 0)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		CRect rcItem;
 | 
	
		
			
				|  |  | +		GetItemRect(nHoverItem, rcItem, LVIR_BOUNDS);
 | 
	
		
			
				|  |  | +		InvalidateRect(rcItem);
 | 
	
		
			
				|  |  | +		//SetTimer(1,100,NULL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	CListCtrl::OnMouseMove(nFlags, point);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void CNavListCtrl::OnTimer(UINT_PTR nIDEvent)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	// TODO: 在此添加消息处理程序代码和/或调用默认值
 | 
	
		
			
				|  |  | +	if (nIDEvent == 1)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		CPoint pt(GetMessagePos()); ScreenToClient(&pt);
 | 
	
		
			
				|  |  | +		CRect rc; GetClientRect(&rc);
 | 
	
		
			
				|  |  | +		if (!rc.PtInRect(pt))
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			nHoverItem = -1;
 | 
	
		
			
				|  |  | +			CRect rcItem;
 | 
	
		
			
				|  |  | +			GetItemRect(nLastHoverItem, rcItem, LVIR_BOUNDS);
 | 
	
		
			
				|  |  | +			InvalidateRect(rcItem);
 | 
	
		
			
				|  |  | +			KillTimer(1);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	CListCtrl::OnTimer(nIDEvent);
 | 
	
		
			
				|  |  | +}
 |