在状态栏上使用进度条
原理: 状态栏是个窗口,进度条将父窗口设置为状态栏的某一分区即可
步骤:
0. 建立MFC对话框程序
1. 增加头文件,CProgressCtrl需要使用
2. 在类中声明2个控件:状态栏 + 进度条(进度条在资源编辑器中创建)
3. 进度条是资源,有ID,需要对象数据交换
4. 创建、布置状态栏 (在初始化对话框函数中)
5. 设置状态栏的某一分区为进度条父窗口
6. 使用定时器让进度条动起来
运行显示:
主要代码:
1-2-3
#include <afxcmn.h> //包含头文件
CStatusBar m_status;
CProgressCtrl m_progress;
DDX_Control(pDX, IDC_PROGRESS1, m_progress); //对象数据交换
4-5
m_status.Create(this); //创建状态栏
UINT arr[] = {1001,1002,1003};
m_status.SetIndicators(arr, sizeof(arr)/sizeof(UINT));
m_status.SetPaneInfo(0, 1001, 0, 100); //设置分区ID及大小
m_status.SetPaneInfo(1, 1002, 0, 200);
m_status.SetPaneInfo(2, 1003, 0, 200);
m_status.SetPaneText(0, _T("GOGO"));
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
RECT rt;
m_status.GetItemRect(2, &rt); //获取状态栏所需要区的窗口矩形
m_progress.SetParent(&m_status); //设置状态栏为父
m_progress.MoveWindow(&rt);
m_progress.ShowWindow(1);
6
//消息映射宏: ON_WM_TIMER()
//类内声明函数: afx_msg void OnTimer(UINT nID);
//类外实现函数:
void MyDialog::OnTimer(UINT nID)
{
static int iPos = 0;
iPos += 5;
if (iPos > 100) iPos = 0;
m_progress.SetPos(iPos);
return CDialog::OnTimer(nID);
}
7. 不要忘记调用SetTimer触发定时器
SetTimer(1,100,NULL);