在 MFC MDI 應用中,主框架包含多個 CDockablePane 子窗口(如輸出、屬性等),中心為 CView 視圖。期望行為:
CView 自動填滿剩餘客戶區。CView 自動擴展佔據釋放空間。附圖顯示佈局結構。
MFC 的 CFrameWndEx / CMDIFrameWndEx 已內建停靠窗口佈局引擎。只要正確啟用停靠功能,視圖會自動適應。
// 在 CMainFrame::OnCreate 中
EnableDocking(CBRS_ALIGN_ANY);
m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndOutput);
// ... 其他 pane 同理
// 視圖會自動佔據中心剩餘區域
OnSize直接在 CMainFrame::OnSize 中調整子窗口大小屬於「硬編碼佈局」,不但繁瑣,還易與停靠管理器衝突。MFC 的停靠管理器會在框架調整大小、Pane 顯示/隱藏時自動重新計算佈局,確保中心視圖填滿可用空間。
當用戶點擊 Pane 標題欄的「關閉」按鈕,或調用 ShowPane(&pane, FALSE, FALSE, TRUE) 時,框架會自動觸發佈局重算,中心視圖會平滑擴展。無需額外代碼。
OnSize 手動移動視圖:實際上干擾了內建佈局。CMDIFrameWndEx,啟用 EnableDocking 與 EnableAutoHidePanes。CDockablePane 派生類承載工具窗口內容。CView 或 CScrollView,無需特殊尺寸代碼。ShowPane,框架自動處理佈局。MFC 現代停靠架構(基于 CFrameWndEx)已完整支持 MDI 子窗口自適應與 Pane 聯動。不要在 OnSize 手動佈局,信任框架的佈局引擎,只需正確初始化停靠設置即可。