Enhanced Title Tip Handling

Environment:This code was compiled with VC++ 6.0 and will work under both UNICODE and

Previous submissions for Listview tooltips have used the
complicated ‘CellRectFromPoint’ function written by Zafir Anjum. With
the advent of IE3 and the common controls library version 4.70, we
now have access to a simpler method via the function SubItemHitTest

The following code uses only the ‘OnToolTipText’ function from the Zafir
Anjum significantly simplifies the code and adds new feature.
Tooltips are shown only for the cells in which text is partially visible.

int CMyLovelyListCtrl::OnToolHitTest(CPoint point, TOOLINFO * pTI) const
int nItem;
CRect rectCell;
TCHAR szText[81];

// Do nothing in non-report mode
if( !(GetStyle() & LVS_REPORT) )

// Find item and subitem under a given point
hi.pt = point;
nItem = SubItemHitTest( &hi );
if( nItem < 0 ) return(-1); // Retrieve text, image index and indent of the subitem
lvi.iItem = nItem;
lvi.iSubItem = hi.iSubItem;
lvi.pszText = szText;
lvi.cchTextMax = sizeof(szText)/sizeof(szText[0]);
lvi.iIndent = 0;
if( GetItem( &lvi ) == FALSE )
return(-1); // This should never happen, but…be paranoid

// Retrieve bounding rect of the subitem.
m_pListCtrl->GetSubItemRect( nItem, hi.iSubItem, LVIR_BOUNDS, rectCell );

// Adjust indent if subitem has icon.
if( lvi.iImage != -1 )

lvi.iIndent += 20; // icon size(16) + some spacing

// Strange, but GetStringWidth returns incorrect width of the string.
// In all cases the width of the string is less than actual.
// If somebody knows the reason please mail me.

lvi.iIndent += 16;

// Do not show tooltips if subitem is completely visible
if( GetStringWidth( szText ) + lvi.iIndent < rectCell.Width() ) return(-1); // The following code was grabbed from Zafir Anjum’s ‘Tooltip for individual cells’
pTI->rect = rectCell;
pTI->hwnd = m_hWnd;
pTI->uId = (UINT)(( nItem << 10 ) + (hi.iSubItem & 0x3ff) + 1 ); pTI->lpszText = LPSTR_TEXTCALLBACK;
return( pTI->uId );


More by Author

Must Read