在可調整大小的對話框中,工具列 (CToolBar) 與狀態列 (CStatusBar) 預設不會自動隨視窗寬度縮放。本文提供在 OnSize 中動態 MoveWindow 的標準實現,確保工具列頂部填滿、狀態列底部填滿,並修正多次縮放導致工具列被遮蓋的邊界問題。
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (!m_hWnd) return; // 視窗未建立完成
CRect rcClient;
GetClientRect(&rcClient); // 客戶區尺寸
// --- 工具列 ---
CToolBar* pToolBar = (CToolBar*)GetDlgItem(AFX_IDW_TOOLBAR); // 或 AfxGetMainWnd()->GetDescendantWindow
if (pToolBar && ::IsWindow(pToolBar->m_hWnd)) {
CRect rcBar; pToolBar->GetClientRect(&rcBar);
// +4 修正邊框,防止多次縮放後高度異常縮小/被覆蓋
pToolBar->MoveWindow(0, 0, rcClient.Width(), rcBar.Height() + 4);
}
// --- 狀態列 ---
CStatusBar* pStatusBar = (CStatusBar*)GetDlgItem(AFX_IDW_STATUS_BAR);
if (pStatusBar && ::IsWindow(pStatusBar->m_hWnd)) {
CRect rcBar; pStatusBar->GetClientRect(&rcBar);
int barH = rcBar.Height();
pStatusBar->MoveWindow(0, cy - barH, rcClient.Width(), barH);
}
// 可選:重繪背景色 (白色)
CClientDC dc(this);
dc.FillSolidRect(rcClient, RGB(255,255,255));
}
AFX_IDW_TOOLBAR (0xE800) 與 AFX_IDW_STATUS_BAR (0xE801),可直接 GetDlgItem 取得指標。+4: 經驗值,補償非客戶區邊框 (Non-client area) 導致的累積誤差,防止工具列隨縮放逐漸變薄甚至消失。cy - 狀態列高度,確保緊貼底部。CDialog::OnSize,確保佈局管理器 (如有) 先行處理。WS_THICKFRAME (可調整大小邊框) 模式。IsWindow)。AfxGetMainWnd() 取得)。此片段可直接複製到任何 CDialog 衍生類中使用。