07-09-2015, 11:36 AM
I would show tooltips on LVN_GETINFOTIP message.
This code is in C++, copied from one of my projects.
This code is in C++, copied from one of my projects.
case LVN_GETINFOTIPW: {
NMLVGETINFOTIPW& it=*(NMLVGETINFOTIPW*)nh;
i=it.iItem; if(i<0 || i>=_nr) break;
text=_GetTooltipText(i);
if(empty(text)) _TooltipHide();
else _TooltipShow(text, i);
//__________________________________________________________________
//Shows tooltip at x y relative to _hlv.
void QmDropdown::_TooltipShow(LPCSTR text, int i)
{
TOOLINFOW ti; ZERO(ti); ti.cbSize=44;
ti.uFlags=TTF_TRACK;
ti.lpszText=Wstr(text);
if(!_htooltip) {
DWORD st=TTS_NOPREFIX|TTS_ALWAYSTIP|WS_POPUP|TTS_BALLOON;
_htooltip=CreateWindowExW(WS_EX_TOPMOST|WS_EX_TOOLWINDOW, L"tooltips_class32", 0, st, 0, 0, 0, 0, 0, 0, 0, 0);
SENDQ(_htooltip, TTM_SETMAXTIPWIDTH, 0, 500); //enable multiline
SENDQ(_htooltip, TTM_ADDTOOLW, 0, &ti);
}
else SENDQ(_htooltip, TTM_UPDATETIPTEXTW, 0, &ti);
RECT ri={}; _LvSend(LVM_GETITEMRECT, i, (LPARAM)&ri);
POINT p={ri.right, (ri.top+ri.bottom)/2}; ClientToScreen(_hlv, &p);
SENDQ(_htooltip, TTM_TRACKPOSITION, 0, MAKELONG(p.x, p.y));
SENDQ(_htooltip, TTM_TRACKACTIVATE, 1, &ti);
_isTooltip=1;
}
//__________________________________________________________________
void QmDropdown::_TooltipHide(bool destroy)
{
if(!_htooltip) return;
if(_isTooltip) {
_isTooltip=0;
TOOLINFOW ti; ZERO(ti); ti.cbSize=44;
SENDQ(_htooltip, TTM_TRACKACTIVATE, 0, &ti);
}
if(destroy) { DestroyWindow(_htooltip); _htooltip=0; }
}
long _LvSend(UINT message, WPARAM wParam=0, LPARAM lParam=0) { return SendMessageW(_hlv, message, wParam, lParam); }