Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Contrôles > CtreeCtrl
        Comment récupérer l'item sélectionné par un click de souris dans un CTreeCtrl ?
        Comment personnaliser l'affichage des lignes d'un CTreeCtrl ?



Comment récupérer l'item sélectionné par un click de souris dans un CTreeCtrl ?
Créé le 19/09/2005[haut]
auteur : Farscape
Sur un CTreeCtrl il est souvent intéressant de récupérer l'item sélectionné lors d'un click gauche ou droit.
Les messages concernés sont :
NM_CLICK pour le click gauche
NM_RCLICK pour le click droit.

Voici comment procéder :
Avec l'aide de classwizard sur l'identifiant du CTreeCtrl intercepter le message NM_RCLICK. ou NM_CLICK.
Une fonction de réponse au message est générée dans la classe parent du contrôle .
Vous aurez besoin d'une variable contrôle sur le CTreeCtrl pour faire ceci:

Exemple de réponse au message généré par classwizard. :


//----------------------------------------------------------------
void CFormSav::OnClickTreeWorkSpace(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
*pResult = 0;

    // recuperation position de la souris au moment du click
CPoint Point;
    DWORD dwPos;
dwPos = GetMessagePos(); 
Point.x = LOWORD (dwPos);
Point.y = HIWORD (dwPos); 
    // conversion des coordonnées screen pour la zone cliente du TreeView
m_DirTree.ScreenToClient( &Point );
 UINT Flags = TVHT_ONITEMLABEL;
    // recuperation de l'item selectionné.
HTREEITEM ht = m_DirTree.HitTest( Point ,&Flags );
}
la variable m_DirTree est un CTreeCtrl.


Comment personnaliser l'affichage des lignes d'un CTreeCtrl ?
Créé le 19/09/2005[haut]
auteur : Farscape
Ce contrôle ne permet pas dans son implémentation de base une personnalisation des éléments à afficher.

Pour pallier ce problème il faut se substituer au dessin du contrôle d'origine du moins pour les parties qui nous intéressent.
La technique employée consistera à laisser le contrôle se dessiner dans un bitmap et de modifier par écrasement les zones intéressantes.
L'exemple qui suit permet une personnalisation des couleurs d'affichage des différents items en sélection ou non.
Le texte est écrit avec la fonte du contrôle .

Note: Pour démarrer, il faudra générer à l'aide de Classwizard une classe dérivée du CTreeCtrl et intercepter le message WM_PAINT générant ainsi la fonction de réponse OnPaint .

//---------------------------------------------------------------
void CMyTreeCtrl::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 à mettre comme données membres
//  de la classe CMyTreeCtrl 
//    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 );
}


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web