標準 MainMenu 固定於視窗頂部無法移動。若需像 Office、IE 早期版本那樣可拖曳、停靠的選單列,可採用以下三種方案,由簡單到完整依序介紹。
TCoolBar,其上放 TToolBar。ToolBar 設定:ShowCaptions=true、Flat=true。TToolButton,設定 Style=tbsDropDown。TPopupMenu 設定選單項。ToolButton->DropdownMenu = PopupMenu1。缺點:選單由按鈕右側小三角觸發,非標準選單列體驗。
TCoolBar 上放兩個 TToolBar (可拖曳排序)。TSpeedButton,Flat=true、Caption="檔案"。TPopupMenu 設定項目 (開啟、結束)。SpeedButton OnClick 彈出選單:void __fastcall TForm1::SpeedButton1Click(TObject *Sender) {
TPoint Pos;
TSpeedButton *Btn = (TSpeedButton*)Sender;
Pos = Btn->ClientToScreen(TPoint(0, 0));
Pos.y += Btn->Height; // 顯示在按鈕下方
PopupMenu1->Popup(Pos.x, Pos.y);
}
優點:外觀像標準選單項,位置可隨 ToolBar 拖曳移動。
此法利用 TControlBar 的停靠機制,將 ToolBar 按鈕直接關聯 MainMenu 項目,實現真正的可移動選單列。
TControlBar (而非 CoolBar)。TToolBar。ToolBar 上新增按鈕,數量對應主選單頂層項目數 (檔案、編輯、檢視...)。TMainMenu 正常建立選單結構。Menu 屬性 (設為空),不再使用標準選單列。ToolBar 屬性:ShowCaption = true // 顯示按鈕文字
DragKind = dkDock // 可停靠
DragMode = dmAutomatic // 自動拖曳
Flat = true // 扁平外觀
EdgeBorders = [] // 移除邊框
ToolButton 屬性:Grouped = true // 單選組行為
AutoSize = true // 自動寬度
MenuItem = 對應的 MainMenu 項目 (如 FileMenu, EditMenu...)
| 方法 | 可拖曳 | 可停靠 | 標準選單行為 | 程式碼量 | 推薦場景 |
|---|---|---|---|---|---|
| 一 | 否 | 否 | 否 (下拉式) | 極少 | 簡單工具列下拉選單 |
| 二 | 是 (隨 ToolBar) | 是 | 部份 (手寫彈出) | 少 | 需自訂外觀的可移動選單 |
| 三 | 是 | 是 | 是 (完整關聯 MainMenu) | 零 | 專業級可停靠選單列 |
ToolButton.MenuItem 關聯後,按鈕點擊自動彈出對應 MainMenu 子選單,保留快捷鍵、檢查標記、啟用狀態等所有原生行為。ControlBar 專為可停靠工具列設計,支援 dkDock;CoolBar 側重彈性佈局 (類似 IE 工具列)。ControlBar.Color、ToolBar.Color 統一風格;ToolButton.Grouped=true 使選中項保持按下狀態。運行時操作 MainMenu 項目 (Items->Add/Delete) 即時反映到 ToolButton,無需同步修改 ToolBar。
方法三為最佳實踐:零程式碼、完整相容 MainMenu 功能、原生支援拖曳停靠,是構建專業級可自訂介面應用程式的首選方案。