Changement de couleur dans une CListCtrl ?

redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005 - 18 mai 2005 à 16:28
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 23 mai 2005 à 15:24
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
18 mai 2005 à 19:36
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
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
19 mai 2005 à 14:14
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 mai 2005 à 14:59
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 :)
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
19 mai 2005 à 16:32
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 mai 2005 à 16:37
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.
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
19 mai 2005 à 16:39
Merci....


redam
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
19 mai 2005 à 16:45
maintenant l'erreur est :

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

une idée ?


redam
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
19 mai 2005 à 17:11
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 mai 2005 à 17:18
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
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
19 mai 2005 à 17:27
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
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
20 mai 2005 à 15:10
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 mai 2005 à 18:20
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
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
23 mai 2005 à 11:32
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 mai 2005 à 13:00
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
0
redam2005 Messages postés 22 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 1 août 2005
23 mai 2005 à 14:25
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 mai 2005 à 15:24
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
0
Rejoignez-nous