2012-10-19 18 views
1

我想實現在WTL自定義繪製的列表視圖,這是爲ListView代碼:自定義繪製列表視圖項不改變文字顏色

class CTaskListCtrl: public CWindowImpl<CTaskListCtrl, CListViewCtrl>, 
        public CCustomDraw<CTaskListCtrl> 
{ 
public: 
    BOOL SubclassWindow(HWND hWnd) 
    { 
     ATLASSERT(m_hWnd==NULL); 
     ATLASSERT(::IsWindow(hWnd)); 
     BOOL bRet = CWindowImpl<CTaskListCtrl, CListViewCtrl>::SubclassWindow(hWnd); 
      return bRet; 
    } 
    BEGIN_MSG_MAP(CTaskListCtrl) 
     CHAIN_MSG_MAP(CCustomDraw<CTaskListCtrl>) 
    END_MSG_MAP() 

    DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) 
    {   
     return CDRF_NOTIFYITEMDRAW; 
    } 

    DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) 
    { 
     NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(lpNMCustomDraw); 

     COLORREF crText; 

     if ((pLVCD->nmcd.dwItemSpec % 2) == 0) 
     crText = RGB(200,200,255); 
     else 
     crText = RGB(255,255,255); 

     pLVCD->clrTextBk = crText; 

     return CDRF_DODEFAULT; 
    } 
}; 

這是我如何使用它:IDC_LIST_TASKS是ListVieew我在資源嚮導中創建的資源。

CTaskListCtrl m_taskList; 
m_taskList.SubclassWindow(GetDlgItem(IDC_LIST_TASKS)); 

m_taskList.AddColumn(TEXT("Name"),0); 
m_taskList.SetColumnWidth(0,100); 

m_taskList.AddColumn(TEXT("Algorithm"), 1); 
m_taskList.SetColumnWidth(1,100); 

m_taskList.AddColumn(TEXT("Status"), 2); 
m_taskList.SetColumnWidth(2,100); 

m_taskList.AddItem(0,0,L"ASDASD"); 
m_taskList.AddItem(0,1,L"ASDASD"); 
m_taskList.AddItem(0,2,L"ASDASD"); 

並且項目文本的顏色不變。爲什麼?

+1

問題說「顏色的項目文本」,但代碼是設置文本背景顏色,而不是文本顏色。如果BkMode是透明的,則不會看到背景顏色。 –

回答

1

不整理previous questions你不斷髮布新的相同的問題。

這段代碼沒有什麼可以解決的,太多的東西都是錯的。

您可以從樣品Lazy Grid WTL implementation,Custom Drawn Controls using WTL開始,找出工作原理。

  • 你不需要子類來定義繪製
  • 自定義繪製通知來控制的母公司,而不是控制自己 - 你需要處理他們在那裏對父窗口,或REFLECT_NOTIFICATIONS在這種情況下,你有一個選項來處理他們的控制(和子類是有道理的)
相關問題