chenluhua1980
2026-01-09 260b16a1debe7dbc33982768a37dfd48ca34b248
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "stdafx.h"
#include "ListCtrlEx.h"
 
 
CListCtrlEx::CListCtrlEx()
{
}
 
 
CListCtrlEx::~CListCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CListCtrlEx::OnNMCustomdraw)
END_MESSAGE_MAP()
 
 
void CListCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë
    *pResult = CDRF_DODEFAULT;
 
    NMLVCUSTOMDRAW * lplvdr = (NMLVCUSTOMDRAW*)pNMHDR;
    NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
    switch (lplvdr->nmcd.dwDrawStage)//ÅжÏ״̬   
    {
    case CDDS_PREPAINT:
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
        break;
    }
    case CDDS_ITEMPREPAINT://Èç¹ûΪ»­ITEM֮ǰ¾ÍÒª½øÐÐÑÕÉ«µÄ¸Ä±ä   
    {
        // ¸ù¾ÝÔÚ SetItemColor(DWORD iItem, COLORREF color) ÉèÖõĠ  
        // ITEMºÅºÍCOLORREF ÔÚÃþ°åÖвéÕÒ£¬È»ºó½øÐÐÑÕÉ«¸³Öµ¡£
        /*
        LISTITEMEX_9& itemex = m_listItemColor.GetAt(m_listItemColor.FindIndex(nmcd.dwItemSpec));
        lplvdr->clrText = itemex.colText;
        lplvdr->clrTextBk = itemex.colTextBk;
        *pResult = CDRF_DODEFAULT;
        */
        
        if (nmcd.dwItemSpec % 2 == 0) {
            lplvdr->clrText = RGB(0, 0, 0);
            lplvdr->clrTextBk = RGB(235, 235, 235);
            *pResult = CDRF_DODEFAULT;
        }
        else {
            lplvdr->clrText = RGB(0, 0, 0);
            lplvdr->clrTextBk = RGB(255, 255, 255);
            *pResult = CDRF_DODEFAULT;
        }
        
 
        break;
    }
    }
 
}
 
void CListCtrlEx::SetItemColor(DWORD_PTR iItem, COLORREF TextColor, COLORREF TextBkColor)
{
    if (iItem >= m_listItemColor.GetSize()) return;
    LISTITEMEX_9& itemex = m_listItemColor.GetAt(m_listItemColor.FindIndex(iItem));
    itemex.colText = TextColor;
    itemex.colTextBk = TextBkColor;
    this->RedrawItems(iItem, iItem);            // ÖØÐÂȾɫ   
    UpdateWindow();
}
 
 
LRESULT CListCtrlEx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    int nRet =  CListCtrl::WindowProc(message, wParam, lParam);
    if (message == LVM_INSERTITEM) {
        if (nRet != -1) {
            LISTITEMEX_9 itemex = {RGB(0,0,0), RGB(255, 255, 255)};
            LVITEM* p = (LVITEM*)lParam;
            m_listItemColor.InsertBefore(m_listItemColor.FindIndex(p->iItem), itemex);
        }
    }
    else if (message == LVM_DELETEITEM) {
        if (nRet != 0) {
            m_listItemColor.RemoveAt(m_listItemColor.FindIndex(wParam));
        }
    }
    else if (message == LVM_DELETEALLITEMS) {
        if (nRet != 0) {
            m_listItemColor.RemoveAll();
        }
    }
 
    return nRet;
}