工具列按鈕預設有 ToolTip,但視圖類 (CView) 客戶區無內建支援。影像處理、圖表應用常需在滑鼠移動時即時顯示像素座標、數值等資訊。
class CTestView : public CView
{
CToolTipCtrl m_ToolTip;
CString m_strTip;
CRect m_rcClient;
enum { IDC_TIP = 12345 }; // 自訂工具 ID,避免衝突
};
void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{
m_strTip.Format(_T("%d, %d"), point.x, point.y);
GetClientRect(&m_rcClient);
// 移除舊工具並重新加入 (或使用 UpdateTipText)
m_ToolTip.DelTool(this, IDC_TIP);
m_ToolTip.AddTool(this, m_strTip, &m_rcClient, IDC_TIP);
m_ToolTip.Activate(TRUE);
CView::OnMouseMove(nFlags, point);
}
LRESULT CTestView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN:
case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP:
case WM_MOUSEMOVE:
{
MSG msg;
msg.hwnd = m_hWnd;
msg.message = message;
msg.wParam = wParam;
msg.lParam = lParam;
m_ToolTip.RelayEvent(&msg); // 關鍵:讓 ToolTip 內部追蹤滑鼠位置
}
break;
}
return CView::WindowProc(message, wParam, lParam);
}
m_ToolTip.UpdateTipText(m_strTip, this, IDC_TIP) 僅更新文字。AddTool,每組指定不同 nIDTool。m_ToolTip.SetDelayTime(TTDT_INITIAL, 500) 設定 500ms 才顯示。TTN_NEEDTEXT 通知,動態回傳富文本或圖示。
void CTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_ToolTip.Create(this, TTS_ALWAYSTIP | TTS_NOPREFIX);
m_ToolTip.Activate(TRUE);
m_ToolTip.SetDelayTime(TTDT_AUTOPOP, 5000);
m_ToolTip.SetDelayTime(TTDT_RESHOW, 200);
}
同樣技巧適用於 CScrollView、CFormView、CDialog 等任何 CWnd 衍生類,只需確保訊息迴圈能將滑鼠訊息傳遞給 RelayEvent。