BEGIN_MESSAGE_MAP(CTipListCtrl, CListCtrl) //{{AFX_MSG_MAP(CTipListCtrl) ON_WM_MOUSEMOVE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTipListCtrl message handlers void CTipListCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_bEnableTips) { CString str; LVHITTESTINFO lvhti; // 判断鼠标当前所在的位置(行, 列) lvhti.pt = point; SubItemHitTest(&lvhti); // 如果鼠标移动到另一个单元格内, 则进行处理; 否则, 不做处理 if((lvhti.iItem != m_nItem) || (lvhti.iSubItem != m_nSubItem)) { // 保存当前鼠标所在的(行,列) m_nItem = lvhti.iItem; m_nSubItem = lvhti.iSubItem; // 如果鼠标移动到一个合法的单元格内,则显示新的提示信息 // 否则, 不显示提示 if((m_nItem != -1) && (m_nSubItem != -1)) { // @@@@@@@@ 在这里修改要显示的提示信息 // 这里仅仅是一个例子---获得当前单元格的文字信息, 并设置为新的提示信息 str = GetItemText(m_nItem ,m_nSubItem); m_toolTip.AddTool(this, str); // 显示提示框 m_toolTip.Pop(); } else { m_toolTip.AddTool(this, _T("双击记录可查看人员详细信息并对其修改")); // 显示提示框 m_toolTip.Pop(); } } } CListCtrl::OnMouseMove(nFlags, point); } BOOL CTipListCtrl::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(::IsWindow(m_toolTip.GetSafeHwnd())) { m_toolTip.RelayEvent(pMsg); } return CListCtrl::PreTranslateMessage(pMsg); } void CTipListCtrl::OnDestroy() { CListCtrl::OnDestroy(); // TODO: Add your message handler code here // listctrl销毁时, 同时销毁 tooltipctrl m_toolTip.DestroyWindow(); m_toolTip.Detach(); } BOOL CTipListCtrl::EnableTips() { EnableToolTips(TRUE); // 创建tooltip控件 m_bEnableTips = m_toolTip.Create(this, TTS_ALWAYSTIP); if(m_bEnableTips) { m_toolTip.Activate(TRUE); m_toolTip.SetDelayTime(TTDT_INITIAL, 0); } return m_bEnableTips; }