头文件:
#if !defined(AFX_LINECOLORLISTCTRL_H__92EB1CD4_CD33_4E02_A098_367A8FEFF38E__INCLUDED_) #define AFX_LINECOLORLISTCTRL_H__92EB1CD4_CD33_4E02_A098_367A8FEFF38E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif #include <afxtempl.h> typedef struct { COLORREF colText; COLORREF colTextBk; }TEXT_BK; // CLineColorListCtrl window class CLineColorListCtrl : public CListCtrl { public: void SetItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor); //设置某一行的前景色和背景色 void SetAllItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor);//设置全部行的前景色和背景色 void ClearColor(); //清除颜色映射表 // Construction public: CLineColorListCtrl(); // Attributes public: CMap<DWORD, DWORD&, TEXT_BK, TEXT_BK&> MapItemColor; // Implementation public: virtual ~CLineColorListCtrl(); protected: void CLineColorListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() }; #endif
cpp文件:
SetItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor);
iItem指要设置的行号
SetAllItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor);
iItem指设置所有从第一行到iItem行的颜色。
1 #include "stdafx.h" 2 #include "MyListCtrl.h" 3 4 #ifdef _DEBUG 5 #define new DEBUG_NEW 6 #undef THIS_FILE 7 static char THIS_FILE[] = __FILE__; 8 #endif 9 10 // CLineColorListCtrl 11 CLineColorListCtrl::CLineColorListCtrl() 12 { 13 } 14 15 CLineColorListCtrl::~CLineColorListCtrl() 16 { 17 } 18 19 20 BEGIN_MESSAGE_MAP(CLineColorListCtrl, CListCtrl) 21 ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) 22 END_MESSAGE_MAP() 23 24 25 // CLineColorListCtrl message handlers 26 27 void CLineColorListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) 28 { 29 // TODO: Add your control notification handler code here 30 *pResult = CDRF_DODEFAULT; 31 NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR; 32 NMCUSTOMDRAW &nmcd = lplvdr->nmcd; 33 switch(lplvdr->nmcd.dwDrawStage)//判断状态 34 { 35 case CDDS_PREPAINT: 36 { 37 *pResult = CDRF_NOTIFYITEMDRAW; 38 break; 39 } 40 case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变 41 { 42 TEXT_BK tb; 43 44 if(MapItemColor.Lookup(nmcd.dwItemSpec, tb)) 45 // 根据在 SetItemColor(DWORD iItem, COLORREF color) 设置的 46 // ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。 47 { 48 lplvdr->clrText = tb.colText; 49 lplvdr->clrTextBk = tb.colTextBk; 50 *pResult = CDRF_DODEFAULT; 51 } 52 } 53 break; 54 } 55 } 56 57 void CLineColorListCtrl::ClearColor() 58 { 59 MapItemColor.RemoveAll(); 60 } 61 62 void CLineColorListCtrl::SetItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor) 63 { 64 TEXT_BK tb; 65 tb.colText = TextColor; 66 tb.colTextBk = TextBkColor; 67 68 69 MapItemColor.SetAt(iItem, tb);//设置某行的颜色。 70 this->RedrawItems(iItem, iItem);//重新染色 71 72 this->SetFocus(); //设置焦点 73 UpdateWindow(); 74 } 75 76 77 void CLineColorListCtrl::SetAllItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor) 78 { 79 TEXT_BK tb; 80 tb.colText = TextColor; 81 tb.colTextBk = TextBkColor; 82 83 if(iItem > 0) 84 { 85 for(DWORD numItem = 0; numItem < iItem ;numItem ++) 86 { 87 MapItemColor.SetAt(numItem, tb); 88 this->RedrawItems(numItem, numItem); 89 } 90 } 91 92 return; 93 94 }