CListCtrl 在報表模式下無法針對特定項目或子項目設定背景顏色。Sven Freitag 開發的 CColorListCtrl 雖支援列表項顏色設定,但其顏色定義僅限於 color.h 中列舉的 24 種預設色(如 BLACK、BLUE、RED 等),無法滿足自訂顏色需求。
原始碼中使用 ITEM_COLOR 列舉與 GetColorRef 函式對應 RGB 值,導致擴充性極差:
typedef enum { DEF_BACKGROUND, DEF_TEXT, ..., MIDDLEGRAY } ITEM_COLOR;
COLORREF GetColorRef(ITEM_COLOR lParam) { switch(lParam) { case RED: return RGB(255,0,0); ... } }
將色彩儲存型別從 ITEM_COLOR 改為 COLORREF,直接儲存 32 位元 RGB 值,移除 color.h 與 color.cpp,修改重點如下:
CMyLParam 類別中將 m_pBackColor、m_pTextColor 陣列型別改為 COLORREF*。BOOL SetBackColor(COLORREF color, int iSub) { ... }
COLORREF GetBackColor(int iSub) {
if (iSub < m_column_count) return m_pBackColor[iSub];
return ::GetSysColor(COLOR_WINDOW);
}
CColorListCtrl::SetItemBackgndColor、SetItemTextColor 參數改為 COLORREF。DEF_BACKGROUND 等巨集替換為 ::GetSysColor(COLOR_WINDOW) 等 API 呼叫。修改完成後,開發者可直接傳入 RGB(123, 45, 67) 等任意色值,不再受限於預設調色盤。範例程式執行畫面如下:
左圖為原版預設色彩,右圖為修改後支援任意 RGB 色值。
因採用 Owner-draw 模式(需勾選「Owner draw fixed」),導致部分 CListCtrl 函式(如 InsertItem)行為異常,排序功能實作困難。目前暫時方案為將資料全取出排序後重填列表,歡迎高手提供更優雅解法。