首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

MFC 對話框控制項 ToolTip 顯示技巧:五步實現自訂提示文字與顏色

     編輯:VC 教學

在 MFC 對話框專案中,為控制項 (按鈕、單選鈕等) 添加滑鼠懸停提示 (ToolTip) 是提升使用者體驗的基本功。本文提供一種直觀、可控的手動實現方式,雖不支援批量自動化,但邏輯清晰,適合初學者理解 MFC 訊息機制與 CToolTipCtrl 運作原理。

實作五步驟

1. 宣告成員變數 (於對話框類別 .h 檔)

// 最多支援 2 個控制項提示,實際專案建議用陣列或容器管理
CToolTipCtrl m_tip[2];
CWnd* m_pSub[2]; // 控制項指標陣列

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

3. 訊息轉發:重寫 PreTranslateMessage

ToolTip 控制項需要接收滑鼠移動、點擊等訊息才能判斷何時顯示/隱藏。必須在對話框的 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);
}

4. 動態更新提示文字 (於 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);
}

5. 執行測試

編譯執行,將滑鼠移至單選鈕與按鈕上,即可看到藍色字體、快速響應的自訂 ToolTip 效果。

缺點與改進方向

此法需為每個控制項手動建立 CToolTipCtrl 實例、關聯、轉發訊息,無法批量生產,不符合 OO 封裝精神。實際專案建議:

  • 封裝通用 CToolTipManager 類別,內部維護控制項與提示文字的映射表。
  • 利用 TTN_NEEDTEXT 通知訊息動態提供提示文字,實現「一個 ToolTip 服務全對話框」。
  • 或直接使用 MFC 內建的 EnableToolTips(TRUE) 配合 ON_NOTIFY_EX(TTN_NEEDTEXT...) 實現更優雅的架構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved