首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ MFC 工具欄按鈕 ToolTip 不顯示?改用狀態欄顯示提示信息的標準做法

     編輯:程式設計綜合問答

現象

MFC 單文檔/多文檔程序中,工具欄按鈕設置了 SetToolTipText() 或資源字符串包含 `\n` 提示文本,但鼠標懸停時**不顯示 ToolTip**,或僅顯示瞬間閃現。

原因分析

  • MFC 默認 **菜單欄、工具欄不啟用 ToolTip**,ToolTip 僅對對話框控件、視圖類窗口生效。
  • 工具欄按鈕的提示文本設計初衷是顯示在**狀態欄**的「消息行」(底部),而非懸浮氣泡。

標準解決方案:啟用狀態欄顯示按鈕提示

  1. 創建狀態欄:
    在 CMainFrame::OnCreate() 中:
if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) {
    return -1;
}
  1. 啟用狀態欄提示:
    重寫 CMainFrame::OnSetMessageString() 或確保 CFrameWnd::OnSetMessageString 正常調用(默認已實現)。
    資源字符串格式:IDR_MAINFRAME\n工具提示文本\n狀態欄文本(雙換行分隔)。
// 字符串表資源
IDR_MAINFRAME "標題\n新建文件 (Ctrl+N)\n創建一個新文檔"
  1. 確保工具欄按鈕命令 ID 與菜單項 ID 一致,MFC 通過命令 ID 自動匹配字符串資源。

若必須顯示懸浮 ToolTip(非標準)

需自行實現:
1. 重寫 CToolBar::OnToolHitTest() 返回 TTN_NEEDTEXT 結構。
2. 或使用 CToolTipCtrl 子類化工具欄,手動 AddTool()、RelayEvent()。
不推薦:增加維護成本,違背 Windows UI 規範(用戶習慣看底部狀態欄)。

驗證清單

  • 狀態欄已創建且可見(WS_VISIBLE | CBRS_BOTTOM)。
  • 字符串表中命令 ID 對應條目包含 `\n` 分隔的三段文本。
  • 按鈕命令 ID (如 ID_FILE_NEW) 與菜單項、字符串資源 ID 完全一致。
  • 未在 CMainFrame 中誤重寫 OnSetMessageString 導致攔截。

遵循 MFC 文檔/視圖架構設計意圖:**工具欄提示 → 狀態欄**,用戶體驗一致、代碼零成本。

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