Text im CTreeCtrl grau darstellen

jokey2

Erfahrenes Mitglied
Gibt es eine Möglichkeit (möglichst einfach natürlich :)), wie ich bestimmte Items in einem CTreeCtrl grau darstellen kann? Ich möchte damit diese Items als ungültig markieren. Sie sollen weiterhin auswähl- und aufklappbar sein, aber eben grau dargestellt werden.
 
Diese Lösung funktioniert zwar, verlangsamt das Tree-Control aber spürbar. Außerdem hat bei mir da der Text einen anderen Font als normalerweise, allerdings nur, wenn er nicht selektiert ist. Auch wenn ich die Selektion selber zeichne, ist der nicht-selektierte Text fett und in einem anderen Font, der selektierte Text aber normal.
Wenn mir da einer mit einem Tipp weiterhelfen könnte, wäre ich dankbar.
 
Jetzt habe ich eine bessere Lösung gefunden. Ich verwende die Customdraw-Nachricht.
Das geht so:
1. In der Message-Map folgenden Eintrag einfügen:
Code:
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
2. Im Headerfile
Code:
afx_msg void OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);
vor DECLARE_MESSAGE_MAP() einfügen (am besten zu den anderen afx_msg - Deklarationen).
3. Die Funktion OnCustomdraw als Member des von CTreeView abgeleiteten Views einfügen:
Code:
void CLeftView::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) 
     {
     	DWORD dwItemType;
     	COLORREF TextColor, BkColor;
     	NMTVCUSTOMDRAW nvcustom = *((NMTVCUSTOMDRAW*)pNMHDR);
     
     	*pResult = 0;
     
     	switch(nvcustom.nmcd.dwDrawStage)
     	{
     	case CDDS_PREPAINT:
     		*pResult = CDRF_NOTIFYITEMDRAW;
     		break;
     	case CDDS_ITEMPREPAINT:
     		dwItemType = nvcustom.nmcd.lItemlParam;
     		 if ((nvcustom.nmcd.uItemState & CDIS_SELECTED))
     		 {
     			 BkColor = GetSysColor(COLOR_HIGHLIGHT);
     			 TextColor = GetSysColor(COLOR_HIGHLIGHTTEXT);
     			 SetBkColor(nvcustom.nmcd.hdc, BkColor);
      		 }
     		 else
     		 {
 			switch(dwItemType)
     			{
     			case ID_TREE_PROJECT:
     				TextColor = RGB(255,0,0);
     				break;
     			case ID_TREE_GROUP:
     				TextColor = RGB(0,255,0);
     				break;
     			case ID_TREE_FILE:
     				TextColor = RGB(0,0,255);
     				break;
     			case ID_TREE_TOOL:
     				TextColor = RGB(255,255,0);
     				break;
     			case ID_TREE_NONE:
     			case ID_TREE_WS:
     			case ID_TREE_PROJECTS:
     			case ID_TREE_TOOLS:
     			default:
     				TextColor = RGB(0,0,0);
     				break;
     			}
     		}
     		 SetTextColor(nvcustom.nmcd.hdc, TextColor);
 		/*
     		Hier kann man auch noch einen anderen Font einsetzen.
     		Dann muß man aber den pResult Zeiger auf CDRF_NEWFONT setzen,
     		damit er auch verwendet wird:
     		*pResult = CDRF_NEWFONT;
     		*/
     		break;
     	}
     }
Selektierte Items werden wie immer dargestellt ('if ((nvcustom.nmcd.uItemState & CDIS_SELECTED))'), die anderen bekommen je nach lParam des Items eine bestimmte Farbe (hier Rot, Grün, Blau und Gelb). Das läßt sich natürlich beliebig anpassen.
Diese Methode ist wesentlich schneller als die von dem obenstehenden Link und es gibt keine Probleme mit dem Font.

Viel Spaß beim verwenden.
 
Zuletzt bearbeitet:
Hi,
wie übergibst du den lParam an das Items ?
Ein kleines Beispiel währe nicht schlecht.

Würd mich über eine Antwort freuen, danke.
 
In der TVITEMEX-Struktur (und ich glaube auch in der TVITEM-Struktur) gibt es das Member 'lParam'. Das ist ein Parameter, den Du dem Item mitgeben kannst (z.B. ein Zeiger oder eine ID). Mit SetItem(...) kannst Du den zuweisen.
 
Ja danke.
Ich versuche das ganze nicht in einem CTreeView sondern auf einem CDialog.
Habe auf dem CDialog ein CTreeCtrl-Objekt gesetzt und versuche die Einträge in unterschiedlichen Farben dazustellen. Kann mir von euch jemand weiterhelfen ?
Wenn ich euer Beispiel so übernehmen geht das leider nicht.
Die OnCustomdraw hab ich in CDialog gesetzt.

Würd mich freuen, wenn ihr mir weiterhelfen könnt.
bye.
 
Hallo,

ich habe das probiert, der lparam Wert ist aber immer 0? Ich habe diesen Wert mit der Funktion InsertItem gesetzt:
Code:
wkSelect[MSEL_CONF_COMPARE] = tc.InsertItem(TVIF_IMAGE | TVIF_TEXT | TVIF_SELECTEDIMAGE, _T("Compare Files"), 4, 4, 0, 0, MSEL_CONF_COMPARE, wkSelect[MSEL_CONF_INFO], NULL);

Danke,
mspoerr
 
Du mußt der Maske (1. Parameter) noch das Flag 'TVIF_PARAM' hinzufügen. Sonst wird lParam ignoriert.
 

Neue Beiträge

Zurück