首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC 可設定單元格顏色的 CListCtrl 擴充類

     編輯:關於VC++

痛點與解法

標準 CListCtrl 無法單獨設定單元格前景/背景色。本類繼承自支援排序的 CSortListCtrl (參考王駿《列表控件排序功能的實現》),處理 NM_CUSTOMDRAW 訊息實現逐格著色。

核心實現:OnCustomDraw


void CSortListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) {
    NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)pNMHDR;
    switch (pLVCD->nmcd.dwDrawStage) {
    case CDDS_PREPAINT:
        *pResult = CDRF_NOTIFYITEMDRAW; break;
    case CDDS_ITEMPREPAINT:
        *pResult = CDRF_NOTIFYSUBITEMDRAW; break;
    case CDDS_SUBITEM | CDDS_ITEMPREPAINT: {
        int nItem = (int)pLVCD->nmcd.dwItemSpec;
        int nSubItem = pLVCD->iSubItem;
        COLORREF clrText, clrBkgnd;
        if (GetItemColor(nItem, nSubItem, clrText, clrBkgnd)) { // 自訂查色函數
            pLVCD->clrText = clrText;
            pLVCD->clrTextBk = clrBkgnd;
        }
        *pResult = CDRF_DODEFAULT; break;
    }
    default: *pResult = CDRF_DODEFAULT;
    }
}

使用範例


m_MyListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_MyListCtrl.SetHeadings(_T("ID,100;Name,100;BirthDate,100"));
m_MyListCtrl.AddItem(_T("1"), _T("欒義明"), _T("1979-07-25"));
m_MyListCtrl.AddItem(_T("2"), _T("張偉"), _T("1982-03-26"));
// 設定第 0 列第 1 欄 (姓名) 紅字綠底
m_MyListCtrl.SetItemColor(0, 1, RGB(255,0,0), RGB(0,255,0));

執行效果圖

關鍵點總結

  • 必須啟用 LVS_EX_FULLROWSELECT 才能正確繪製整列背景
  • NM_CUSTOMDRAW 分階段通知:預繪→項繪→子項繪,層層返回 CDRF_NOTIFY*
  • 儲存顏色資料建議用 std::map<std::pair<int,int>, ColorPair> 或二維陣列
  • 排序後項目索引變動,顏色映射需同步更新或改用唯一 ID 關聯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved