CListCtrl派生类

前段时间,一直用的网上的一个类,数据量一大了以后,界面就显的很卡。网上很多都不合适,就研究了两天(好慢啊,自己太笨了),写了这个类,功能不多,适合新手学习。

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;
}



你可能感兴趣的:(多线程,windows,image,qq,null)