00. 目录


文章目录


  • 00. 目录
  • 01. 案例概述
  • 02. 开发环境
  • 03. 关键技术
  • 04. 程序设计
  • 05. 秘笈心法
  • 06. 源码下载
  • 07. 附录


01. 案例概述

状态栏多用于显示程序执行的状态信息。但是,如果程序正在执行一个任务,状态栏如何描述程序的执行进度呢?最好的方法是在状态栏中放置一个进度条控件,由进度条控件显示执行进度。本例实现了一个具有进度条的状态栏,效果如下图所示。

【MFC】带进度条的状态栏_C++

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++从入门到精通(项目案例版)》