Changement de couleur dans une CListCtrl ?

Signaler
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
Bonjour,
Voilà j'ai une CListCtrl qui m'affiche des résultats sur chaque ligne et j'aimerai que suivant les cas, la ligne s'affiche en rouge ou en noir... Or la ligne

m_maListCtrl.SetTextColor(RGB(255,0,0));

me change toute la liste et non pas seulement la ligne. Ce qui fait que tout le texte a en fait la couleur correspondant au dernier résultat.. évidemment.
Quelqu'un connait-il une solution ?

Merci


redam

16 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Une liste en LVS_OWNERDRAWFIXED fera l'affaire, mais ca te fera un peu
de travail supplémentaire. A mon avis tu sera obligé de passer par la
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Merci pour cette réponse mais malgré mes recherches, je ne parviens pas à utiliser celà. Les exemples que j'ai téléchargé ne compilent même pas. Je suis sous VC++6 avec W2000. Connaissez vous un exemple abordable ?


redam
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
http://www.cppfrance.com/code.aspx?ID=24229

Mon code est sans MFC (mais le principe doit être le même), et je crois
qu'il est assez compréhensible. De plus il est garanti compilable sous
VC++ 6 :)
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Désolé, mon niveau ne me permet pas de bien déchiffrer ton code et de tout comprendre... Je ne parviens à compiler sous VC++6. Voici l'erreur :

PBListView.obj : error LNK2001: unresolved external symbol [mailto:__imp__InitCommonControlsEx@4 __imp__InitCommonControlsEx@4]

garanti ?


redam
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ajoute la ligne #pragma comment(lib, "comctl32") dans un de tes fichiers.

Ca ne marche pas la car l'ajout de cette lib était spécifié dans le projet mais tu ne pouvais l'utiliser avec VC++ 6.
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Merci....


redam
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

maintenant l'erreur est :

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

une idée ?


redam
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Pour idée, voici mon code :

BOOL CTableau::OnInitDialog()
{
CDialog::OnInitDialog();

/////Construction de la CListCtrl//////////////
m_requete.InsertColumn(0, "Software",LVCFMT_LEFT, 252);
m_requete.InsertColumn(1, "Numéro de requête",LVCFMT_LEFT,110);
m_requete.InsertColumn(2, "Etat",LVCFMT_LEFT, 100);
m_requete.InsertColumn(3, "PC",LVCFMT_LEFT, 110);
m_requete.InsertColumn(4, "Date de saisie SMS",LVCFMT_LEFT, 120);
m_requete.InsertColumn(5, "Date et heure d'installation",LVCFMT_LEFT, 150);


construction();


return TRUE;
}



void CTableau::construction()
{
m_requete.DeleteAllItems();



for (int j = 0 ; j < nbrReq ; j++)
{
if (j%2)//pour l'instant juste pour le test, je colore une ligne sur 2
{
m_requete.SetTextColor(RGB(255,0,0));
}
else
{
m_requete.SetTextBkColor(RGB(255,255,255));
m_requete.SetTextColor(RGB(0,0,0));
}


int nIndex = m_requete.InsertItem(0,Soft[j]);
m_requete.SetItemText(nIndex,1,numReq[j]);
m_requete.SetItemText(nIndex,2,Etat[j]);
m_requete.SetItemText(nIndex,3,nomPC[j]);
m_requete.SetItemText(nIndex,4,dateSMS[j]);
m_requete.SetItemText(nIndex,5,dateFlag[j]);
}
}


redam
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pour l'erreur de link, c'est peut être que tu as créé un projet console
au lieu de Win32, l faut que tu changes le point d'entrée (option
/SUBSYSTEM du linker)

C'est dans OnDrawItem que tu devra choisir les couleurs (tu dois
surcharger cette méthode). Le code correspondant est dans la case
WM_DRAWITEM de mon code
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Ok ton code compile enfin !! Je pourrai le trifouiller demain, ça m'aidera à comprendre un peu tout ça. Je te remercie bien. Je reposterai quand j'aurai un résultat (ou une autre question)


redam
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Slt,

Bon ok maintenant je fais donc toute ma construction de la liste dans la fonction :

void CTableau::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)

Mais aucune idée des paramètres à envoyer lorsque j'appelle la fonction OnDrawItem(?,?) dans CTableau::OnInitDialog()


redam
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Le principe c'est que ce n'est pas toi qui appelles cette fonction,
elle est appelée automatiquement (en fait WM_DRAWITEM) quand un item a
besoin d'être dessiné. Vérifie donc que tu n'a pas oublié de mettre le
style LVS_OWNERDRAWFIXED à ta ListView
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Apparemment la fonction ::OnDrawItem n'est pas appelée automatiquement dans mon programme. La liste ne s'affiche pas et le 'toto' [AfxMessageBox("toto");] non plus...
Est-ce que je m'y prends bien pour mettre le style LVS_OWNERDRAWFIXED ? Dans ::OnInitDialog() ?
Voici le code :

BOOL CTableau::OnInitDialog()
{
CDialog::OnInitDialog();


m_requete.SetExtendedStyle(LVS_OWNERDRAWFIXED);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}



void CTableau::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
/////Construction de la CListCtrl//////////////
m_requete.InsertColumn(0, "Software",LVCFMT_LEFT, 252);
m_requete.InsertColumn(1, "Numéro de requête",LVCFMT_LEFT,110);
m_requete.InsertColumn(2, "Etat",LVCFMT_LEFT, 100);
m_requete.InsertColumn(3, "PC",LVCFMT_LEFT, 110);
m_requete.InsertColumn(4, "Date de saisie SMS",LVCFMT_LEFT, 120);
m_requete.InsertColumn(5, "Date et heure d'installation",LVCFMT_LEFT, 150);


m_requete.DeleteAllItems();


AfxMessageBox("toto");


for (int j = 0 ; j < nbrReq ; j++)
{
if (j%2)//pour l'instant juste pour le test, je colore une ligne sur 2
{
m_requete.SetTextColor(RGB(255,0,0));
}
else
{
m_requete.SetTextColor(RGB(0,0,0));
}


int nIndex = m_requete.InsertItem(0,Soft[j]);
m_requete.SetItemText(nIndex,1,numReq[j]);
m_requete.SetItemText(nIndex,2,Etat[j]);
m_requete.SetItemText(nIndex,3,nomPC[j]);
m_requete.SetItemText(nIndex,4,dateSMS[j]);
m_requete.SetItemText(nIndex,5,dateFlag[j]);
}

CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}


redam
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Non, LVS_OWNERDRAWFIXED est un style normal, pas un style étendu.
Apparemment tu es dans un dialog, donc tu peux directement modifier ce
style dans l'editeur de dialog: tu mets Owner Draw Fixed à True
Messages postés
22
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
1 août 2005

Ok pour la propriété 'Owner Draw Fixed' . Merci.
Mais rien ne s'affiche. Apparemment la fonction ::OnDrawItem n'est pas appelée automatiquement dans mon programme. Une idée ?


redam
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Il y a un moment que j'ai plus codé en MFC, je me rapelle plus des manip a faire.

Regarde ceci, il y a un exemple (avec ListBox mais c'est pareil)

http://vecchio56.free.fr/progmfc