FAQ VC++ et MFCConsultez toutes les FAQ

Nombre d'auteurs : 20, nombre de questions : 546, dernière mise à jour : 5 avril 2013  Ajouter une question

 

Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++

Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.

Sur ce, je vous souhaite une bonne lecture. Farscape


SommaireContrôlesCtreeCtrl (2)
précédent sommaire suivant
 

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 duCTreeCtrl 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. :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  
//---------------------------------------------------------------- 
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.

Mis à jour le 19 septembre 2005 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 .

Code c++ : Sélectionner tout
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
  
//--------------------------------------------------------------- 
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 ); 
}

Mis à jour le 19 septembre 2005 farscape

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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++