bonjour
quelqu'un saurait-il comment on pourrait colorer un item unique d'un treectrl ?
merci d'avance
SBP
bonjour
quelqu'un saurait-il comment on pourrait colorer un item unique d'un treectrl ?
merci d'avance
SBP
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
il faut juste rajouter un test au milieu pour determiner quel item tu dois traiter ou non.
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 ); }
![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
j'ai une erreur sur la compile de ton code
sur cette ligne , c'est qui sItem ?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 memDC.TextOut( rect.left+2, rect.top+1, sItem );
SBP
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
merci d'avance
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);
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 .
![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
re,
le paint est a redefinir dans la classe deriv�e du ctreectrl pas dans la dialogue .
![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
bon on reprend :
exemple pour ma classe CDirTreeCtrl:
tu as bien cette config au niveau du treeCtrl.?
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() { ....
met entre commentaire l'appel du paint (message et fonction) au niveau de la dialog .
![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
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
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 . }![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
bon je recommence :
la modif precedente permet de filter l'item 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 //--------------------------------------------------------------- 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 ); }
c'est mieux ?
![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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
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 ); }![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
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 ); }![]()
Ce qui est affirm� sans preuve peut �tre ni� sans preuve Euclide.
Les conversions num�riques en C,C++,C++/CLI
DLL d'extensions : �criture d'un plug-in de classe
D�marrer avec les MFC 2/2
Cr�ation d'un ActiveX MFC
Int�gration d'une imprimante PDF pour �ditions automatis�es
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
D�marrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
merci , ca marche exactement comme je le voulais.
SBP
Partager