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 :

Colorer le texte d'un item d'un treectrl [FAQ]


Sujet :

MFC

  1. #1
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut Colorer le texte d'un item d'un treectrl
    bonjour

    quelqu'un saurait-il comment on pourrait colorer un item unique d'un treectrl ?

    merci d'avance

    SBP

  2. #2
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    il y a rien en standard il faut ruser ,
    il creer une classe deriv�e d'un CTreeCtrl et reprendre la main sur le paint

    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
     
    //---------------------------------------------------------------
    void CDirTreeCtrl::OnPaint() 
    {		
    	// TODO: Add your message handler code here
     
    	// Do not call CTreeCtrl::OnPaint() for painting messages
           CPaintDC dc(this);
     
    	CDC memDC;
    	memDC.CreateCompatibleDC( &dc );
     
    	CRect rcClip, rcClient;
    	dc.GetClipBox( &rcClip );
    	GetClientRect(&rcClient);
     
     
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    	memDC.SelectObject( &bitmap );
     
    	CRgn rgn;
    	rgn.CreateRectRgnIndirect( &rcClip );
    	memDC.SelectClipRgn(&rgn);
    	rgn.DeleteObject();
     
    	// laisser le controle se dessiner
    	CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
     
    	HTREEITEM hItem = GetFirstVisibleItem();
     
    	int n = GetVisibleCount()+1;
    	while( hItem && n--)
    	{
    		CRect rect;		
        	       CString str= GetItemText( hItem );
      	       GetItemRect( hItem, &rect, TRUE );
    		memDC.SetTextColor(RGB(0xFF, 0xFF, 0xE0) );
    		memDC.TextOut( rect.left+2, rect.top+1, sItem );       	
      	        hItem = GetNextVisibleItem( hItem );
             }	
    	dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(),           &memDC, rcClip.left, rcClip.top, SRCCOPY );
    }
    il faut juste rajouter un test au milieu pour determiner quel item tu dois traiter ou non.

  3. #3
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    j'ai une erreur sur la compile de ton code

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
     memDC.TextOut( rect.left+2, rect.top+1, sItem );
    sur cette ligne , c'est qui sItem ?

    SBP

  4. #4
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    bon oubli� la question pr�c�dente j'ai trouv� mais j'ai quand meme un autre probleme , j'ai fais un petit projet rapide avec une classe deriv� de CTreeCtrl pour teste ce code et voila je passe jamais dans la fonction Paint surcharger , quelqu'un saurait-il pourquoi ?

    voila comment je cr�e mes item

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    	HTREEITEM test;	
    	HTREEITEM racine = m_Tree.InsertItem(&RootTreeView);	
     
    	test = m_Tree.InsertItem(TVIF_TEXT| TVIF_IMAGE | TVIF_SELECTEDIMAGE,"test",0,0,0,0,0,racine,TVI_ROOT); 
     
    	test = m_Tree.InsertItem(TVIF_TEXT| TVIF_IMAGE | TVIF_SELECTEDIMAGE,"test 2",0,0,0,0,0,racine,TVI_ROOT);
    merci d'avance

  5. #5
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    tu as bien l:
    ON_WM_PAINT()
    dans ton BEGIN_MESSAGE_MAP ?
    sitem c'etait une erreur de copier coller c'est str bien sur .

  6. #6
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    oui je l'ai dans la DLG qui me sert de base , d'ailleur il me semble que le code ne passe que par le paint de la DLG et non par le paint du tree , voila le r�el probl�me

  7. #7
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    re,
    le paint est a redefinir dans la classe deriv�e du ctreectrl pas dans la dialogue .

  8. #8
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    c'est bien ce que j'ai fais , n�amoins le WM_ONPAINT de ma fenetre pointe sur un Onpaint de la DLG et apparament c'est uniquement celui la qui est execut�

    SBP

  9. #9
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    bon on reprend :
    exemple pour ma classe CDirTreeCtrl:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    BEGIN_MESSAGE_MAP(CDirTreeCtrl, CTreeCtrl)
    	//{{AFX_MSG_MAP(CDirTreeCtrl)
    	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
    	ON_WM_LBUTTONDOWN()
    	ON_WM_KEYDOWN()
    	ON_WM_PAINT()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    //---------------------------------------------------------------
    void CDirTreeCtrl::OnPaint() 
    {		
    ....
    tu as bien cette config au niveau du treeCtrl.?
    met entre commentaire l'appel du paint (message et fonction) au niveau de la dialog .


  10. #10
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    merci , c'est bon j'ai trouv� . je suis vraiement nul j'avais pas d�clarer correctement le paint dans le TreeCtrl , ca marche maintenant merci

    SBP

  11. #11
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    Il reste toutefois un petit probleme , avec ce code ( voir message ci-dessus ) on ne voit plus la selection d'un item . Je m'explique avec l'objet simple lorsqu'un item est selectionn� sont background change de couleur et permet ainsi de le diff�renti� mais ici on ne voit plus rien a part un petit morceaux de cadre sur la gauche .

    Quelqu'un a une id�e ?

    SBP

  12. #12
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    oui tu peux filtrer sur les items en selection :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
    if ( !(GetItemState( hItem, selflag ) & selflag )
    {
    // le traitement .
    }

  13. #13
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    j'ai du mal m'expliquer , ton code me permet de filter le changement de couleur du texte hors c'est pas ca mon probleme.

    Lorque je selectionne un item dans un Tree classique , le texte de l'item se retrouve dans un cadre de couleur fonc� ce qui ne marche plus avec ta modif , hors moi je voudrais bien conserv� ce cadrage color�.

    SBP

  14. #14
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    bon je recommence :
    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
     
    //---------------------------------------------------------------
    void CDirTreeCtrl::OnPaint() 
    {		
    	// TODO: Add your message handler code here
     
    	// Do not call CTreeCtrl::OnPaint() for painting messages
           CPaintDC dc(this);
     
    	CDC memDC;
    	memDC.CreateCompatibleDC( &dc );
     
    	CRect rcClip, rcClient;
    	dc.GetClipBox( &rcClip );
    	GetClientRect(&rcClient);
     
     
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    	memDC.SelectObject( &bitmap );
     
    	CRgn rgn;
    	rgn.CreateRectRgnIndirect( &rcClip );
    	memDC.SelectClipRgn(&rgn);
    	rgn.DeleteObject();
     
    	// laisser le controle se dessiner
    	CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
     
           HTREEITEM hItem = GetFirstVisibleItem();
     
           UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
    	int n = GetVisibleCount()+1;
    	while( hItem && n--)
    	{
                 // changement de couleur uniquement si pas selectionné .
                  if ( !(GetItemState( hItem, selflag ) & selflag )
                 {
    		CRect rect;		
        	       CString str= GetItemText( hItem );
      	       GetItemRect( hItem, &rect, TRUE );
    		memDC.SetTextColor(RGB(0xFF, 0xFF, 0xE0) );
    		memDC.TextOut( rect.left+2, rect.top+1, sItem );       	
      	        hItem = GetNextVisibleItem( hItem );
                 }
             }	
    	dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(),           &memDC, rcClip.left, rcClip.top, SRCCOPY );
    }
    la modif precedente permet de filter l'item en selection .
    c'est mieux ?

  15. #15
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    j'ai l'impr�ssion de jou� une scene de la cit� de la peur la , toi tu parle de caravane et moi de berger allemand.

    bon je reprend , ton code marche tr�s bien mais ce qu'il fait n'est pas ce que je cherche a faire .
    Je voudrais ( comme avec un treectrl classique ) que quand je clique sur un element celui-ci apparaisse sur fond color� comme lorsqu'on selectionne du texte dans ce message

    SBP

  16. #16
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    re,
    correction du code :
    les items apparaissent (pour mon exemple ) en rouge
    si on click sur un item la couleur de fond de base et d'ecriture reste inchang�e (couleur d'origine blanc sur fond bleu)
    si tu veux changer �a aussi il faut le traiter . (ce qui n'est pas tres dur) .

    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
     
    UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
        int n = GetVisibleCount()+1;
        while( hItem && n--)
        {
                 // changement de couleur uniquement si pas selectionné .
    		if ( !(GetItemState( hItem, selflag ) & selflag ))
    		{
    			CRect rect;      
    			CString str= GetItemText( hItem );
    			GetItemRect( hItem, &rect, TRUE );
    			memDC.SetTextColor(RGB(255,   0,   0));
    			memDC.TextOut( rect.left+2, rect.top+1, str );   		
    		}
    		hItem = GetNextVisibleItem( hItem );
    	}

  17. #17
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    code final:
    cette version gere la couleur d'affichage de l'item ,
    ecrit le texte avec la fonte du controle.
    met un autre couleur de fond et d'ecriture quand l'item est en selection.
    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
     
    //---------------------------------------------------------------
    void CDirTreeCtrl::OnPaint() 
    {		
    	// TODO: Add your message handler code here
     
    	// Do not call CTreeCtrl::OnPaint() for painting messages
        CPaintDC dc(this);
     
    	// creation d'un DC en memoire .
    	CDC memDC;
    	memDC.CreateCompatibleDC( &dc );
     
    	CRect rcClip, rcClient;
    	dc.GetClipBox( &rcClip );
    	GetClientRect(&rcClient);
     
    	// seletionne un bitmap sur le DC en memoire
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
    	memDC.SelectObject( &bitmap );
     
    	// selectionne la region dans le dc en memoire
    	CRgn rgn;
    	rgn.CreateRectRgnIndirect( &rcClip );
    	memDC.SelectClipRgn(&rgn);
    	rgn.DeleteObject();
     
    	// l'actuce centrale:
    	// laisse le controle se redessiner dans le DC en memoire
    	CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
     
    // definition des couleurs :
    //    COLORREF m_clrTextColor=RGB(255,0,0);
    //   COLORREF m_clrSelBkColor=RGB(192,192,192);
     //   COLORREF m_clrSelTextColor=RGB(128,0,0);
     
        HTREEITEM hItem = GetFirstVisibleItem();
        UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
        int n = GetVisibleCount()+1;
     
       // selection de la fonte courante
        CFont *pFont = GetFont();
        CFont *pOldFont=memDC.SelectObject(pFont);
        // parcours des items 
        while( hItem && n--)
        {
            CRect rect;     
            CString str= GetItemText( hItem );
            GetItemRect( hItem, &rect, TRUE );
     
            int nsav=memDC.SaveDC(); // sauvegarde des attributs du DC
            // Item non selectionné
            if(!(GetItemState( hItem, selflag ) & selflag ))
            {         
                // couleur d'ecriture
                memDC.SetTextColor(m_clrTextColor);
            }
            else
            {
               // ignorer ce bloc si on veut garder la selection standard blanc sur fond bleu.
                // item en selection
                memDC.SetBkColor(m_clrSelBkColor); // fond 
                memDC.SetTextColor(m_clrSelTextColor);// ecriture
            }
            // pour repeindre le fond
            CBrush brush,*pOldBrush;
            brush.CreateSolidBrush(memDC.GetBkColor());        
            memDC.FillRect(rect,&brush);
     
            memDC.TextOut( rect.left+2, rect.top+1, str );
     
            memDC.RestoreDC(nsav); // restauration du DC 
     
            hItem = GetNextVisibleItem( hItem );
        } 
        memDC.SelectObject(pOldFont);
    // ecriture finale du bitmap.
    	dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC, rcClip.left, rcClip.top, SRCCOPY );
    }

  18. #18
    SBP
    SBP est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 22
    Par d�faut
    merci , ca marche exactement comme je le voulais.

    SBP

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 3
    Dernier message: 27/03/2008, 12h22
  2. colorer un texte dans la sortie
    Par hammag dans le forum Langage
    R�ponses: 7
    Dernier message: 23/09/2007, 06h26
  3. [ListBox] Mettre une partie du texte d'un item en gras
    Par Sergio29 dans le forum Delphi
    R�ponses: 2
    Dernier message: 28/01/2007, 19h55
  4. [JButton ]coloration du texte
    Par raph707 dans le forum AWT/Swing
    R�ponses: 1
    Dernier message: 06/03/2006, 18h47
  5. Colorer le texte d'une node d'un treeView
    Par SBP dans le forum MFC
    R�ponses: 3
    Dernier message: 28/10/2004, 19h34

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