Enhanced Title Tip Handling 

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 );

}

History

Date Posted: June 19, 1999