资源简介

一个自绘的CListCtrlEx列表控件类,可以支持: (1)设置奇数行背景颜色(默认白色) (2)设置偶数行背景颜色(默认白色) (3)设置热点行背景颜色(默认白色) (4)设置选中行背景颜色(默认蓝色) (5)设置奇数行文本颜色(默认黑色) (6)设置偶数行文本颜色(默认黑色) (7)设置热点行文本颜色(默认黑色) (8)设置选中行文本颜色(默认黑色) (9)点击列表头,对列表内的数据进行升序/降序排列 (10)双缓冲,解决了闪烁的问题

资源截图

代码片段和文件信息

// ListCtrlEx.cpp : 实现文件
//

#include “stdafx.h“
#include “ListCtrlEx.h“


// CListCtrlEx
IMPLEMENT_DYNAMIC(CListCtrlEx CListCtrl)

/**
 * 构造函数
 */
CListCtrlEx::CListCtrlEx()
{
m_hoverIndex = -1; // 当前热点项目索引
m_mouseTrack = true; // 追踪鼠标移动事件
m_if_hotLine = false; // 默认不开启热点行更换颜色
m_oddItemBkColor = 0xFFFFFF; // 奇数行背景颜色(默认白色)
m_evenItemBkColor = 0xFFFFFF; // 偶数行背景颜色(默认白色)
m_hoverItemBkColor = 0xFFFFFF; // 热点行背景颜色(默认白色)
m_selectItemBkColor = GetSysColor(COLOR_HIGHLIGHT); // 选中行背景颜色(默认蓝色)
m_oddItemTextColor = GetSysColor(COLOR_BTNTEXT); // 奇数行文本颜色(默认黑色)
m_evenItemTextColor = GetSysColor(COLOR_BTNTEXT); // 偶数行文本颜色(默认黑色)
m_hoverItemTextColor = GetSysColor(COLOR_BTNTEXT); // 热点行文本颜色(默认黑色)
m_selectItemTextColor = GetSysColor(COLOR_BTNTEXT); // 选中行文本颜色(默认黑色)
}


/**
 * 析构函数
 */
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()


/**
 * 排序回调函数
 */
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);
}


/**
 * 鼠标在控件区域上移动时
 */
void CListCtrlEx::onmousemove(UINT nFlags CPoint point)
{
if(m_if_hotLine == true) {
// 获取鼠标当前在哪一行上
int newIndex; // 当前鼠标的一行
int oldIndex; // 记录原来的一行(也就是离开前的那一行)

newIndex = HitTest(point);
if(newIndex != m_hoverIndex) {
CRect rc;
oldIndex = m_hoverIndex;
m_hoverIndex = newIndex;

// 刷新离开后的那一块区域
if(oldIndex != -1) {
GetItemRect(oldIndex &rc LVIR_BOUNDS);
InvalidateRect(&rc);
}
// 刷新来到新的一块的区域
if(m_hoverIndex != -1) {
GetItemRect(m_hoverIndex &rc LVIR_BOUNDS);
InvalidateRect(&rc);
}
}

// 鼠标要追踪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; // 若已经追踪,则停止追踪 
}
}

CListCtrl::onmousemove(nFlags point);
}


/**
 * 鼠标离开控件区域时
 */
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


评论

共有 条评论