在状态栏中显示进度条已经很常用了。但MFC自带状态栏并没有这功能。
当前例程通过自己编写代码实现了这一功能。
只要将两文件PROGRESSBAR.CPP,PROGRESSBAR.H导入工程中就可以使用。
效果如下图
上位机MFC状态栏内嵌入进度条
点击菜单上图中对应按钮,可以在状态样上显示进度条。
例程源代码下载地址:
实现过程:
建立自己的工程,单文档或多文档工程。
1. 从View菜单中,选择Resource Symbols。按New按钮,并指定为名字ID_INDICATOR_PROGRESS_PANE。
2. 在MainFrm.cpp中,找到indicators数组,并输入资源标识ID_INDICATOR_PROGRESS_PANE。将它放置到所有ID的后面。
3. 在资源编辑器中打开字符串,在Insert菜单中选择New String菜单。
4. 双击字符串,并选择ID,其消息为一组空格,其空格大小标志着进度条。
既然创建了窗格,现在就将进度条添加到里面:
1.在MainFrm.h中声明一个public变量CProgressCtrl,叫做 m_Progress。
2.在MainFrm.h中声明一个protected BOOL变量m_bCreated。
3.在MainFrm.cpp的OnCreate()函数中,初始化m_bCreated为FALSE:
m_bCreated = FALSE;
4. 现在,是使用它的时候了:
CMainFrame::OnSomeLongProcess()
{
RECT MyRect;
// substitute 4 with the zero-based index of your status bar pane.
// For example, if you put your pane first in the indicators array,
// you'd put 0, second you'd put 1, etc.
m_wndStatusBar.GetItemRect(4, &MyRect);
if (m_bCreated == FALSE)
{
//Create the progress control
m_Progress.Create(WS_VISIBLE|WS_CHILD, MyRect, &wndStatusBar, 1);
m_Progress.SetRange(0,100); //Set the range to between 0 and 100
m_Progress.SetStep(1); // Set the step amount
m_bCreated = TRUE;
}
// Now we'd simulate a long process:
for (int I = 0; I <100; I++) { Sleep(20); m_Progress.StepIt(); } }
在进度条创建时,如果窗口重新定位,需要重载OnSize函数使之正确重定位:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIFrameWnd::OnSize(nType, cx, cy);
RECT rc;
m_wndStatusBar.GetItemRect(4, &rc);
// Reposition the progress control correctly!
m_Progress.SetWindowPos(&wndTop, rc.left, rc.top, rc.right - rc.left,
rc.bottom - rc.top, 0);
}
|