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 は、リソース ウィザードで作成した ListView リソースです。

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 に答える