資源簡介
一個自繪的CListCtrlEx列表控件類,可以支持:
(1)設(shè)置奇數(shù)行背景顏色(默認(rèn)白色)
(2)設(shè)置偶數(shù)行背景顏色(默認(rèn)白色)
(3)設(shè)置熱點(diǎn)行背景顏色(默認(rèn)白色)
(4)設(shè)置選中行背景顏色(默認(rèn)藍(lán)色)
(5)設(shè)置奇數(shù)行文本顏色(默認(rèn)黑色)
(6)設(shè)置偶數(shù)行文本顏色(默認(rèn)黑色)
(7)設(shè)置熱點(diǎn)行文本顏色(默認(rèn)黑色)
(8)設(shè)置選中行文本顏色(默認(rèn)黑色)
(9)點(diǎn)擊列表頭,對列表內(nèi)的數(shù)據(jù)進(jìn)行升序/降序排列
(10)雙緩沖,解決了閃爍的問題

代碼片段和文件信息
//?ListCtrlEx.cpp?:?實(shí)現(xiàn)文件
//
#include?“stdafx.h“
#include?“ListCtrlEx.h“
//?CListCtrlEx
IMPLEMENT_DYNAMIC(CListCtrlEx?CListCtrl)
/**
?*?構(gòu)造函數(shù)
?*/
CListCtrlEx::CListCtrlEx()
{
m_hoverIndex = -1; //?當(dāng)前熱點(diǎn)項(xiàng)目索引
m_mouseTrack = true; //?追蹤鼠標(biāo)移動事件
m_if_hotLine = false; //?默認(rèn)不開啟熱點(diǎn)行更換顏色
m_oddItemBkColor = 0xFFFFFF; //?奇數(shù)行背景顏色(默認(rèn)白色)
m_evenItemBkColor = 0xFFFFFF; //?偶數(shù)行背景顏色(默認(rèn)白色)
m_hoverItemBkColor = 0xFFFFFF; //?熱點(diǎn)行背景顏色(默認(rèn)白色)
m_selectItemBkColor = GetSysColor(COLOR_HIGHLIGHT); //?選中行背景顏色(默認(rèn)藍(lán)色)
m_oddItemTextColor = GetSysColor(COLOR_BTNTEXT); //?奇數(shù)行文本顏色(默認(rèn)黑色)
m_evenItemTextColor = GetSysColor(COLOR_BTNTEXT); //?偶數(shù)行文本顏色(默認(rèn)黑色)
m_hoverItemTextColor = GetSysColor(COLOR_BTNTEXT); //?熱點(diǎn)行文本顏色(默認(rèn)黑色)
m_selectItemTextColor = GetSysColor(COLOR_BTNTEXT); //?選中行文本顏色(默認(rèn)黑色)
}
/**
?*?析構(gòu)函數(shù)
?*/
CListCtrlEx::~CListCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CListCtrlEx?CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW?&CListCtrlEx::OnNMCustomdraw)
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK?&CListCtrlEx::OnLvnColumnclick)
END_MESSAGE_MAP()
/**
?*?排序回調(diào)函數(shù)
?*/
static?int?CALLBACK?SortFunction(LPARAM?lParam1?LPARAM?lParam2?LPARAM?lParamSort)
{
CString?&lp1?=?*((CString?*)lParam1);
CString?&lp2?=?*((CString?*)lParam2);
int?&sort?=?*(int?*)lParamSort;
if?(sort?==?0)
return?lp1.CompareNoCase(lp2);
else
return?lp2.CompareNoCase(lp1);
}
/**
?*?鼠標(biāo)在控件區(qū)域上移動時
?*/
void?CListCtrlEx::onmousemove(UINT?nFlags?CPoint?point)
{
if(m_if_hotLine?==?true)?{
//?獲取鼠標(biāo)當(dāng)前在哪一行上
int newIndex; //?當(dāng)前鼠標(biāo)的一行
int oldIndex; //?記錄原來的一行(也就是離開前的那一行)
newIndex?=?HitTest(point);
if(newIndex?!=?m_hoverIndex)?{
CRect?rc;
oldIndex?=?m_hoverIndex;
m_hoverIndex?=?newIndex;
//?刷新離開后的那一塊區(qū)域
if(oldIndex?!=?-1)?{
GetItemRect(oldIndex?&rc?LVIR_BOUNDS);
InvalidateRect(&rc);
}
//?刷新來到新的一塊的區(qū)域
if(m_hoverIndex?!=?-1)?{
GetItemRect(m_hoverIndex?&rc?LVIR_BOUNDS);
InvalidateRect(&rc);
}
}
//?鼠標(biāo)要追蹤WM_MOUSELEAVE事件
if?(m_mouseTrack)?{
TRACKMOUSEEVENT?csTME;
csTME.cbSize?=?sizeof(csTME);
csTME.dwFlags?=?TME_LEAVE; //?指定要追蹤的事件
csTME.hwndTrack?=?m_hWnd; //?指定要追蹤的窗口?
::_TrackMouseEvent(&csTME); //?開啟Windows的WM_MOUSELEAVE事件支持
m_mouseTrack?=?false; //?若已經(jīng)追蹤,則停止追蹤?
}
}
CListCtrl::onmousemove(nFlags?point);
}
/**
?*?鼠標(biāo)離開控件區(qū)域時
?*/
void?CListCtrlEx::onmouseleave()
{
if(m_if_hotLine?==?true)?{
//?開始追蹤
m_mouseTrack?=?true;
if(m_hoverIndex?!=?-1)?{
CRect?rc;
GetItemRect(m_hoverIndex&rcLVIR_BOUNDS);
InvalidateRect(&rc);
m_hoverIndex?=?-1;
m_mouseTrack?=?true;
}
}
CListCtrl::onmouseleave();
}
/**
?*?擦除背景
?*/
BOOL?CListCtrlEx::OnEraseBkgnd(CDC*?pDC)
{
return?FALSE;
}
/**
?*?繪畫
?*/
void?CListCtrlEx::OnPaint()
{
CPai
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7673??2014-05-03?20:20??ListCtrlEx\ListCtrlEx.cpp
?????文件???????1449??2014-05-03?14:04??ListCtrlEx\ListCtrlEx.h
?????目錄??????????0??2014-05-03?20:34??ListCtrlEx
-----------?---------??----------?-----??----
?????????????????9122????????????????????3
評論
共有 條評論