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

VC++ 工具提示完整實現指南:對話框與框架視窗的兩種架構差異詳解

     編輯:VC 教學

工具提示 是現代 GUI 必備元素。MFC 透過 CToolTipCtrl 封裝,但 對話框架構 (CDialog) 與 框架視窗架構 (CFrameWnd) 的實現機制截然不同。本文系統闡述原理、兩種架構的標準實現流程、工具列/狀態列/標題列的提示添加技巧。

核心原理:TTN_NEEDTEXT 通知

ToolTip 控制項需顯示文字時,發送 TTN_NEEDTEXT 通知訊息 (WM_NOTIFY) 給父視窗,父視窗在處理函數中填入 TOOLTIPTEXT::lpszText 即可。關鍵差異在於 訊息路由機制。

一、 對話框架構 (CDialog) - 需手動處理 TTN_NEEDTEXT

CDialog 未自動路由 TTN_NEEDTEXT,開發者必須自行加入訊息映射與處理函數。

標準四步驟

  1. 啟用: EnableToolTips(TRUE); (在 OnInitDialog)。
  2. 訊息映射: ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTip) (ID 固定為 0)。
  3. 處理函數原型: afx_msg BOOL OnToolTip(UINT id, NMHDR* pNMHDR, LRESULT* pResult);。
  4. 實現:
    BOOL CMyDialog::OnToolTip(UINT, NMHDR* pNMHDR, LRESULT*) {
        TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;
        UINT nID = pNMHDR->idFrom; // 控制項 ID
    
        // 若 idFrom 實為 HWND (TTF_IDISHWND),轉換為控制項 ID
        if (pTTT->uFlags & TTF_IDISHWND)
            nID = ::GetDlgCtrlID((HWND)nID);
    
        if (nID == 0) return FALSE;
    
        switch (nID) {
        case IDOK:     pTTT->lpszText = _T("確定按鈕"); break;
        case IDCANCEL: pTTT->lpszText = _T("取消按鈕"); break;
        // ... 其他控制項
        }
        return TRUE; // 表示已處理
    }

二、 框架視窗架構 (CFrameWnd) - 自動路由 + CToolTipCtrl 成員

CFrameWnd 內建預設處理器,可自動顯示工具列按鈕的提示 (來自資源字串表)。但為了支援自定義提示 (標題列、狀態列、非工具列控制項),需額外管理 CToolTipCtrl 成員。

標準實現 (MainFrm.cpp)

  1. 成員變數: CToolTipCtrl m_ToolTip;
  2. OnCreate 建立:
    if (!m_ToolTip.Create(this, TTS_ALWAYSTIP)) return -1; // 非活動視窗也顯示
  3. PreTranslateMessage 轉發:
    BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) {
        m_ToolTip.RelayEvent(pMsg); // 關鍵:轉發滑鼠/鍵盤訊息
        return CFrameWnd::PreTranslateMessage(pMsg);
    }
  4. 添加工具 (同 OnCreate 中):
    • 標題列: CString t; GetWindowText(t); m_ToolTip.AddTool(this, t);
    • 工具列: 建立工具列時指定樣式 CBRS_TOOLTIPS | CBRS_FLYBY,MFC 自動從字串表 (ID 與按鈕 ID 相同) 讀取提示文字。
    • 狀態列: m_ToolTip.AddTool(&m_wndStatusBar, _T("狀態列")); m_ToolTip.Activate(TRUE);

三、 進階:工具列按鈕提示字串表對應規則

資源字串表中,ID 與工具列按鈕命令 ID 相同,字串格式:狀態列文字\n工具提示文字。
例:ID ID_FILE_OPEN 字串 \"開啟現有文件\nOpen\" → 狀態列顯示「開啟現有文件」,ToolTip 顯示「Open」。

總結對比

  • CToolTipCtrl 成員
  • 特性CDialog 對話框CFrameWnd 框架視窗
    TTN_NEEDTEXT 路由無自動路由,需 ON_NOTIFY_EX 手動處理有預設路由,自動處理工具列按鈕
    通常不需要 (靠訊息處理)必須 (管理非工具列提示、轉發訊息)
    PreTranslateMessage不需轉發必須 RelayEvent
    提示文字來源代碼中 switch-case 硬編碼/查表工具列自動讀字串表;其他手動 AddTool

    理解架構差異,即可在任何 MFC 專案中正確、高效地實現工具提示。

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