Enhanced Title Tip Handling
Posted
by Leonid Prokopovich
on June 19th, 1999
Environment:This code was compiled with VC++ 6.0 and will work under both UNICODE and ANSI.
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
{
LVHITTESTINFO hi;
int nItem;
CRect rectCell;
TCHAR szText[81];
LVITEM lvi;
// Do nothing in non-report mode
if( !(GetStyle() & LVS_REPORT) )
return(-1);
// 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.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_INDENT;
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 );
}

Comments
And yet another way...
Posted by Legacy on 11/08/2001 12:00amOriginally posted by: Luis Garcia
ReplyErroneous GetStringWidth
Posted by Legacy on 11/17/2000 12:00amOriginally posted by: Clemens Schmidt
Reply