从 CListCtrl 派生一个了的继承类CColorListCtrl,主要用于改变单元格的颜色

本文介绍了一种实现CListCtrl中单元格颜色自定义的方法。通过创建CColorListCtrl类并重写绘图及消息处理函数,实现了对列表控件中任意单元格颜色的设置。提供了一份详细的代码示例。

有压力才有动力,经过两个多小时的摸索,饿着肚子干,终于实现了CListCtrl 单元色颜色的随意改变。特备忘如下:

ColorListCtrl .h代码

#pragma once


// CColorListCtrl

class CColorListCtrl : public CListCtrl
{
	DECLARE_DYNAMIC(CColorListCtrl)

public:
	CColorListCtrl();
	virtual ~CColorListCtrl();

protected:
	DECLARE_MESSAGE_MAP()
protected: 
virtual   void   PreSubclassWindow(); 
public: 
virtual   void   DrawItem(LPDRAWITEMSTRUCT   /*lpDrawItemStruct*/); 
COLORREF   SetItemColor(int   nRow,   int   nCol,   COLORREF   clrItem); 
COLORREF   SetItemColor(LVITEM*   plvItem   =   NULL,   COLORREF   clrItem   =   RGB(0,   0,   0)); 
private: 
CList <COLORREF*,   COLORREF*>   m_lstItemColor; 
};


ColorListCtrl.cpp代码:

// ColorListCtrl.cpp : ʵÏÖÎļþ
//

#include "stdafx.h"
#include "listControl.h"
#include "ColorListCtrl.h"


// CColorListCtrl

IMPLEMENT_DYNAMIC(CColorListCtrl, CListCtrl)

CColorListCtrl::CColorListCtrl()
{

}

CColorListCtrl::~CColorListCtrl()
{
POSITION   pos   =   m_lstItemColor.GetHeadPosition(); 
while   (pos) 
{ 
delete   []m_lstItemColor.GetNext(pos); 
} 
} 


BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
END_MESSAGE_MAP()


void   CColorListCtrl::PreSubclassWindow() 
{ 
//   TODO:   ÔÚ´ËÌí¼ÓרÓôúÂëºÍ/»òµ÷ÓûùÀà 
ModifyStyle(0,   LVS_OWNERDRAWFIXED   |   LVS_REPORT,   0); 

CListCtrl::PreSubclassWindow(); 
} 

void   CColorListCtrl::DrawItem(LPDRAWITEMSTRUCT   lpDIS) 
{ 
//   TODO:     Ìí¼ÓÄúµÄ´úÂëÒÔ»æÖÆÖ¸¶¨Ïî 
CDC   *pDC   =   CDC::FromHandle(lpDIS-> hDC); 
int   nRows   =   m_lstItemColor.GetCount(); 
COLORREF   *clrCol   =   NULL; 
if   (nRows   &&   lpDIS-> itemID   <   nRows) 
{ 
clrCol   =   m_lstItemColor.GetAt(m_lstItemColor.FindIndex(lpDIS-> itemID)); 
} 
CRect   rcItem(lpDIS-> rcItem); 
LVCOLUMN lvColumn; 
ZeroMemory(&lvColumn,   sizeof(LVCOLUMN)); 
lvColumn.mask   =   LVCF_FMT   |   LVCF_WIDTH; 
for   (int   nCol   =   0;   nCol   <   GetHeaderCtrl()-> GetItemCount();   nCol++) 
{ 
if   (clrCol) 
pDC-> SetTextColor(clrCol[nCol]); 
GetColumn(nCol,   &lvColumn); 
UINT   uStyle   =   DT_SINGLELINE   |   DT_END_ELLIPSIS; 
if   (lvColumn.fmt   &   LVCFMT_LEFT) 
uStyle   |=   DT_LEFT; 
if   (lvColumn.fmt   &   LVCFMT_RIGHT) 
uStyle   |=   DT_RIGHT; 
if   (lvColumn.fmt   &   LVCFMT_CENTER) 
uStyle   |=   DT_CENTER; 
rcItem.right   =   rcItem.left   +   lvColumn.cx; 
pDC-> DrawText(GetItemText(lpDIS-> itemID,   nCol),   rcItem,   uStyle); 
rcItem.left   +=   lvColumn.cx; 
} 
} 

//   CColorListCtrl   ÏûÏ¢´¦Àí³ÌÐò 


COLORREF   CColorListCtrl::SetItemColor(int   nRow,   int   nCol,   COLORREF   clrItem) 
{ 
int   nCols   =   GetHeaderCtrl()-> GetItemCount(); 
int   nRows   =   GetItemCount(); 
//if   (nCol   > =   nCols   ||   nRow   > =   nRows) 
//return   COLORREF(-1); 

for   (int   i   =   m_lstItemColor.GetCount();   i   <   nRow   +   1;   i++) 
{ 
COLORREF   *clrCol   =   new   COLORREF[nCols]; 
ZeroMemory(clrCol,   sizeof(clrCol)); 
m_lstItemColor.AddTail(clrCol); 
} 

for   (int   i   =   0;   i   <   nRows;   i++) 
{ 
if   (i   ==   nRow) 
{ 
COLORREF   *clrCol   =   m_lstItemColor.GetAt(m_lstItemColor.FindIndex(nRow)); 
COLORREF   clrRet   =   clrCol[nCol]; 
clrCol[nCol]   =   clrItem; 
return   clrRet; 
} 
} 

return   COLORREF(-1); 
} 


COLORREF   CColorListCtrl::SetItemColor(LVITEM*   plvItem,   COLORREF   clrItem) 
{ 
if   (!plvItem) 
{ 
return   COLORREF(0); 
} 
int   nRow   =   plvItem-> iItem; 
int   nCol   =   plvItem-> iSubItem; 
return   SetItemColor(nCol,   nRow,   clrItem); 

return   COLORREF(-1); 
} 


使用:
对话框上添加一个ListCtrl控件,添加控件变量m_ListCtrl,将变量类型改为CColorListCtrl 。

m_ListCtrl.SetItemColor(2,2,RGB(255,0,0));

 

建议:最好新建一个MFC类CColorListCtrl,基类选CListCtrl ,将这两个文件的代码COPY过去。减少不必要的错误调试。

VC6 CListCtrl继承例子 oid CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM ; lvi.iItem = lpDrawItemStruct->itemID ; lvi.iSubItem = 0; lvi.pszText = lpBuffer ; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); LV_COLUMN lvc, lvcprev ; ::ZeroMemory(&lvc, sizeof(lvc)); ::ZeroMemory(&lvcprev, sizeof(lvcprev)); lvc.mask = LVCF_WIDTH | LVCF_FMT; lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rtClient; GetClientRect(&rtClient); for ( int nCol=0; GetColumn(nCol, &lvc); nCol++) { if ( nCol > 0 ) { // Get Previous Column Width in order to move the next display item GetColumn(nCol-1, &lvcprev) ; lpDrawItemStruct->rcItem.left += lvcprev.cx ; lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; } CRect rcItem; if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem)) continue; ::ZeroMemory(&lvi, sizeof(lvi)); lvi.iItem = lpDrawItemStruct->itemID; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = nCol; lvi.pszText = lpBuffer; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CRect rcTemp; rcTemp = rcItem; if (nCol==0) { rcTemp.left -=2; } if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ; pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ; } else { COLORREF color; color = GetBkColor(); pDC->FillSolidRect(rcTemp,color); if (FindColColor(nCol,color)) { pDC->FillSolidRect(rcTemp,color); } if (FindItemColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->FillSolidRect(rcTemp,color); } //pDC->SetTextColor(m_color); } pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT)); UINT uFormat = DT_CENTER ; if (m_Header.m_Format[nCol]=='0') { uFormat = DT_LEFT; } else if (m_Header.m_Format[nCol]=='1') { uFormat = DT_CENTER; } else if (m_Header.m_Format[nCol]=='2') { uFormat = DT_RIGHT; } TEXTMETRIC metric; pDC->GetTextMetrics(&metric); int ofst; ofst = rcItem.Height() - metric.tmHeight; rcItem.OffsetRect(0,ofst/2); pDC->SetTextColor(m_color); COLORREF color; if (FindColTextColor(nCol,color)) { pDC->SetTextColor(color); } if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->SetTextColor(color); } CFont nFont ,* nOldFont; nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont); DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat) ; pDC->SelectStockObject(SYSTEM_FONT) ; } }
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值