步骤:
首先声明一个进度条类,它继承系统的CStatusBar类,利用类向导添加CProgressStatusBar类,头文件ProgressStatusBar.h如下:
#pragma once
#include "afxext.h"
class CProgressStatusBar :
public CStatusBar
{
public:
CProgressStatusBar();
~CProgressStatusBar();
private:
CProgressCtrl m_ProgressCtrl;
public:
CProgressCtrl& GetProgressCtrl()
{
return m_ProgressCtrl;
};
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()
};
头文件中定义了两个消息映射函数OnCreate()和Onsize()函数
定义部分在源文件中,如下:
int CProgressStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
VERIFY(CStatusBar::OnCreate(lpCreateStruct) == 0);
VERIFY(m_ProgressCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, IDC_PROGRESS));
return 0;
}
void CProgressStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
CRect rect;
GetItemRect(1, &rect);
m_ProgressCtrl.MoveWindow(rect);
}
接下来在CMainFrame类中将状态条变量m_wndStatusBar类型改为定义的类CprogressStatusBar
添加一个变量,记录进度条当前位置,m_pos
private: // 自定义成员变量
int m_Pos;
在CMainFrame类的构造函数里初始化m_pos = 0;
CMainFrame::CMainFrame()
{
// TODO: 在此添加成员初始化代码
m_Pos = 0;
}
同时在CMainFrame::OnCreate函数体里添加一个定时器函数:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
SetTimer(1, 100, NULL);
return 0;
}
最后添加定时器响应函数OnTimer()
void CMainFrame::OnTimer(UINT nIDEvent)
{
int nLower, nUpper;
m_wndStatusBar.GetProgressCtrl().GetRange(nLower, nUpper);
if (m_Pos >= nUpper)
m_Pos = 0;
m_wndStatusBar.GetProgressCtrl().SetPos(m_Pos);
m_Pos += 2;
CFrameWnd::OnTimer(nIDEvent);
}