CLidtCtrl comment changer la couleur ?

Signaler
Messages postés
39
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
6 septembre 2008
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Bonjours a tout le groupe :)
voila je travail avec MFC VC++ 6.0
et je veux savoire comment je peux changer la cuoleur d'une ligne ou d'une colonne d'une ListCtrl en mode Report en temps de l'execution (at runtime)?
j'ai essaye la methode  m_lst.SetTextColor(); ca a marche mais ca change la couleur de tout les element, (il leur donne la meme couleur) mais moi ce que je veux, est d'associer a chaque element  (ligne/colonne) une couleur differente ?
svp...comment puis'je le faire ?
merci d'avance :)

1 réponse

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Salut,




En API win32, on utilise le custom draw, et pour chaque item de la liste, on place un param personnalisé qui défini la couleur ou autre chose (List::nmcd.lItemlParam) :

Il suffit d'attribuer cette valeur au ListItem
LVITEM listItem;
listItem.lParam = param;

Au runtime, lorsque l'on modifie ou ajoute un item, ce parametres servira pour le dessin et donnera la bonne couleur.

// Si on veut des couleurs selon un etat particulier



enum eEtat
{
   E_ERR=0, E_INFO, E_OK
};



// le message de la wndProc

case WM_NOTIFY:


 if( LOWORD(wParam) == IDC_LST_REPORT )
 {
    LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;


    if( pnm->hdr.code == NM_CUSTOMDRAW )
    {
       LRESULT ret = DrawLineEffect(lParam);
    }
  }




LRESULT DrawLineEffect(LPARAM lParam)
{
 LPNMLVCUSTOMDRAW pListDraw = (LPNMLVCUSTOMDRAW)lParam;


 switch( pListDraw->nmcd.dwDrawStage )
 {
 case CDDS_PREPAINT:
  return(CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW);


 case CDDS_ITEMPREPAINT:
 {
  int iRow = (int)pListDraw->nmcd.dwItemSpec;
  if( pListDraw->nmcd.lItemlParam == E_ERR )
  {
   pListDraw->clrTextBk = RGB(255, 200, 200);
   return CDRF_NEWFONT;
  }
  else if( pListDraw->nmcd.lItemlParam == E_OK )
  {
   pListDraw->clrTextBk = RGB(238, 255, 238);
   return CDRF_NEWFONT;
  }
  // Ligne sans couleur particuliere
  else if( iRow % 2 == 0 )
  {
   pListDraw->clrTextBk = RGB(250, 250, 238);
   return CDRF_NEWFONT;
  }
 }
}


 return CDRF_DODEFAULT;
}




En MFC, c'est a peu près la meme chose, sauf qu'il faut ajouter les messages par MACRO dans la classe du parent du ListView ou créer une classe dérivée de CListCtl et gérer les messages de reflexion ON_CONTROL_REFLECT si je me rappelle bien.