头文件:

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

 

posted on 2013-08-15 10:08  二师兄89  阅读(882)  评论(0编辑  收藏  举报