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

VC++ 技巧:在狀態欄中嵌入進度條實現無閃爍加載提示

     編輯:VC 教學

需求背景

VC++ IDE 載入專案時,狀態欄左側會顯示進度條,載入完成後自動隱藏。本文封裝一個可復用類 CProgStatusBar,繼承自 CStatusBar,在狀態欄第一個窗格動態顯示/隱藏進度指示器,完美模擬此行為。

核心實現思路

  1. 派生 CProgStatusBar,成員變量 CProgressCtrl m_wndProgBar。
  2. 重載 OnCreate:創建進度條子窗口(WS_CHILD,無 WS_VISIBLE),設置範圍 0~100,父窗口添加 WS_CLIPCHILDREN 減少閃爍。
  3. 重載 OnSize:隨父窗口調整進度條大小,始終佔據第一個窗格(GetItemRect(0, &rc) → MoveWindow)。
  4. 自定義 OnProgress(UINT nPercent):
    • nPercent > 0:SetWindowText(NULL) 清除文本衝突 → ShowWindow(SW_SHOW) → SetPos(nPercent)。
    • nPercent == 0:ShowWindow(SW_HIDE) → 發送 WM_SETMESSAGESTRING 恢復「就緒」提示(需包含 afxpriv.h)。

關鍵代碼片段

int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs) {
    lpcs->style |= WS_CLIPCHILDREN;
    if (CStatusBar::OnCreate(lpcs) == -1) return -1;
    m_wndProgBar.Create(WS_CHILD, CRect(), this, 1);
    m_wndProgBar.SetRange(0, 100);
    return 0;
}

void CProgStatusBar::OnSize(UINT nType, int cx, int cy) {
    CStatusBar::OnSize(nType, cx, cy);
    CRect rc; GetItemRect(0, &rc);
    m_wndProgBar.MoveWindow(&rc, FALSE);
}

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

集成與使用步驟

  1. 創建單文檔項目 prgsbar,視圖基類選 CEditView。
  2. Resource.h 定義自定義消息:#define MYWM_PROGRESS (WM_USER+1)。
  3. CMainFrame 頭文件聲明 afx_msg LRESULT OnProgress(WPARAM, LPARAM),映射 ON_MESSAGE(MYWM_PROGRESS, OnProgress)。
  4. 將 m_wndStatusBar 類型改為 CProgStatusBar。
  5. 文檔 Serialize 中加載文件時,定時發送 MYWM_PROGRESS 消息(WPARAM 傳遞進度百分比),主框架轉調 m_wndStatusBar.OnProgress。

進階提示

亦可利用 MFC 視圖更新機制(Hint/Code 結構)替代消息傳遞,實現文檔到框架的解耦通信。本例採用消息機制因其簡單直觀。

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