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

狀態欄內嵌進度條控制實現:CProgStatusBar 類完整封裝

     編輯:關於VC++

動機

MFC 標準進度條無法直接放入狀態欄。需自繪或建立子視窗管理。本文採用子視窗法:派生 CProgStatusBar : public CStatusBar,內含 CProgressCtrl m_wndProgBar,負責建立、定位、顯示/隱藏、文字協調。

三大核心虛擬函數重寫

1. OnCreate:建立進度條子視窗


int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs) {
    lpcs->style |= WS_CLIPCHILDREN; // 減少閃爍
    if (CStatusBar::OnCreate(lpcs) != 0) return -1;
    if (!m_wndProgBar.Create(WS_CHILD, CRect(), this, 1)) return -1;
    m_wndProgBar.SetRange(0, 100);
    return 0; // 初始隱藏 (無 WS_VISIBLE)
}

2. OnSize:追蹤第一欄位置


void CProgStatusBar::OnSize(UINT nType, int cx, int cy) {
    CStatusBar::OnSize(nType, cx, cy);
    CRect rc; GetItemRect(0, &rc); // 第一格矩形
    m_wndProgBar.MoveWindow(&rc, FALSE); // 隱藏狀態也要更新位置
}

3. OnProgress(UINT nPercent):顯示/隱藏與文字協調


void CProgStatusBar::OnProgress(UINT nPercent) {
    if (nPercent > 0) {
        SetWindowText(NULL); // 清除「就緒」文字,避免重疊
        m_wndProgBar.ShowWindow(SW_SHOW);
        m_wndProgBar.SetPos(nPercent);
    } else {
        m_wndProgBar.ShowWindow(SW_HIDE);
        // 恢復預設閒置文字
        GetParent()->PostMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);
    }
}

使用模式:訊息解耦

主框架類別 CMainFrame 定義自訂訊息 MYWM_PROGRESS:


#define MYWM_PROGRESS (WM_USER+100)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_MESSAGE(MYWM_PROGRESS, OnProgress)
END_MESSAGE_MAP()

LRESULT CMainFrame::OnProgress(WPARAM wp, LPARAM) {
    m_wndStatusBar.OnProgress((UINT)wp);
    return 0;
}

任何物件 (文檔、視圖、執行緒) 只需 PostMessage(GetTopLevelFrame()->GetSafeHwnd(), MYWM_PROGRESS, percent),無須直接存取狀態欄成員,降低耦合。

文檔序列化中回報進度範例


void CMyDoc::Serialize(CArchive& ar) {
    if (ar.IsLoading()) {
        CWnd* pFrame = AfxGetMainWnd();
        if (pFrame) {
            for (int i=0; i<=100; i+=5) {
                Sleep(150); // 模擬耗時操作
                pFrame->PostMessage(MYWM_PROGRESS, i);
            }
        }
        // 實際載入邏輯...
    }
}

執行效果

狀態欄進度條動畫

擴充建議

  • 支援不定長度進度 (Marquee 模式):m_wndProgBar.SetMarquee(TRUE, 50)
  • 增加 GetProgressCtrl() 供高級自訂
  • 支援多段式進度 (如「下載中 45% - 解壓中 12%」)
  • 搭配 CCustomStatusBar 實現圖示+文字+進度條混合佈局
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved