A solution might be handling
OnToolHitTest
and displaying the tooltip yourself.
Code snippet from an existing project (edited and shortened):
INT_PTR CMyListCtrl::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
CRect rectList;
GetClientRect(&rectList);
if (!rectList.PtInRect(point))
return CListCtrl::OnToolHitTest(point, pTI);
LVHITTESTINFO tHitTest;
tHitTest.pt = point;
::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, reinterpret_cast<LPARAM>(&tHitTest));
if (tHitTest.iItem < 0)
return -1;
RECT rect;
rect.top = tHitTest.iSubItem;
rect.left = LVIR_BOUNDS;
if (!::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, tHitTest.iItem, reinterpret_cast<LPARAM>(&rect)))
return -1;
CString strTipText;
int nHeaderHeight = GetHeaderHeight();
if (tHitTest.iItem == 0 && point.y < nHeaderHeight)
{
HDITEM hdi;
TCHAR buf[255];
hdi.mask = HDI_TEXT;
hdi.cchTextMax = sizeof(buf) / sizeof(TCHAR);
hdi.pszText = buf;
GetHeaderCtrl()->GetItem(tHitTest.iSubItem, &hdi);
strTipText = hdi.pszText;
}
else
strTipText = GetItemText(tHitTest.iItem, tHitTest.iSubItem);
int nSize = strTipText.GetLength();
if (0 == nSize)
return -1;
pTI->uId = (UINT)((tHitTest.iItem << 8) + (tHitTest.iSubItem & 0xff) + 1);
pTI->rect = rect;
pTI->hwnd = m_hWnd;
pTI->lpszText = new TCHAR [++nSize];
_tcscpy(pTI->lpszText, strTipText.GetString());
pTI->hinst = NULL;
return pTI->uId;
}