ToolTips in CTreeCtrl, wie geht das ?

NinjaOne

Erfahrenes Mitglied
Hi,
ich hab ein CTreeCtrl-Objekt in ein Dialog eingefügt und ihn per InsertItem mit Werte gefüllt. So weit so gut.
Nun meine Frage:
Wie kann ich jedem Wert ein eigenen ToolTips zuweisen?
Würd mich freuen, wenn mir jemand helfen kann.
Bitte die Antwort so einfach wie möglich halten, hab mit ToolTips noch nichts gemacht.

Bye.
 
Du erstellst ein(!) CToolTipCtrl. Mit AddTool kannst du jetzt verschiedene rechteckige Bereiche angeben, zu denen ein Text erscheinen soll. Irgendein Rind hat diese einzelnen Tooltips als "Tool" bezeichnet, nicht verwirren lassen.

Du kannst jetzt zu jedem Item ein RECT und den Text angeben (was bei scrollbarem Inhalt zu eher katastrophalen Zuständen führt).
Oder du gibst nur ein Tool mit dem Client-Rect des TreeControls an, aber als Text-Parameter übergibst du LPSTR_TEXTCALLBACK. Dadurch fragt die CToolTipControl immer beim Parent des CTreeControls über WM_NOTIFY mit TTN_NEEDTEXT an. Da kannst du aus der übergebenen Position das HTREEITEM bestimmen und den entsprechenden Text einsetzen. Fast gar nicht kompliziert, oder?

Noch zwei Haken:

Ruf für das TreeControl EnableToolTips und mit der CToolTipCtrl Activate auf.

Keuch. Schnauf. Röchel.
 
Danke für die Antwort, doch ich bekomme das mit dem ToolTips nicht hin.
Ich hab folgendes gemacht:
In CDialog:
Code:
CToolTipCtrl ToolTip;

In der OnInitDialog()-Funktion des Dialoges:
Code:
.......
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
ToolTip.Create(this);
	
m_Tree.InsertItem("Hallo1");
m_Tree.InsertItem("Hallo2");

CRect rect;
m_Tree.GetWindowRect(&rect);
ToolTip.AddTool(this,"ToolTips",&rect,ID_TOOL);
ToolTip.Activate(TRUE);
EnableToolTips(TRUE);

Bei mir wird das ToolTip-Fenster nicht angezeigt.
Kann mir jemand sagen was ich falsch mache?

danke.
 
Zuletzt bearbeitet:
Das RECT muss relativ zu den Client-Koordinaten des angegebenen Windows bei AddTool sein. In deinem Beispiel müsste ein ScreenToClient mit dem RECT des TreeControls reichen.

Ich kann nicht genau sagen, ob das dann schon reicht; ist schon etwas her.
 
Tschuldigung, in deinem Beispiel:

ToolTip.AddTool(this,"ToolTips",&rect,ID_TOOL);

Hier setzt du das Window-Rect deines Tree-Controls ein, das sind allerdings die Bildschirmkoordinaten. In der Doku steht, dass man in dem Rect die Koordinaten bezogen auf den Client-Bereich des ebenfalls übergebenen Fenster einsetzen soll.

Du hast hier this verwendet, dass ja der Parent des Tree-Controls ist. Du müsstest also das Rect verschieben. Das machst du, indem du nach dem GetWindowRect einfach

ScreenToClient( &rect );

aufrufst.
 
Hi, hab jetzt geändert:
Code:
.......
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
ToolTip.Create(this);
	
m_Tree.InsertItem("Hallo1");
m_Tree.InsertItem("Hallo2");

CRect rect;
m_Tree.GetWindowRect(&rect);
ScreenToClient(&rect);
ToolTip.AddTool(this,"ToolTips",&rect,ID_TOOL);
ToolTip.Activate(TRUE);
EnableToolTips(TRUE);
Aber es geht immer noch nicht (lol).
 
Mist, ich hatte noch was übersehen. In Dialogen klappen ToolTips bei MFC nur, wenn man die Nachrichten auch alle an das ToolTipControl weiterleitet:

Dazu PreTranslateMessage überschreiben und alle(!) Nachrichten mittels RelayEvent an das ToolTipCtrl weitergeben. Habs ausprobiert, dann klappts:

Code:
BOOL CDlgToolTipDlg::PreTranslateMessage(MSG* pMsg)
{

  if ( m_hWnd )
  {
      m_ToolTips.RelayEvent( pMsg );
      return CDialog::PreTranslateMessage( pMsg );
  }
  return FALSE;

}

Addon: Deine AddTool-Zeile, setze da statt this das HWND bzw. CWnd des Trees rein:

ToolTip.AddTool( m_Tree, "ToolTips", &rect,ID_TOOL );
 
Hey Danke, so gehts!
Aber wie geht das jetzt weiter mit jeder Eintrag ein andres ToolTip-Info?
Ich muss statt dem Text LPSTR_TEXTCALLBACK übergeben.
So weit so gut.
Aber was meinst du dann genau?
Hab keine Ahnung wie ich das mit WM_NOTIFY und TTN_NEEDTEXT anstellen soll.
Ich hoffe ich nerv nicht!!

Bye
 
Im Parent vom Tree (dürfte bei dir ja ein View oder Dialog oder wasweissich sein) müsstest du wenn möglich einen Handler von TTN_NEEDTEXT des Trees anlegen (in den Eigenschaften von dem Dialog gibt es eine Liste aller Nachrichten, meistens sind ganz unten auch die IDs der Child-Controls angegeben, dort werden dann auch diese Notification-Nachrichten aufgelistet).

Falls das nicht der Fall ist, WM_NOTIFY-Handler anlegen lassen (sollte dann OnNotify heissen) und dort prüfen, ob die Notify-Message TTN_NEEDTEXT ist (und das HWND vom Tree):

Im Default-OnNotify-Handler bekommst du ein NMHDR-Struct, da kannst du hwnd und code prüfen (hwnd sollte m_Tree.GetSafeHwnd() entsprechen, code sollte TTN_NEEDTEXT sein). Die Einzelheiten zur TTN_NEEDTEXT-Nachricht entnimmst du aber jetzt besser der MSDN.
 
Zurück