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

VC++ 為 Slider 控件添加自訂 Tooltip:CToolTipCtrl + TTN_NEEDTEXT 實作

     編輯:VC 教學

前言:預設 Tooltip 只能顯示整數位置

CSliderCtrl 內建 Tooltip 僅顯示當前位置整數值。若需顯示「總共 500 幀,目前第 13 幀」或浮點數值,必須自行實作。本文示範用 CToolTipCtrl 攔截 TTN_NEEDTEXT 訊息實現完全自訂 Tooltip。

實作步驟

1. 成員變數宣告

// 對話框類別
CSliderCtrl m_Slider;          // IDC_SLIDERTEST
CToolTipCtrl m_ToolTip;        // 自訂 Tooltip 控件

2. 訊息映射與初始化

// 訊息映射
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify)

// OnInitDialog
m_Slider.SetRange(0, 500, TRUE);
m_Slider.SetPos(0);

// 建立 Tooltip,關聯 Slider 控件
m_ToolTip.Create(GetDlgItem(IDC_SLIDERTEST));
m_ToolTip.Activate(TRUE);

3. 滑桿捲動時更新 Tooltip

void CMyDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    if (pScrollBar == (CScrollBar*)GetDlgItem(IDC_SLIDERTEST)) {
        m_ToolTip.Update();  // 觸發 TTN_NEEDTEXT
    }
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

4. TTN_NEEDTEXT 處理函數:核心自訂邏輯

BOOL CMyDialog::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
    TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;
    UINT nID = pNMHDR->idFrom;

    // idFrom 可能是 HWND,需轉換為控件 ID
    if (pTTT->uFlags & TTF_IDISHWND) {
        nID = ::GetDlgCtrlID((HWND)nID);
    }

    if (nID == IDC_SLIDERTEST) {
        // 這裡自訂 Tooltip 文字內容
        CString strTip;
        strTip.Format(_T("總共 500 幀,目前第 %d 幀"), m_Slider.GetPos());

        // 複製到 TOOLTIPTEXT 結構
        _tcscpy(pTTT->lpszText, strTip);
        pTTT->hinst = NULL;  // 不使用資源字串
        return TRUE;         // 表示已處理
    }

    return FALSE;  // 其他控件用預設處理
}

關鍵結構體:TOOLTIPTEXT

typedef struct tagTOOLTIPTEXT {
    NMHDR hdr;           // 標準通知頭 (hwndFrom, idFrom, code)
    LPTSTR lpszText;     // Tooltip 文字緩衝區 (最大 80 字元)
    char szText[80];     // ANSI 版本緩衝區
    HINSTANCE hinst;     // 若使用資源字串,此為模組句柄
    UINT uFlags;         // TTF_IDISHWND 等旗標
} TOOLTIPTEXT, *PTOOLTIPTEXT;

擴充應用:其他控件同樣適用

同樣邏輯可用於任何控件:

  • 按鈕:顯示詳細功能說明。
  • 編輯框:顯示輸入格式提示 (如「請輸入 E-mail 格式」)。
  • 列表控件:滑鼠懸停顯示完整行資料。

只需在 OnToolTipNotify 中判斷 nID 並回傳對應文字。

注意事項

  • lpszText 緩衝區僅 80 字元,長字串會被截斷,需自行控制長度。
  • TTN_NEEDTEXT 在 Tooltip 即將顯示前發送,頻率較高,處理函數務必輕量。
  • 若專案啟用 Unicode,使用 _tcscpy/CString 自動適配。

結語

攔截 TTN_NEEDTEXT 是實現完全自訂 Tooltip 的標準做法。幾行程式碼即可讓 Slider 顯示豐富資訊,同樣技巧可擴充至所有控件,大幅提升使用者體驗。

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