It is very easy to create in-place toolTips on your own control. For example, you can place one on a treeview control.
Step 1
In the window’s header file, you must add a CToolTipCtrl instance and a TOOLINFO member. Also, you need to add a message map to handle the mouse messages.
protected: afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnMouseLeave(WPARAM wPawam, LPARAM lParam); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CToolTipCtrl m_toolTip; TOOLINFO m_ti;
Step 2
In the window’s implementation file, add the following to the end of Create to set the ToolTips.
m_toolTip.Create(this); m_ti.cbSize = sizeof(m_ti); m_ti.uFlags = TTF_IDISHWND|TTF_TRACK|TTF_ABSOLUTE |TTF_TRANSPARENT ; m_ti.hwnd = m_hWnd; m_ti.hinst = NULL; m_ti.uId = (UINT)m_hWnd; m_ti.lpszText = LPSTR_TEXTCALLBACK; m_ti.rect.left = 0; m_ti.rect.top = 0; m_ti.rect.right = 0; m_ti.rect.bottom = 0; m_toolTip.SendMessage(TTM_ADDTOOL, 0, (LPARAM)&m_ti);
At the bottom of the message map, add the following:
ON_WM_MOUSEMOVE() ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) END_MESSAGE_MAP()
Finally, add the message handler method as entered in the message map:
void CChildView::OnMouseMove(UINT nFlags, CPoint point) { CDemoItem* pItem = GetItemAtPt(point); if(pItem == NULL) { m_toolTip.SendMessage(TTM_TRACKACTIVATE, FALSE, (LPARAM)&m_ti); return; } RECT rect; GetItemRect(pItem, &rect); POINT pt; TRACKMOUSEEVENT tk; tk.cbSize = sizeof(tk); tk.dwFlags = TME_LEAVE; tk.dwHoverTime = 0; tk.hwndTrack = m_hWnd; _TrackMouseEvent(&tk); pt.x = rect.left - 3; pt.y = rect.top - 2; ClientToScreen(&pt); m_toolTip.SendMessage(TTM_TRACKPOSITION, 0, (LPARAM)MAKELPARAM(pt.x, pt.y)); m_toolTip.SendMessage(TTM_TRACKACTIVATE, TRUE, (LPARAM)&m_ti); } void CChildView::OnMouseLeave(WPARAM wPawam, LPARAM lParam) { m_toolTip.SendMessage(TTM_TRACKACTIVATE, FALSE, (LPARAM)&m_ti); }