首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 對話框動態調整工具列與狀態列大小隨視窗縮放

     編輯:VC 教學

在可調整大小的對話框中,工具列 (CToolBar) 與狀態列 (CStatusBar) 預設不會自動隨視窗寬度縮放。本文提供在 OnSize 中動態 MoveWindow 的標準實現,確保工具列頂部填滿、狀態列底部填滿,並修正多次縮放導致工具列被遮蓋的邊界問題。

完整 OnSize 實現

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));
}

關鍵點解析

  1. 控制項 ID: MFC 標準工具列/狀態列 ID 為 AFX_IDW_TOOLBAR (0xE800) 與 AFX_IDW_STATUS_BAR (0xE801),可直接 GetDlgItem 取得指標。
  2. 高度修正 +4: 經驗值,補償非客戶區邊框 (Non-client area) 導致的累積誤差,防止工具列隨縮放逐漸變薄甚至消失。
  3. 狀態列定位: Y 座標 = 客戶區高度 cy - 狀態列高度,確保緊貼底部。
  4. 基類調用: 必須先 CDialog::OnSize,確保佈局管理器 (如有) 先行處理。
  5. Unicode/ANSI 通用: 純 MFC API,無字元集相依。

適用場景

  • 對話框設定 WS_THICKFRAME (可調整大小邊框) 模式。
  • 動態建立/銷毀工具列、狀態列的場景 (需檢查 IsWindow)。
  • SDI/MDI 主視窗框架同樣適用 (透過 AfxGetMainWnd() 取得)。

此片段可直接複製到任何 CDialog 衍生類中使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved