許多 C++ Builder 開發者在將主菜單 (TMainMenu) 放入工具欄 (TToolBar) 時,都會遇到一個棘手的問題:系統會自動為菜單項添加熱鍵 (英文項目在首字母加底線,中文項目在後方加上如 (Y)、(Z) 這類快捷鍵),導致開發者自行定義的快捷鍵 (如 Ctrl+A、F1、Ctrl+Alt+D 等) 完全失效。即使將 AutoHotkeys 屬性設為 maManual 也無法解決。
經過高手 (BCB_FANS、JSP) 指點,原來當菜單放入工具欄後,運行時顯示的並非設計時的 TMainMenu,而是一個臨時建立的 TPopupMenu。這個臨時菜單的 AutoHotkeys 預設為 maAutomatic,且無法從外部控制其屬性,因此會自動添加快捷字元。
核心思路是攔截臨時菜單的建立過程,移除系統自動添加的熱鍵。具體實現步驟如下:
OnClick 或菜單彈出前的事件中,獲取即將顯示的臨時 TPopupMenu 實例。AutoHotkeys 屬性設為 maManual。Caption 中系統添加的快捷鍵標記 (如 & 符號或括號內的字母)。經測試,此法可完美保留開發者自訂的快捷鍵,且不影響菜單正常顯示與操作。
若為 TMainMenu 設置了 Images 屬性 (即菜單項帶圖片),英文菜單的自動熱鍵問題會消失,但中文菜單問題依然存在。這可能與 VCL 內部繪製邏輯有關,暫時無完美解釋,但上述方案對兩種情況均有效。