CTreeCtrl: Tooltips für Tree-Items

ollschke

Grünschnabel
Hi!

Für ein Treeview verwende ich Tooltips, die beim Drüberfahren mit der Maus über ein Treeitem immer einen passenden Text anzeigen soll. Ich habe dafür folgenden Code

Code:
	RECT itemRect; 
	//get tool tip
	CToolTipCtrl* p_tTCtrl = m_cTreeCtrl.GetToolTips();
	//get coordinates of the tree-item
	BOOL b = m_cTreeCtrl.GetItemRect(htreeItem, &itemRect, 0);
	//to enforce linefeeds
	int i = p_tTCtrl->SetMaxTipWidth(400);
	//link tree-item with own tooltip-string
	b = p_tTCtrl->AddTool(&m_cTreeCtrl, "string angepasst an tree-item", &itemRect, nTipCounter++);

Dieser Codeblock wird für jedes Tree-Item durchlaufen und zwar dann wenn der Baum aufgebaut wird. Soweit funktioniert das.

Da der ganze Baum aber nicht in das Fenster von dem Treeview passt, wird von CTreeCtrl automatisch ein Scrollbar dargestellt. Wenn ich scrolle, sich also der Inhalt verschiebt, bekomme ich immer noch so die Tooltips angezeigt, wie wenn ich noch im ungescrollten Zustand wäre. Dass sich die relativen Koordinaten verschoben haben, wird also gar nich berücksichtigt.

Weiß jemand von euch einen kleine Workaround? Wäre sehr dankbar!

Viele Grüße
Olli
 
Da scheint es einfacher zu sein, ein einziges Tool für den kompletten Tree zu verwenden statt bei jedem Item ein einzelnes Tool zu verwenden. Dem Tool verpasst du das Flag LPSTR_TEXTCALLBACK und bekommst im Parent die TTN_NEEDTEXT Notify Message. Wenn die kommt, holst du dir über HitTest das Item unter dem Mauszeiger und darüber den passenden Text.

Ein Nachteil: Du müsstest bei einem angezeigten Tooltip prüfen, wenn sich die Maus bewegt. Und wenn die Maus über einem anderen Item auftaucht, den Tooltip-Text per Hand updaten.

Irgendwie ist beides nicht so dolle. Übrigens, deine Methode müsste auch Probleme geben, wenn du einen Zweig vom Baum auf oder zuklappst. Oder du berechnest dann die Rects der Tools wieder neu.
 
Endurion hat gesagt.:
Irgendwie ist beides nicht so dolle. Übrigens, deine Methode müsste auch Probleme geben, wenn du einen Zweig vom Baum auf oder zuklappst. Oder du berechnest dann die Rects der Tools wieder neu.

Stimmt, das funktioniert nicht auch nicht! Ich hab' schon probiert, die Rects der Tool neu zu berechnen, jedes Mal wenn die OnPaint-Methode aufgerufen wird. Das funktioniert aber auch nicht.
Scheint sich also um eine etwas aufwendigere Angelegenheit zu handeln. Vielen Dank erstmal!

Olli
 
Hi!
Vielen Dank, mit deiner Hilfe funktioniert's!

Nachdem das Tooltip erzeugt wird, wird es als leeres Tooltip dem gesamten Treeview hinzugefügt.

Code:
m_cTreeCtrl.GetClientRect(&rect);
int i = p_tTCtrl->SetMaxTipWidth(0);
BOOL b = p_tTCtrl.AddTool(&m_cTreeCtrl, LPSTR_TEXTCALLBACK , &rect, 0);

Dann muss für die TTN_NEEDTEXT Notify Message ein Handler geschrieben werden

Code:
BOOL ParentOfTreeControl::OnToolTipNotify( UINT id, NMHDR * pTTTStruct, LRESULT * pResult )
{
	//get struct for tooltip-text
	TOOLTIPTEXT* pTTTA = (TOOLTIPTEXT*)pTTTStruct;

	//always done in MFC-examples
	if(!(pTTTA->uFlags & TTF_IDISHWND))
	     return FALSE;

	//get tool tip-Control
	CToolTipCtrl* p_tTCtrl = m_cTreeCtrl.GetToolTips();
	
	//get Mouse coordinates
	POINT pt;
	GetCursorPos(&pt);
	//map the coordinates on client
	m_cTreeCtrl.ScreenToClient(&pt);

	//Check if mouse moved over the tree item
	//if not return false
	HTREEITEM hCurrent = m_cTreeCtrl.HitTest(pt, NULL);
	if(!hCurrent)
                    //no tree item
	    return FALSE;
                /*
	Missing here: collect text deposited in the tree-item	
	*/
	//Update tooltip text
                pTTTA->lpszText = text;	
	*pResult = 0;
   	return TRUE;  
}

Auf Mausbewegung musste ich gar nicht mehr prüfen. Es funktioniert auch so.
:) :)
 
Zurück