前段时间,一直用的网上的一个类,数据量一大了以后,界面就显的很卡。网上很多都不合适,就研究了两天(好慢啊,自己太笨了),写了这个类,功能不多,适合新手学习。
MyList.h
///////////////////////////////////////////////////////////////////////////
//CListCtrl类的一个派生类
//该类的几点功能:
//1、可以使用多线程
//2、可以在第一列插入图标
//3、可以改变字体颜色
//说明:用过几个CListCtrl的派生类
//有些类可以使用多线程,但是由于重绘的原因始终加不上图标
//有些类可以加入图标,但由于Windows消息的原因,使用多线程就出错
//由于数据量太多,而且需要大量时间去计算,又不想使用户觉得界面卡,只能用多线程
//于是就综合了一下,写了这个类,功能简单,容易理解。
//由于是第一次写类,还希望大家多多提建议
//by l0g1n-------2012年6月12日 17:44 QQ:519710三91
///////////////////////////////////////////////////////////////////////////
#pragma once
// CMyList
class CMyList : public CListCtrl
{
DECLARE_DYNAMIC(CMyList)
public:
CMyList();
virtual ~CMyList();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
//设置图标图标关联
CImageList* SetImageList(CImageList *pImageList);
//设置图标id
BOOL SetItemImageId(int nItem,int nImageId);
//插入数据,可设置字体颜色
int InsertItem(int nItem,LPCTSTR lpText,COLORREF fontcolor=RGB(0,0,0));
};
MyList.cpp
///////////////////////////////////////////////////////////////////////////
//CListCtrl类的一个派生类
//该类的几点功能:
//1、可以使用多线程
//2、可以在第一列插入图标
//3、可以改变字体颜色
//说明:用过几个CListCtrl的派生类
//有些类可以使用多线程,但是由于重绘的原因始终加不上图标
//有些类可以加入图标,但由于Windows消息的原因,使用多线程就出错
//由于数据量太多,而且需要大量时间去计算,又不想使用户觉得界面卡,只能用多线程
//于是就综合了一下,写了这个类,功能简单,容易理解。
//由于是第一次写类,还希望大家多多提建议
//by l0g1n-------2012年6月12日 17:44 QQ:519710391
///////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ListControlDemo.h"
#include "MyList.h"
// CMyList
IMPLEMENT_DYNAMIC(CMyList, CListCtrl)
CMyList::CMyList()
{
}
CMyList::~CMyList()
{
}
BEGIN_MESSAGE_MAP(CMyList, CListCtrl)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyList::OnNMCustomdraw)
END_MESSAGE_MAP()
CMap<DWORD , DWORD& , COLORREF , COLORREF&> MapItemColor;
void CMyList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
{
COLORREF ItemColor;
if(MapItemColor.Lookup((lplvcd->nmcd.dwItemSpec), ItemColor))
{
//lplvdr->clrText = RGB(0,0,0);//ItemColor;
lplvcd->clrText = ItemColor;
*pResult = CDRF_DODEFAULT;
}
}
}
// CMyList 消息处理程序
//设置图标图标关联
CImageList* CMyList::SetImageList(CImageList *pImageList)
{
return CListCtrl::SetImageList(pImageList,LVSIL_SMALL);
}
//设置图标id
BOOL CMyList::SetItemImageId(int nItem,int nImageId)
{
return CListCtrl::SetItem(nItem,0,LVIF_IMAGE,NULL,nImageId,0,0,0);
}
//插入数据,可设置字体颜色
int CMyList::InsertItem(int nItem,LPCTSTR lpText,COLORREF fontcolor)
{
const int IDX = CListCtrl::InsertItem(nItem, lpText);
//改变颜色
DWORD iItem=(DWORD)nItem;
MapItemColor.SetAt(iItem, fontcolor);
return IDX;
}

被折叠的 条评论
为什么被折叠?



