0

MFC アプリケーションに ClistView コントロールがあります。内容に応じていくつかの項目に色を付ける必要があります。たとえば、「No Response to」で始まる場合は、赤にする必要があります。

これまでのところ、私は試しました

BEGIN_MESSAGE_MAP(CMessageView, CListView)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,customDraw)
END_MESSAGE_MAP()

void CMessageView::Update()
{
CListCtrl& refCtrl = GetListCtrl();   
refCtrl.InsertItem(LVIF_TEXT|LVIF_PARAM,0,CTime::GetCurrentTime().Format("%H:%M:%S"),0,0,0,42);
refCtrl.SetItemText(0,1,"some text");
refCtrl.SetItemText(0,2,"No response to open");
}

void CMessageView::customDraw(NMHDR * pNMHDR, LRESULT * pResult)
{
_ASSERTE(*pResult == 0);

NMLVCUSTOMDRAW * pnmlvcd = (NMLVCUSTOMDRAW *)pNMHDR;

DWORD dwDrawStage = pnmlvcd->nmcd.dwDrawStage;

BOOL bSubItem = dwDrawStage & CDDS_SUBITEM;
dwDrawStage &= ~CDDS_SUBITEM;

switch (dwDrawStage)
{
case CDDS_PREPAINT:
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
        break;
    }
case CDDS_ITEMPREPAINT:
case CDDS_SUBITEM:
    {
            if(pnmlvcd->nmcd.lItemlParam == 42)
            {
                pnmlvcd->clrText = RGB(255,0,0);            

            }               
            *pResult = 0;               
        break;
    }
default:
    {
        *pResult = 0;
        break;
    }
}
}

しかし、うまくいきません。色は変わりません。私は何かを見逃していますか、何か間違っていますか?

4

2 に答える 2

3

VS2008 SP1 を使用している場合は、CMFCListCtrl代わりに使用する方がはるかに簡単です。各行の前景色と背景色を設定するためにオーバーライドできる仮想関数があります。

于 2013-03-15T14:14:12.497 に答える
1

簡単なサンプル アプリケーションのこのコードは、私にとってはうまくいきました。私のリスト コントロールには 2 つの列と 2 つの項目があります。2 番目の項目の 2 番目の列には、項目データが 42 に設定されています。この場合、その特定のサブ項目だけがテキストが赤に変更されています。

void CMFCTestDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
{
   NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
   // TODO: Add your control notification handler code here

   *pResult = CDRF_DODEFAULT;

   switch(pLVCD->nmcd.dwDrawStage)
   {
   case CDDS_PREPAINT:
      *pResult = CDRF_NOTIFYITEMDRAW;
      break;

   case CDDS_ITEMPREPAINT:
      *pResult = CDRF_NOTIFYSUBITEMDRAW;
      break;

   case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
      {
         if(1 == pLVCD->iSubItem)
         {
            if(pLVCD->nmcd.lItemlParam == 42)
            {
               pLVCD->clrText = RGB(255, 0, 0);
            }
         }
      }
      break;
   }
}
于 2013-03-15T19:45:11.757 に答える