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; }