internal void HandleWMNotify(ref Message m) { uint pos = Win32Declarations.GetMessagePos(); Point pt = new Point(Win32Declarations.LOWORD(pos), Win32Declarations.HIWORD(pos)); pt = _ownerControl.PointToClient(pt); NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR)); if (nmhdr.code == Win32Declarations.TTN_NEEDTEXTW) { NMTTDISPINFOW dispInfo = (NMTTDISPINFOW)m.GetLParam(typeof(NMTTDISPINFOW)); _lastToolTipNode = _ownerControl.GetNodeAt(pt); _lastToolTipColumn = _ownerControl.GetColumnAt(pt); string tooltip = null; if (_lastToolTipColumn != null && _lastToolTipNode != null) { Rectangle rc = _ownerControl.GetItemBounds(_lastToolTipNode, _lastToolTipColumn); _lastNeedPlace = true; tooltip = _lastToolTipColumn.GetToolTip(_lastToolTipNode, rc, ref _lastNeedPlace); _lastItemShowRect = rc; } if (tooltip == null || tooltip.Length == 0) { dispInfo.szText = ""; dispInfo.lpszText = IntPtr.Zero; } else { dispInfo.lpszText = _toolTipPool.PinString(tooltip); } Marshal.StructureToPtr(dispInfo, m.LParam, false); } else if (nmhdr.code == Win32Declarations.TTN_SHOW && _lastNeedPlace) { Rectangle scItemShowRect = _ownerControl.RectangleToScreen(_lastItemShowRect); RECT rc = Win32Declarations.RectangleToRECT(scItemShowRect); Win32Declarations.SendMessage(Handle, (LVM)Win32Declarations.TTM_ADJUSTRECT, 1, ref rc); Win32Declarations.SetWindowPos(Handle, IntPtr.Zero, rc.left, rc.top, 0, 0, Win32Declarations.SWP_NOSIZE | Win32Declarations.SWP_NOZORDER | Win32Declarations.SWP_NOACTIVATE); m.Result = (IntPtr)1; } }