プログレスバーつきステータスバーを作る

まず、CStatusBarを継承したクラスを作成します。(ここではCProgressStatusBarとします)
メンバ変数にCProgressCtrlの変数を生成します。
CProgressCtrlの関数のラッパ関数などを作成します。
ヘッダファイル
class CProgressStatusBar : public CStatusBar {
public:
    CProgressStatusBar();

public:
    //{{AFX_VIRTUAL(CProgressStatusBar)
    //}}AFX_VIRTUAL

public:
    int StepIt( );
    int SetStep( int nStep );
    int OffsetPos( int nPos );
    int SetPos( int nPos );
    int GetPos( );
    void GetRange( int& nLower, int& nUpper );
    void SetRange( short nLower, short nUpper );
    void SetRange32( int nLower, int nUpper );
    UINT ShowProgressBar(int nIndex, BOOL isVisible = TRUE);
    CProgressCtrl* GetProgressBar();
    virtual ~CProgressStatusBar();

protected:
    //{{AFX_MSG(CProgressStatusBar)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
private:
    CProgressCtrl m_objProgress;
    int m_nIndex;

};
cppファイル

CProgressStatusBar::CProgressStatusBar(){
	m_nIndex = -1;
}

CProgressStatusBar::~CProgressStatusBar(){
}


BEGIN_MESSAGE_MAP(CProgressStatusBar, CStatusBar)
	//{{AFX_MSG_MAP(CProgressStatusBar)
	ON_WM_CREATE()
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


CProgressCtrl* CProgressStatusBar::GetProgressBar(){
	
	return &m_objProgress;
}

int CProgressStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct){
	if (CStatusBar::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CRect rect;
    m_objProgress.Create(WS_CHILD | PBS_SMOOTH, rect, this, 0);
	
	return 0;
}

UINT CProgressStatusBar::ShowProgressBar(int nIndex, BOOL isVisible){
	CRect rect;
    int nOldIndex = m_nIndex;
    m_nIndex = nIndex;
    GetItemRect(nIndex, rect);
    m_objProgress.MoveWindow(rect);
	int nState = isVisible ? SW_SHOWNA : SW_HIDE;
	if(nIndex <= -1){
		nState = SW_HIDE;
	}
    m_objProgress.ShowWindow(nState);
    return nOldIndex;

}

void CProgressStatusBar::OnSize(UINT nType, int cx, int cy){
	CStatusBar::OnSize(nType, cx, cy);
    if (!::IsWindow(m_objProgress.m_hWnd) || m_nIndex == -1)
        return;

    // 位置を修正
    CRect rect;
    GetItemRect(m_nIndex, rect);
    m_objProgress.MoveWindow(rect, FALSE);
}

void CProgressStatusBar::SetRange32(int nLower, int nUpper){
	m_objProgress.SetRange32(nLower, nUpper);
}

void CProgressStatusBar::SetRange(short nLower, short nUpper){
	m_objProgress.SetRange(nLower, nUpper);
}

void CProgressStatusBar::GetRange(int &nLower, int &nUpper){
	m_objProgress.GetRange(nLower, nUpper);
}

int CProgressStatusBar::GetPos(){
	return m_objProgress.GetPos();
}

int CProgressStatusBar::SetPos(int nPos){
	return m_objProgress.SetPos(nPos);
}

int CProgressStatusBar::OffsetPos(int nPos){
	return m_objProgress.OffsetPos(nPos);
}

int CProgressStatusBar::SetStep(int nStep){
	return m_objProgress.SetStep(nStep);
}

int CProgressStatusBar::StepIt(){
	return m_objProgress.StepIt();
}

表示したいステータスバーのインデックスをShowProgressBar()の引数に与えれば表示、非表示ができます。
ラップしたCProgressCtrlの関数を呼び出せばCProgressCtrlと同じ使い勝手でプログレスバーを操作できます。