1

我正在尝试在 WTL 中实现自定义绘制的列表视图,这是列表视图的代码:

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");

并且项目文本的颜色不会改变。为什么?

4

1 回答 1

1

如果不整理以前的问题,您就会继续发布具有相同问题的新问题。

这段代码没有什么可修复的,太多的东西是错误的。

您可以从工作示例Lazy Grid WTL 实现使用 WTL 的自定义绘制控件开始,并弄清楚事情是如何工作的。

  • 您不需要子类化到自定义绘图
  • 自定义绘制通知到达控件的父级,而不是控制自身 - 您需要在父窗口上处理它们,或者REFLECT_NOTIFICATIONS在这种情况下,您可以选择在控件上处理它们(并且子类化是有意义的)
于 2012-10-20T11:57:00.993 回答