| 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)
{
* pResult = 0 ;
CPoint Point;
DWORD dwPos;
dwPos = GetMessagePos ();
Point.x = LOWORD (dwPos);
Point.y = HIWORD (dwPos);
m_DirTree.ScreenToClient ( & Point );
UINT Flags = TVHT_ONITEMLABEL;
HTREEITEM ht = m_DirTree.HitTest ( Point ,& Flags );
}
|
la variable m_DirTree est un CTreeCtrl.
|
| 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 ()
{
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 ();
CWnd:: DefWindowProc ( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
HTREEITEM hItem = GetFirstVisibleItem ();
UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
int n = GetVisibleCount ()+ 1 ;
CFont * pFont = GetFont ();
CFont * pOldFont= memDC.SelectObject (pFont);
while ( hItem & & n- - )
{
CRect rect;
CString str= GetItemText ( hItem );
GetItemRect ( hItem, & rect, TRUE );
int nsav= memDC.SaveDC ();
if (! (GetItemState ( hItem, selflag ) & selflag ))
{
memDC.SetTextColor (m_clrTextColor);
}
else
{
memDC.SetBkColor (m_clrSelBkColor);
memDC.SetTextColor (m_clrSelTextColor);
}
CBrush brush,* pOldBrush;
brush.CreateSolidBrush (memDC.GetBkColor ());
memDC.FillRect (rect,& brush);
memDC.TextOut ( rect.left+ 2 , rect.top+ 1 , str );
memDC.RestoreDC (nsav);
hItem = GetNextVisibleItem ( hItem );
}
memDC.SelectObject (pOldFont);
dc.BitBlt ( rcClip.left, rcClip.top, rcClip.Width (),
rcClip.Height (), & memDC, rcClip.left, rcClip.top, SRCCOPY );
}
|
|
Consultez les autres F.A.Q.
|
|
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.