CLidtCtrl comment changer la couleur ?

aabdoos Messages postés 39 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 6 septembre 2008 - 30 août 2008 à 20:32
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 31 août 2008 à 13:10
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

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
31 août 2008 à 13:10
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.
0
Rejoignez-nous