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

MFC 選單提示資訊 CMenuTipManager:滑鼠停留即顯示命令說明,取代狀態列

     編輯:關於VC++

傳統 MFC 應用依賴狀態列顯示選單命令提示,但在大螢幕環境下使用者往往忽略視窗底部資訊。本文介紹 CMenuTipManager 類別,實現滑鼠停留選單項目旁直接彈出 ToolTip 風格提示,資訊來源同為字串表(IDR_MAINFRAME 提示欄位),零侵入式整合,極大提升使用者體驗。

極簡整合方式

在主框架類別(CMainFrame)加入成員並於 OnCreate 安裝:

class CMainFrame : public CFrameWnd {
    CMenuTipManager m_menuTipManager;
    // ...
    int OnCreate(LPCREATESTRUCT lpCS) {
        // ...
        m_menuTipManager.Install(this); // 僅此一行
        return 0;
    }
};

之後滑鼠停留任意選單項目(主選單、系統選單、右鍵選單)超過 1 秒,即自動顯示對應提示字串。

核心技術解析

  1. 訊息攔截:利用 CSubclassWnd 子類化主框架視窗,捕獲 WM_MENUSELECT 訊息(使用者在選單間移動時持續發送)。
  2. 提示視窗實作:內建 CPopupText(參考《有 Toolbar 功能的可重用類 CPopupText》),採系統資訊提示色(COLOR_INFOBK)與選單字體,外觀與標準 ToolTip 一致。
  3. 精準定位演算法:最大難點在於取得選單視窗螢幕座標。CMenuTipManager::GetRunningMenuWnd() 透過 EnumWindows 列舉頂層視窗,尋找類別名 #32768(Windows 選單視窗類別),配合 GetMenuItemRect 計算目標項目矩形,最後在項目右側對齊顯示。
  4. 鍵盤導航支援:EnumWindows 按 Z-order 遞減列舉,確保鍵盤叫出選單時也能正確定位。
  5. 提示字串取得:靜態函數 GetMessageString(UINT nID, CString&) 移植自 CFrameWnd::GetMessageString,移除對框架視窗依賴,可獨立呼叫。

特殊情境處理

  • 右鍵選單離開偵測:右鍵選單關閉時不發送 WM_MENUSELECT,改用 WM_ENTERIDLE 搭配 WindowFromPoint 判斷滑鼠是否仍在選單視窗內,決定是否取消提示。
  • 黏性顯示機制:m_bSticky 旗標控制首次顯示延遲、後續項目立即顯示;選單關閉或執行命令時重置。
  • 停用項目提示:預設同樣顯示提示;若需區分「停用原因說明」,可擴充字串格式為「長提示\n短提示\n停用說明」,並修改 GetResCommandPrompt/OnGetCommandPrompt 邏輯(留作練習)。

原始碼結構

CMenuTipManager 封裝於 MenuTipManager.h/.cpp,依賴 CSubclassWnd、CPopupText,隨附範例程式 MenuTips 演示完整效果。編譯後即可體驗選單項目旁即時提示,無需狀態列也能清晰掌握命令功能。

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