FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, 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
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 ); } |
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 ); } |
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 çaLes 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 © 2024 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.