Click here to Skip to main content
15,885,309 members
Articles / Desktop Programming / MFC

CTreeCtrl\CListCtrl\CListBox With ToolTip Based On the Item Data

Rate me:
Please Sign up or sign in to vote.
4.22/5 (16 votes)
24 Jan 20023 min read 200.5K   5.3K   32  
A CTreeCtrl derived class providing tooltips based on item data
// TreeCtrlCh.cpp : implementation file
//Written By Ran Wainstein 02/01/2002 
//Thanks to yaniv ben ari 

#include "stdafx.h"
#include "TreeCtrlCh.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlCh

CTreeCtrlCh::CTreeCtrlCh()
{
}

CTreeCtrlCh::~CTreeCtrlCh()
{

}


BEGIN_MESSAGE_MAP(CTreeCtrlCh, CTreeCtrl)
	//{{AFX_MSG_MAP(CTreeCtrlCh)
	ON_WM_LBUTTONDOWN()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlCh message handlers

void CTreeCtrlCh::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CTreeCtrl::PreSubclassWindow();
	EnableToolTips(TRUE);
}


int CTreeCtrlCh::OnToolHitTest(CPoint point, TOOLINFO * pTI) const
{
	RECT rect;

	UINT nFlags;
	HTREEITEM hitem = HitTest( point, &nFlags );
	if( nFlags & TVHT_ONITEMLABEL  )
	{
	

		GetItemRect( hitem, &rect, TRUE );
		pTI->hwnd = m_hWnd;
		pTI->uId = (UINT)hitem;
		pTI->lpszText = LPSTR_TEXTCALLBACK;
		pTI->rect = rect;
		return pTI->uId;
	}
	
	return -1;
}

//here we supply the text for the item 
BOOL CTreeCtrlCh::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
	// need to handle both ANSI and UNICODE versions of the message
	TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
	TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
	CString strTipText;
	UINT nID = pNMHDR->idFrom;
	// Do not process the message from built in tooltip 
	if( nID == (UINT)m_hWnd &&
		(( pNMHDR->code == TTN_NEEDTEXTA && pTTTA->uFlags & TTF_IDISHWND ) ||
		( pNMHDR->code == TTN_NEEDTEXTW && pTTTW->uFlags & TTF_IDISHWND ) ) )
		return FALSE;

	// Get the mouse position
	const MSG* pMessage;
	CPoint pt;
	pMessage = GetCurrentMessage(); // get mouse pos 
	ASSERT ( pMessage );
	pt = pMessage->pt;
	ScreenToClient( &pt );

	UINT nFlags;
	HTREEITEM hitem = HitTest( pt, &nFlags ); //Get item pointed by mouse

	
	strTipText.Format( "%s", GetItemText( (HTREEITEM ) nID));  //get item text
	DWORD dw = GetItemData((HTREEITEM ) nID); //get item data
	ItemDataABSTRACT* ItemData = (ItemDataABSTRACT*)dw; //CAST item data
	if (ItemData!=NULL)
	{
		CString s = ItemData->GetToolTipString(); //pure virtual function
		strTipText=" " + s; //add node text to node data text
	}
#ifndef _UNICODE
	if (pNMHDR->code == TTN_NEEDTEXTA)
		lstrcpyn(pTTTA->szText, strTipText, 80);
	else
		_mbstowcsz(pTTTW->szText, strTipText, 80);
#else
	if (pNMHDR->code == TTN_NEEDTEXTA)
		_wcstombsz(pTTTA->szText, strTipText, 80);
	else
		lstrcpyn(pTTTW->szText, strTipText, 80);
#endif
	*pResult = 0;

	return TRUE;    // message was handled
}

 


//delete all allocated mamory for item data 
void CTreeCtrlCh::CleanItemData()
{

	HTREEITEM root = GetFirstVisibleItem();
	if (root==NULL)
		return ;
	do 
	{
		
		DWORD data = GetItemData(root);
		if (data!=NULL)
		{
			ItemDataABSTRACT* ItemData = (ItemDataABSTRACT*)data;

			delete ItemData ;
		}
		DeleteBranchData(root);
		
	}while ((root = GetNextSiblingItem(root))!=NULL);
	
}


void CTreeCtrlCh::OnDestroy() 
{
	CleanItemData();
	CTreeCtrl::OnDestroy();
	
	// TODO: Add your message handler code here
	
}


void CTreeCtrlCh::DeleteBranchData( HTREEITEM hti)
{
        if( ItemHasChildren( hti ) )
		{
			
            hti = GetChildItem( hti );
            do
			{

				DWORD data = GetItemData(hti);
				if (data!=NULL)
				{
					ItemDataABSTRACT* ItemData = (ItemDataABSTRACT*)data;

					delete ItemData ;
				}

		
               DeleteBranchData( hti);
            }while( (hti = GetNextSiblingItem( hti )) != NULL );
        }
        
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


Written By
Web Developer
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions