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

VC++ 對話框控制項工具提示實現:CToolTipCtrl 完整使用指南

     編輯:VC 教學

工具提示 讓使用者滑鼠懸停按鈕即顯示說明文字,是友好介面的基本要素。MFC 提供 CToolTipCtrl 封裝類,本文示範在對話框中為按鈕 (或任意控制項) 添加工具提示的標準四步驟。

實作步驟

1. 類別成員新增 ToolTip 控制項變數

class CMyDlg : public CDialog {
    // ...
    CToolTipCtrl m_tt; // 工具提示控制項
    // ...
};

2. OnInitDialog 中建立與配置

BOOL CMyDlg::OnInitDialog() {
    CDialog::OnInitDialog();

    // 1. 啟用視窗工具提示支援
    EnableToolTips(TRUE);

    // 2. 建立 ToolTip 控制項 (this 為父視窗)
    if (!m_tt.Create(this)) {
        TRACE0("建立 ToolTip 失敗\n");
        return TRUE;
    }

    // 3. 啟用 ToolTip
    m_tt.Activate(TRUE);

    // 4. 為控制項添加提示文字
    // 原型: BOOL AddTool(CWnd* pWnd, LPCTSTR lpszText, LPCRECT lpRectTool=NULL, UINT_PTR nIDTool=0)
    m_tt.AddTool(GetDlgItem(IDC_BUTTON1), _T("這是一個測試按鈕"));

    // 可選:自訂外觀與行為
    m_tt.SetTipTextColor(RGB(0, 0, 255)); // 提示文字藍色
    m_tt.SetTipBkColor(RGB(255, 255, 200)); // 背景淡黃
    m_tt.SetDelayTime(150); // 懸停 150ms 顯示 (預設 ~500ms)

    return TRUE;
}

3. 重載 PreTranslateMessage 轉發滑鼠訊息

關鍵步驟: ToolTip 控制項需接收 WM_MOUSEMOVE 等訊息才能判斷懸停,必須在訊息迴圈中轉發。

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) {
    // 將訊息轉發給 ToolTip 處理
    m_tt.RelayEvent(pMsg);
    return CDialog::PreTranslateMessage(pMsg);
}

進階用法

  • 動態修改提示文字: m_tt.UpdateTipText(_T("新文字"), GetDlgItem(IDC_BUTTON1));
  • 矩形區域提示 (非控制項): m_tt.AddTool(this, _T("區域提示"), &rect, 100); (需唯一 nIDTool)。
  • 多行提示: 文字中插入 \n,並設定 m_tt.SetMaxTipWidth(300);。
  • 球狀樣式 (WinXP+): m_tt.Create(this, TTS_BALLOON);。

常見坑點

  1. 忘記 PreTranslateMessage 中 RelayEvent → 提示永不顯示。
  2. AddTool 在 Create 之前調用 → 失敗。
  3. 對話框未呼叫 EnableToolTips(TRUE) → 部分情況下不生效。
  4. 控制項 ID 為 IDC_STATIC (0xFFFF) 時 AddTool 可能失效,需指定 nIDTool 區分。

此法適用於所有 CWnd 衍生類 (含 CFrameWnd、CView),是 MFC 專案添加 ToolTip 的標準做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved