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

修改 CListCtrl 實現任意單元格背景顏色

     編輯:關於VC++

原版 CColorListCtrl 的限制

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); ... } }

修改方案:支援完整 COLORREF

將色彩儲存型別從 ITEM_COLOR 改為 COLORREF,直接儲存 32 位元 RGB 值,移除 color.h 與 color.cpp,修改重點如下:

  1. 資料成員型別變更:CMyLParam 類別中將 m_pBackColor、m_pTextColor 陣列型別改為 COLORREF*。
  2. 設定/取得函式參數與回傳值改為 COLORREF:
BOOL SetBackColor(COLORREF color, int iSub) { ... }
COLORREF GetBackColor(int iSub) {
    if (iSub < m_column_count) return m_pBackColor[iSub];
    return ::GetSysColor(COLOR_WINDOW);
}
  1. 公開介面同步修改:CColorListCtrl::SetItemBackgndColor、SetItemTextColor 參數改為 COLORREF。
  2. 移除測試用硬編碼邏輯:刪除原始碼中根據索引計算列舉值的測試區塊。
  3. 預設色彩改用系統色常數:將 DEF_BACKGROUND 等巨集替換為 ::GetSysColor(COLOR_WINDOW) 等 API 呼叫。

修改後效果

修改完成後,開發者可直接傳入 RGB(123, 45, 67) 等任意色值,不再受限於預設調色盤。範例程式執行畫面如下:

原版 CColorListCtrl 效果 修改後效果

左圖為原版預設色彩,右圖為修改後支援任意 RGB 色值。

已知限制與排序問題

因採用 Owner-draw 模式(需勾選「Owner draw fixed」),導致部分 CListCtrl 函式(如 InsertItem)行為異常,排序功能實作困難。目前暫時方案為將資料全取出排序後重填列表,歡迎高手提供更優雅解法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved