在 MFC 對話框專案中,為控制項 (按鈕、單選鈕等) 添加滑鼠懸停提示 (ToolTip) 是提升使用者體驗的基本功。本文提供一種直觀、可控的手動實現方式,雖不支援批量自動化,但邏輯清晰,適合初學者理解 MFC 訊息機制與 CToolTipCtrl 運作原理。
// 最多支援 2 個控制項提示,實際專案建議用陣列或容器管理 CToolTipCtrl m_tip[2]; CWnd* m_pSub[2]; // 控制項指標陣列
OnInitDialog)// 取得控制項指標 m_pSub[0] = GetDlgItem(IDC_RADIO1); m_pSub[1] = GetDlgItem(IDC_BUTTON1); // 建立 ToolTip 控制項,TTS_ALWAYSTIP 表示即使父視窗非活動狀態也顯示 m_tip[0].Create(m_pSub[0], TTS_ALWAYSTIP); m_tip[0].AddTool(m_pSub[0]); // 關聯控制項 m_tip[1].Create(m_pSub[1], TTS_ALWAYSTIP); m_tip[1].AddTool(m_pSub[1]); // 客製化外觀:設定提示文字顏色為藍色 m_tip[0].SetTipTextColor(RGB(0, 0, 255)); // 設定提示顯示延遲時間 (毫秒),此處 150ms 快速響應 m_tip[0].SetDelayTime(150);
PreTranslateMessageToolTip 控制項需要接收滑鼠移動、點擊等訊息才能判斷何時顯示/隱藏。必須在對話框的 PreTranslateMessage 中手動轉發:
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
if (m_tip[0].m_hWnd != NULL) m_tip[0].RelayEvent(pMsg);
if (m_tip[1].m_hWnd != NULL) m_tip[1].RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
OnMouseMove)捕捉滑鼠移動訊息,即時為不同控制項設定專屬提示內容:
void CMyDialog::OnMouseMove(UINT nFlags, CPoint point)
{
m_tip[0].UpdateTipText(_T("VC知識庫歡迎您!"), m_pSub[0]);
m_tip[1].UpdateTipText(_T("https://vckbase.com"), m_pSub[1]);
CDialog::OnMouseMove(nFlags, point);
}
編譯執行,將滑鼠移至單選鈕與按鈕上,即可看到藍色字體、快速響應的自訂 ToolTip 效果。
此法需為每個控制項手動建立 CToolTipCtrl 實例、關聯、轉發訊息,無法批量生產,不符合 OO 封裝精神。實際專案建議:
CToolTipManager 類別,內部維護控制項與提示文字的映射表。TTN_NEEDTEXT 通知訊息動態提供提示文字,實現「一個 ToolTip 服務全對話框」。EnableToolTips(TRUE) 配合 ON_NOTIFY_EX(TTN_NEEDTEXT...) 實現更優雅的架構。