自定义绘图Listview项目不更改文本颜色

时间:2012-10-19 14:23:35

标签: c++ winapi mfc wtl

我正在尝试在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 个答案:

答案 0 :(得分:1)

如果没有排序previous questions,您会继续发布具有相同问题的新内容。

此代码段中没有任何问题需要解决,有太多问题。

您可以从处理示例Lazy Grid WTL implementationCustom Drawn Controls using WTL开始,并弄清楚事情是如何运作的。

  • 您不需要子类化为自定义绘制
  • 自定义绘制通知来控制父级,而不是控制自己 - 你需要在父窗口或REFLECT_NOTIFICATIONS上处理它们,在这种情况下你可以选择在控件上处理它们(和子类化)有道理)
相关问题