00. 目录
文章目录
- 00. 目录
- 01. 案例概述
- 02. 开发环境
- 03. 关键技术
- 04. 程序设计
- 05. 秘笈心法
- 06. 源码下载
- 07. 附录
01. 案例概述
状态栏多用于显示程序执行的状态信息。但是,如果程序正在执行一个任务,状态栏如何描述程序的执行进度呢?最好的方法是在状态栏中放置一个进度条控件,由进度条控件显示执行进度。本例实现了一个具有进度条的状态栏,效果如下图所示。
02. 开发环境
系统环境:Windows 10
开发环境:Visual Studio 2019
03. 关键技术
在状态栏中显示进度条非常简单。只要将进度条的父窗口指定为状态栏,再适当设置进度条显示的位置就可以了。在使用进度条控件时,可以使用SetRange方法来设置进度条控件的范围。
语法格式如下:
CProgressCtrl::SetRange
void SetRange( short nLower, short nUpper );
void SetRange32( int nLower, int nUpper );
参数:
nLower 指定范围的下限(缺省值是零)。
nUpper 指定范围的上限(缺省值是100)。
说明:
此函数用来设置进度条控件范围的上限和下限,并重画此进度条来反映新的范围。成员函数SetRange32为进度条设置32位的范围。
04. 程序设计
(1)新建一个基于对话框的工程。
(2)在对话框类中定义一个CStatusBar变量m_StatusBar和一个CProgressCtrl变量m_Progress。
(3)在对话框的OnInitDialog方法中创建状态栏和进度条。
// CMy1StatusDlg 消息处理程序
BOOL CMy1StatusDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
m_StatusBar.Create(this);
UINT panels[6];
for (int i = 0; i < 6; i++)
{
panels[i] = 1000 + i;
}
m_StatusBar.SetIndicators(panels, 6);
CRect rect;
GetClientRect(rect);
int width = rect.Width() / 6;
for (int i = 0; i < 6; i++)
{
m_StatusBar.SetPaneInfo(i, panels[i], SBPS_NORMAL, width);
}
//设置面板信息
m_StatusBar.SetPaneText(0, TEXT("当前用户"));
m_StatusBar.SetPaneText(1, TEXT("沧海一笑"));
m_StatusBar.SetPaneText(2, TEXT("当前状态"));
m_StatusBar.SetPaneText(4, TEXT("日期"));
//获取当前时间
CTime time;
time = CTime::GetCurrentTime();
m_StatusBar.SetPaneText(5, time.Format("%Y-%m-%d"));
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
//设置定时器
//SetTimer(1, 1000, NULL);
m_StatusBar.GetStatusBarCtrl().GetRect(3, &rect);
CRect progRect(rect.left, 2, rect.right, rect.Height() + 2);
m_ProgressCtrl.Create(PBS_SMOOTH, progRect, &m_StatusBar, 1111);
m_ProgressCtrl.ShowWindow(SW_SHOW);
m_ProgressCtrl.SetRange(0, 100);
m_ProgressCtrl.SetPos(45);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
05. 秘笈心法
状态栏中进度条的用处
在状态栏中显示进度条是普遍的用法,实例中先创建状态栏,确定状态栏控件的位置后再创建进度条控件,将状态栏设置为进度条控件的父窗体,这样当状态栏的大小发生变化时,可以及时通知进行条控件。实例中并没有实现这一功能,如果要实现这一功能需要重新定义状态栏类,以便获取控件大小发生改变时的消息。
06. 源码下载
下载:【MFC】带进度条的状态栏.rar
07. 附录
参考: 《Visual C++从入门到精通(项目案例版)》