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

狀態列嵌入進度條:CProgressCtrl 整合 CStatusBar 完整實作步驟

     編輯:關於C語言

核心思路

狀態列 (CStatusBar) 分區 (Pane) 本質是矩形區域,非視窗。將 CProgressCtrl 建立為狀態列的子視窗,定位於特定分區矩形內,隨狀態列大小調整自動重新定位。

實作步驟

1. 資源符號與字串表

  • 資源符號新增 ID_INDICATOR_PROGRESS (值自動分配)。
  • 指標陣列 indicators[] 末尾加入此 ID,使進度條顯示在最右側。
  • 字串表新增同 ID 字串,內容為空格 (寬度需大於進度條預期寬度),如 " "。

2. 主框架類別宣告


class CMainFrame : public CFrameWnd {
    // ...
    CProgressCtrl m_wndProgress; // 進度條控制項
    BOOL m_bProgressCreated;     // 是否已建立旗標
    // ...
};

3. OnCreate 初始化


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
    // ... 建立工具列、狀態列 ...
    m_bProgressCreated = FALSE;
    return 0;
}

4. 需要時動態建立進度條


void CMainFrame::OnLongOperation() {
    // 取得進度條分區矩形 (索引 4 視 indicators 陣列位置而定)
    CRect rect;
    m_wndStatusBar.GetItemRect(4, &rect); // 索引從 0 開始

    if (!m_bProgressCreated) {
        // 建立進度條,父視窗為狀態列
        m_wndProgress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, rect, &m_wndStatusBar, 1);
        m_wndProgress.SetRange(0, 100);
        m_wndProgress.SetStep(1);
        m_bProgressCreated = TRUE;
    } else {
        // 已存在,同步位置 (應對視窗大小變更)
        m_wndProgress.MoveWindow(rect);
    }

    // 模擬長時間操作
    for (int i = 0; i <= 100; ++i) {
        m_wndProgress.StepIt();
        Sleep(20); // 實際應在工作執行緒,並用 PostMessage 更新
        // 處理訊息泵防止介面凍結
        MSG msg;
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}

5. OnSize 中同步位置


void CMainFrame::OnSize(UINT nType, int cx, int cy) {
    CFrameWnd::OnSize(nType, cx, cy);
    if (m_bProgressCreated) {
        CRect rect;
        m_wndStatusBar.GetItemRect(4, &rect);
        m_wndProgress.MoveWindow(rect); // 或 SetWindowPos
    }
}

6. 完成/取消時隱藏或銷毀


void CMainFrame::HideProgress() {
    if (m_bProgressCreated) {
        m_wndProgress.ShowWindow(SW_HIDE);
        // 或完全銷毀:m_wndProgress.DestroyWindow(); m_bProgressCreated = FALSE;
    }
}

進階:工作執行緒更新進度條

UI 執行緒不應阻塞。工作執行緒計算進度,PostMessage 送自訂訊息 (WM_USER_PROGRESS) 到主框架,主框架 OnProgressUpdate 呼叫 m_wndProgress.SetPos。

樣式選項

常見問題

  • 進度條不顯示: 檢查分區索引、字串表空格寬度、WS_VISIBLE、父視窗正確性。
  • 大小調整後位置錯誤: 必須處理 OnSize 同步 MoveWindow。
  • 狀態列未重繪: 進度條遮蓋分區文字,若需同時顯示文字可自繪進度條 (WM_PAINT 覆寫)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
樣式效果
PBS_SMOOTH平滑漸變 (Win98+),預設分段
PBS_VERTICAL垂直進度條
PBS_MARQUEE跑馬燈模式 (不確定進度),需 PBM_SETMARQUEE 啟動