如何设置CListCtrl单元格颜色?

问题描述 投票:0回答:1

没有自定义继承自CListCtrl的新类,我用CListCtrl创建了对象m_table。如何更改当前插入数据的文本颜色?

下面是我的代码块:

void CClassView::OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);

    *pResult = 0;

    if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)
    {
        COLORREF crText;

        if ((pLVCD->nmcd.dwItemSpec % 3) == 0)
            crText = RGB(255, 0, 0);
        else if ((pLVCD->nmcd.dwItemSpec % 3) == 1)
            crText = RGB(0, 255, 0);
        else
            crText = RGB(128, 128, 255);

        int nItemIndex = static_cast<int>(pLVCD->nmcd.dwItemSpec);
        int nSubItemIndex = static_cast<int>(pLVCD->iSubItem);

        CString strValue = m_table2.GetItemText(nItemIndex, nSubItemIndex);


        if (strValue == _T("F"))
        {
            pLVCD->clrText = RGB(255, 0, 0);
        }

        pLVCD->clrText = crText;
        *pResult = CDRF_DODEFAULT;
    }
}

我尝试在OnCustomdrawMyList函数中获取当前插入位置的索引,通过索引获取数据,将获取到的数据与预期改变颜色进行比较。但这并没有成功。

c++ mfc
1个回答
0
投票

我认为你的意思是子项中的文本,那么你必须处理更多的绘制状态。 另外,您不得退货

CDRF_DODEFAULT
适当的是
CDRF_NOTIFYSUBITEMDRAW
CDRF_NEWFONT

void CClassView::OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult)
{
   LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

  //for this notification, the structure is actually a
  // NMLVCUSTOMDRAW that tells you what's going on with the custom
  // draw action. So, we'll need to cast the generic pNMHDR pointer.
  LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

  switch (lplvcd->nmcd.dwDrawStage)
  {
  case CDDS_PREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;  // ask for subitem notifications.
    break;

    case CDDS_ITEMPREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;  // ask for subitem notifications.
    break;

 case CDDS_ITEMPREPAINT | CDDS_SUBITEM: // recd when CDRF_NOTIFYSUBITEMDRAW is returned in response to CDDS_ITEMPREPAINT.
    *pResult = CDRF_DODEFAULT;          

    :       
    :
    COLORREF clrBk  = afxGlobalData.clrWindow;
    COLORREF clrTxt = afxGlobalData.clrWindowText;
    
    if (condition)
    {
        clrTxt = WHITE;
        clrBk  = BLUE;
    }

    lplvcd->clrTextBk = clrBk;
    lplvcd->clrText = clrTxt;

    *pResult = CDRF_NEWFONT;
 // *pResult = CDRF_NOTIFYSUBITEMDRAW;
    break;
} //  CDDS_ITEMPREPAINT | CDDS_SUBITEM

case CDDS_ITEMPOSTPAINT:
    lplvcd->clrTextBk = RED;
    break;
default:                               // it wasn't a notification that was interesting to us.
    *pResult = CDRF_DODEFAULT;
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.