He ClistView de control en mi aplicación MFC. Necesito a color de algunos de los elementos de acuerdo a su contenido. Por ejemplo, si se comienza con la «No Respuesta», tengo que hacer es rojo.

Hasta ahora, he tratado de

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;
    }
}
}

Pero no funciona. El color no cambia. Me estoy perdiendo algo o haciendo algo mal?

  • Yo lo he hecho con gran éxito en el pasado, pero mi MFC días son largos detrás de mí. Trate de leer esto y dar su controlador similares de código: codeproject.com/Articles/79/…
  • Esta es la forma más fácil de hacer con un CMFCListCtrl
InformationsquelleAutor gorkem | 2013-03-15

2 Comentarios

  1. 1

    Este código en un ejemplo sencillo de la aplicación funcionó para mí. Mi lista de control tiene dos columnas y dos artículos. El segundo elemento de la segunda columna tiene elemento del conjunto de datos a 42, en este caso, sólo ese punto tenía el texto cambia a rojo.

    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;
       }
    }
    • durante la depuración, mi código sólo va mucho como CDDS_ITEMPREPAINT bloque. nunca se va a (CDDS_ITEMPREPAINT | CDDS_SUBITEM) bloque. Cuando me pongo pLVCD->clrText = RGB(255, 0, 0); en CDDS_ITEMPREPAINT bloque, no pasa nada. También, cuando yo uso SetTextColor(RGB(255,255,255)) para hacer que todas las entradas de la red, se queda en negro.
    • Esto funcionó para mí !

Dejar respuesta

Please enter your comment!
Please enter your name here