VC++ IDE 載入專案時,狀態欄左側會顯示進度條,載入完成後自動隱藏。本文封裝一個可復用類 CProgStatusBar,繼承自 CStatusBar,在狀態欄第一個窗格動態顯示/隱藏進度指示器,完美模擬此行為。
CProgStatusBar,成員變量 CProgressCtrl m_wndProgBar。OnCreate:創建進度條子窗口(WS_CHILD,無 WS_VISIBLE),設置範圍 0~100,父窗口添加 WS_CLIPCHILDREN 減少閃爍。OnSize:隨父窗口調整進度條大小,始終佔據第一個窗格(GetItemRect(0, &rc) → MoveWindow)。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);
}
}
prgsbar,視圖基類選 CEditView。Resource.h 定義自定義消息:#define MYWM_PROGRESS (WM_USER+1)。CMainFrame 頭文件聲明 afx_msg LRESULT OnProgress(WPARAM, LPARAM),映射 ON_MESSAGE(MYWM_PROGRESS, OnProgress)。m_wndStatusBar 類型改為 CProgStatusBar。Serialize 中加載文件時,定時發送 MYWM_PROGRESS 消息(WPARAM 傳遞進度百分比),主框架轉調 m_wndStatusBar.OnProgress。亦可利用 MFC 視圖更新機制(Hint/Code 結構)替代消息傳遞,實現文檔到框架的解耦通信。本例採用消息機制因其簡單直觀。