IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] CListView & DrawItem


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 35
    Par défaut [MFC] CListView & DrawItem
    Bonjour, j'aimerais creer une listeView qui affiche une ligne sur deux avec un backColor different (comme dans les listes html).
    Pour ca j'ai surchargé la methode DrawItem. Mais je ne passe pas dedans.

    Savez vous comment passer dedant ou avez vous le code de ce genre de liste ?

    Merci

  2. #2
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    il faut chopper la notification NM_CUSTOMDRAW

  3. #3
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    L'astuce consiste à changer la couleur de fond une fois sur deux (Si si, c'est vrai !), tu peux te baser sur le test suivant:
    Si numéro de ligne impair alors changer la couleur de fond.

    Par contre, je n'ai pas d'idée sur la manière de changer la propriétée background color.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Voici ce que j'utilise pour chager la couleur de fond d'une CListCtrl

    Je pense qu'on peut faire la meme chose avec une listView

    Je crée une class dérivée du composant MFC et je surcharge
    DrawItem()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
     
    CListCtrlCouleur::CListCtrlCouleur()
    	: CListCtrl()
    {
    }
     
    BEGIN_MESSAGE_MAP(CListCtrlCouleur, CUtilListCtrl)
    	//{{AFX_MSG_MAP(CListCtrl)
    	ON_WM_DRAWITEM_REFLECT()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    void CListCtrlCouleur::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    	try
    	{		
    		if (lpDrawItemStruct != NULL)
    		{
    			int IndexItem = lpDrawItemStruct->itemID;
    			if (IndexItem != -1)
    			{
    				switch (lpDrawItemStruct->itemAction)
    				{
    					case ODA_DRAWENTIRE:
    					case ODA_FOCUS:
    					case ODA_SELECT:
    					{
    						COLORREF CouleurFondPrec;	
    						COLORREF colorText;
    						if(this->IsItemSelectionne(IndexItem))
    						{
    							CouleurFondPrec  = ::SetBkColor(lpDrawItemStruct->hDC,RGB(0,0,0));
    							colorText = RGB(255,255,255);
    						}
    						else 
    						{							
    							CouleurFondPrec   = RGB(0,0,0);
     
    							// Alternance couleur
    							colorText = IndexItem%2 ? RGB(255,0,0):RGB(0,255,0) ;							
    						}
     
    						COLORREF CouleurTextePrec = ::SetTextColor(lpDrawItemStruct->hDC,colorText);
     
    						// Afficher le texte dans chaque colonne avec les couleurs definies
    						int LgColPrec = 0;
    						RECT Rect = lpDrawItemStruct->rcItem;
    						for (int iCol=0; iCol < GetNbColonne(); iCol++)
    						{
    							CString Texte = GetItemText(IndexItem,iCol);
    							Rect.left += LgColPrec;
    							::ExtTextOut(lpDrawItemStruct->hDC,
    								Rect.left,
    								Rect.top,
    								ETO_OPAQUE,
    								&Rect,
    								(LPCTSTR)Texte,
    								Texte.GetLength(),
    								NULL
    								);
    							LgColPrec = GetColumnWidth(iCol);
    						}
     
    						// Restaurer les couleurs
    						::SetTextColor(lpDrawItemStruct->hDC,CouleurTextePrec);
    						::SetBkColor(lpDrawItemStruct->hDC,CouleurFondPrec);
    					}
    				}
    			}
    		}
    	}	
     
    }
     
     
    int CListCtrlCouleur::GetNbColonne(void)
    {
    	int Result = 0;
     
    	if (GetHeaderCtrl() != NULL)
    		Result = GetHeaderCtrl()->GetItemCount();
     
    	return Result;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 35
    Par défaut toujours rien
    merci.

    c'est exactement que je fais.

    peux tu me donner le code que tu as pour créer ta liste, pour voir si j'ai les bonnes options et si je la crée bien :

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 93
    Par défaut
    Voici ma resource

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CONTROL         "",IDC_LISTE_COULEUR,"SysListView32",LVS_REPORT | 
                        LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDRAWFIXED | 
                        LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,4,14,262,177

    Il faut impérativement mettre la proprieté OWNERDRAW

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 35
    Par défaut toujours rien
    voici comment je cré ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    m_liste.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|LVS_OWNERDRAWFIXED,CRect(5,5,200,200),this,123);
     
    	m_liste.InsertItem(0,"toto1");
    	m_liste.InsertItem(1,"toto1");
    	m_liste.InsertItem(2,"toto2");
    	m_liste.InsertItem(3,"toto3");
    	m_liste.InsertItem(4,"toto4");
    	m_liste.InsertItem(5,"toto5");
    	m_liste.InsertItem(6,"toto6");
    	m_liste.InsertItem(7,"toto7");
    	m_liste.InsertItem(8,"toto8");
     
    	m_liste.ShowWindow(SW_SHOW);
     
    et voici le code de ma liste (je ne passes toujours pas dans DrawItem) :
     
    BEGIN_MESSAGE_MAP(ClistColor, CListCtrl)
    	//{{AFX_MSG_MAP(CListCtrl)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    		ON_WM_DRAWITEM_REFLECT()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
     
     
    /////////////////////////////////////////////////////////////////////////////
    // ClistColor diagnostics
     
    /////////////////////////////////////////////////////////////////////////////
    // ClistColor message handlers
     
    void ClistColor::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    	// Recup du CDC ............................................................
    	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
     
    	// Recup de l'item .........................................................
    	int nItem = lpDrawItemStruct->itemID;
    	BOOL bFocus = (GetFocus() == this);
     
    	// Recup du rectangle de dessin de l'item ..................................
    	CRect rcItem(lpDrawItemStruct->rcItem);
    	CRect rcAllLabels;
    	GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
     
    	// Test Rang paire / impaire ...............................................
    	if (nItem > -1)
    	{
    		if ((nItem % 2) == 0)
    		{
    			pDC->SetTextColor(RGB(0,0,0));
    			pDC->SetBkColor(RGB(247,185,255));
    			pDC->FillRect(rcAllLabels, &CBrush(RGB(247,185,255)));
    		}
    		else
    		{
    			pDC->SetTextColor(RGB(0,0,0));
    			pDC->SetBkColor(RGB(255,255,255));
    			pDC->FillRect(rcAllLabels, &CBrush(RGB(255,255,255)));
    		}
    	}
    }
    [Attention a la balise de code ,Merci Farscape]

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 35
    Par défaut changement de stratégie
    j'ai changé de methode et ca marche tres bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    // ListColor.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "ListColor.h"
    #include "apparence.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CListColor
     
    CListColor::CListColor()
    {
    }
     
    CListColor::~CListColor()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CListColor, CListCtrl)
    	//{{AFX_MSG_MAP(CListColor)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    	//}}AFX_MSG_MAP
    	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CListColor message handlers
     
    void CListColor::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
    {
    	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
     
        *pResult = 0;
     
    	// Vérifiez l'étape de dessin...............................................  
    	// Si c'est l'étape du prepaint de la commande,............................. 
    	// on dit a Windows que nous voulons des messages pour chaque item..........
        if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
        {
    		*pResult = CDRF_NOTIFYITEMDRAW;
        }
        else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
        {
    		// On repaint un item ......................................................
     
    		// Recup du CDC ............................................................
    		CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
    		CRect rcAllLabels;
    		GetItemRect(pLVCD->nmcd.dwItemSpec, rcAllLabels, LVIR_BOUNDS);
     
    		if ( (pLVCD->nmcd.dwItemSpec % 2) == 0 )
    		{
    			pDC->FillRect(rcAllLabels, &CBrush(COULEUR_LIST_LIGNEPAIRE));
    			pLVCD->clrTextBk = COULEUR_LIST_LIGNEPAIRE;
    		}
    		else 
    		{
    			pDC->FillRect(rcAllLabels, &CBrush(COULEUR_LIST_LIGNEIMPAIRE));
    			pLVCD->clrTextBk = COULEUR_LIST_LIGNEIMPAIRE;
    		}
     
    		*pResult = CDRF_DODEFAULT;
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC] CListView, liste en ligne
    Par MarieMtl dans le forum MFC
    Réponses: 10
    Dernier message: 01/02/2006, 22h58
  2. [MFC] drawItem ClistCtrl
    Par benahpets dans le forum MFC
    Réponses: 1
    Dernier message: 09/09/2005, 11h11
  3. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  4. Réponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [MFC] ADO connection
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 10/06/2002, 07h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo