設定列表控制元件(ListCtrl)各種顏色

鄧學彬發表於2013-01-07

原始碼下載:ListCtrlColor.Zip

公開介面:

//設定奇數行背景顏色
void SetOddItemBkColor(COLORREF color,BOOL bDraw);
//設定偶數行背景顏色
void SetEvenItemBkColor(COLORREF color,BOOL bDraw);
//設定熱點行背景顏色
void SetHoverItemBkColor(COLORREF color,BOOL bDraw);
//設定選中行背景顏色
void SetSelectItemBkColor(COLORREF color,BOOL bDraw);
//設定奇數行文字顏色
void SetOddItemTextColor(COLORREF color,BOOL bDraw);
//設定偶數行文字顏色
void SetEvenItemTextColor(COLORREF color,BOOL bDraw);
//設定熱點行文字顏色
void SetHoverItemTextColor(COLORREF color,BOOL bDraw);
//設定選中行文字顏色
void SetSelectItemTextColor(COLORREF color,BOOL bDraw);
實現原始碼:

// MyListCtrl.cpp : 實現檔案

IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)

CMyListCtrl::CMyListCtrl()
{
	m_OddItemBkColor=0xFEF1E3;//奇數行背景顏色
	m_EvenItemBkColor=0xFFFFFF;//偶數行背景顏色
	m_HoverItemBkColor=0xFF;//熱點行背景顏色
	m_SelectItemBkColor=GetSysColor(COLOR_HIGHLIGHT);//選中行背景顏色
	m_OddItemTextColor=GetSysColor(COLOR_BTNTEXT);//奇數行文字顏色
	m_EvenItemTextColor=GetSysColor(COLOR_BTNTEXT);//偶數行文字顏色
	m_HoverItemTextColor=GetSysColor(COLOR_HIGHLIGHTTEXT);//熱點行文字顏色
	m_SelectItemTextColor=GetSysColor(COLOR_BTNTEXT);//選中行文字顏色
	m_nHoverIndex=-1;
	m_bTracking=FALSE;
}

CMyListCtrl::~CMyListCtrl()
{
}


BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
	ON_WM_MOUSEMOVE()
	ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnNMCustomdraw)
END_MESSAGE_MAP()



// CMyListCtrl 訊息處理程式


void CMyListCtrl::SetOddItemBkColor(COLORREF color,BOOL bDraw)//設定奇數行背景顏色
{
	m_OddItemBkColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetEvenItemBkColor(COLORREF color,BOOL bDraw)//設定偶數行背景顏色
{
	m_EvenItemBkColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetHoverItemBkColor(COLORREF color,BOOL bDraw)//設定熱點行背景顏色
{
	m_HoverItemBkColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetSelectItemBkColor(COLORREF color,BOOL bDraw)//設定選中行背景顏色
{
	m_SelectItemBkColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetOddItemTextColor(COLORREF color,BOOL bDraw)//設定奇數行文字顏色
{
	m_OddItemTextColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetEvenItemTextColor(COLORREF color,BOOL bDraw)//設定偶數行文字顏色
{
	m_EvenItemTextColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetHoverItemTextColor(COLORREF color,BOOL bDraw)//設定熱點行文字顏色
{
	m_HoverItemTextColor=color;
	if(bDraw)InvalidateRect(NULL);
}
void CMyListCtrl::SetSelectItemTextColor(COLORREF color,BOOL bDraw)//設定選中行文字顏色
{
	m_SelectItemTextColor=color;
	if(bDraw)InvalidateRect(NULL);
}


void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
	int nIndex=HitTest(point);
	if(nIndex!=m_nHoverIndex){
		int nOldIndex=m_nHoverIndex;
		m_nHoverIndex=nIndex;
		CRect rc;
		if(nOldIndex!=-1){
			GetItemRect(nOldIndex,&rc,LVIR_BOUNDS);
			InvalidateRect(&rc);
		}		
		if(m_nHoverIndex!=-1){
			GetItemRect(m_nHoverIndex,&rc,LVIR_BOUNDS);
			InvalidateRect(&rc);
		}
	}
	//=====================================================
	if(!m_bTracking) 
	{ 
		TRACKMOUSEEVENT   tme; 
		tme.cbSize   =   sizeof(tme); 
		tme.hwndTrack   =   m_hWnd; 
		tme.dwFlags   =   TME_LEAVE;//   |   TME_HOVER; 
		tme.dwHoverTime   =   1; 
		m_bTracking   =   _TrackMouseEvent(&tme); 
	} 
	CListCtrl::OnMouseMove(nFlags, point);
}
LRESULT CMyListCtrl::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
	m_bTracking=FALSE;
	
	if(m_nHoverIndex!=-1){
		CRect rc;
		GetItemRect(m_nHoverIndex,&rc,LVIR_BOUNDS);
		m_nHoverIndex=-1;
		InvalidateRect(&rc);
	}
	return 0;
}
void CMyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
	*pResult = 0;
	int nItemIndex=pNMCD->nmcd.dwItemSpec;
	if (pNMCD->nmcd.dwDrawStage==CDDS_PREPAINT){
		*pResult = CDRF_NOTIFYITEMDRAW;
	}else{
		if(nItemIndex==m_nHoverIndex){ //熱點行
			pNMCD->clrTextBk=m_HoverItemBkColor;
			pNMCD->clrText=m_HoverItemTextColor;
		}else if(GetItemState(nItemIndex,LVIS_SELECTED) == LVIS_SELECTED){ //選中行
			pNMCD->clrTextBk=m_SelectItemBkColor;
			pNMCD->clrText=pNMCD->clrFace=m_SelectItemTextColor;
			::SetTextColor(pNMCD->nmcd.hdc,m_SelectItemTextColor);
		}else if(nItemIndex % 2==0){//偶數行 比如 0、2、4、6
			pNMCD->clrTextBk=m_EvenItemBkColor;
			pNMCD->clrText=m_EvenItemTextColor;
		}else{	//奇數行 比如 1、3、5、7
			pNMCD->clrTextBk=m_OddItemBkColor;
			pNMCD->clrText=m_OddItemTextColor;
		}
		*pResult = CDRF_NEWFONT;
	}
}


原始碼下載:ListCtrlColor.Zip


相關文章