步骤:
<1> : 在CMainFrame类中定义一个变量:保护类型.
CProgressCtrl m_progress;
<2> : 添加indicator指示器:
ID_INDICATOR_PROG
<3> : 添加WM_PAINT事件,添加代码如下
void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CFrameWndEx::OnPaint() for painting messages
CRect rect;
m_wndStatusBar.GetItemRect(1,&rect);
if(m_progress.m_hWnd){
m_progress.SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),SWP_NOZORDER);
}else{
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,rect,&m_wndStatusBar,123);
//第一个参数为进度条的风格;
//第二个参数进度条尺寸;
//第三个参数父窗口;
//ID号,可以随机一个数输入;
}
m_progress.SetPos(50);
}
<4> : 如果要让进度条显示"动起来",在WM_TIME事件中添加:
m_progress.StepIt();
<5> : 附上孙鑫的一个同样的例子,但是我按照他的方法编译器报断点错误,无法运行,暂时没有找到解决的办法,不过我相信他的也是正确的,下面以示参考:
在MainFrm.cpp文件中指示器数组indicators中添加这两个资源ID号.
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
IDS_TIMER, // 新添加的时间指示器
IDS_PROGRESS, // 新添加的进度栏指示器
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
1 在Mainfrm.h中增加protected的成员变量CProgressCtrl m_progress
2 在OnCreate中添加如下代码:
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect); //获取状态栏中第二项即进度栏的位置
m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL,
rect,&m_wndStatusBar,123); //创建进度栏,第一个参数是属性,可以是水平的竖直的,第二个参数是位置,第三个参数是父窗口指针,这里设置为状态栏窗口,最后一个参数随便取的一个ID号。
m_progress.SetPos(50); //设置进度条中当前进度,100为满格,50为半格
这时运行发现不正确,矩形大小获取不正确,这是因为在OnCreate中状态栏还没有创建完成,因此,获取失败,解决办法可以是自定义消息,当程序执行OnCreate消息时,将自定义的消息放入消息队列中,当Oncreate消息执行完成后,再执行自定义的消息响应函数。
3在MainFrm.h中#define UM_PROGRESS WM_USER+1 //自定义消息号要大于WM_USER
在MainFrm.h中添加消息映射函数afx_msg LRESULT OnProgress(WPARAM ,LPARAM);
在MainFrm.cpp中消息映射中添加ON_MESSAGE ( UM_PROGRESS, &CMainFrame::OnProgress )
在MainFrm.cpp中,消息响应函数:
LRESULT CMainFrame::OnProgress(WPARAM ,LPARAM)
{
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
return true;
}
4最后在OnCreate中调用 PostMessage(UM_PROGRESS);//不能用SendMessage()因为这个函数发送的消息是立即响应的,即Oncreate响应还没结束就去响应自定义的消息
解决重绘时进度栏改变的问题
在OnPain()中重写代码
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
此时将OnCreate中PostMessage(UM_PROGRESS);注释掉,因为创建窗口的过程就调用了OnPain()函数。为了让进度随时间改变在定时器消息处理函数中加入
m_progress.StepIt();