傳統 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 秒,即自動顯示對應提示字串。
CSubclassWnd 子類化主框架視窗,捕獲 WM_MENUSELECT 訊息(使用者在選單間移動時持續發送)。CPopupText(參考《有 Toolbar 功能的可重用類 CPopupText》),採系統資訊提示色(COLOR_INFOBK)與選單字體,外觀與標準 ToolTip 一致。CMenuTipManager::GetRunningMenuWnd() 透過 EnumWindows 列舉頂層視窗,尋找類別名 #32768(Windows 選單視窗類別),配合 GetMenuItemRect 計算目標項目矩形,最後在項目右側對齊顯示。EnumWindows 按 Z-order 遞減列舉,確保鍵盤叫出選單時也能正確定位。GetMessageString(UINT nID, CString&) 移植自 CFrameWnd::GetMessageString,移除對框架視窗依賴,可獨立呼叫。WM_MENUSELECT,改用 WM_ENTERIDLE 搭配 WindowFromPoint 判斷滑鼠是否仍在選單視窗內,決定是否取消提示。m_bSticky 旗標控制首次顯示延遲、後續項目立即顯示;選單關閉或執行命令時重置。GetResCommandPrompt/OnGetCommandPrompt 邏輯(留作練習)。CMenuTipManager 封裝於 MenuTipManager.h/.cpp,依賴 CSubclassWnd、CPopupText,隨附範例程式 MenuTips 演示完整效果。編譯後即可體驗選單項目旁即時提示,無需狀態列也能清晰掌握命令功能。