01、目录
文章目录
02、Progress Control介绍
进度条对于我们而言,想必都很熟悉了,安装软件、游戏加载都会有进度条的身影。
今天我们就来学习学习:Progress Control控件——进度条。
如下所示:
关于拖拽的方法,这里不做介绍,重点聊聊常用的几个方法。
03、Progress Control相关函数
- create() ——创建Progress Control
针对不是通过资源文件上拖拉进度条控件生成的进度条,需要用此函数创建一个。 - SetRange() —— 设置进度条范围
设置进度条的起始值和终止值。(不管拖拽还是创建都要设置此,在初始化中) - SetPos() —— 设置当前值
设置进度条的当前位置(值)。 - OffSetPos() —— 偏移一段位置
移动进度条一段距离(动态移动,如果不做延时,默认速度移动) - SetStep() —— 设置步长
设置进度条偏移一次的长度,一般与StepIt搭配使用 - StepIt() —— 更新步长位置
按照步长来更新位置。 - GetPos() —— 得到当前值
获得进度条当前值。
上述方法我会在下面例子中展示,就不举例了。
04、Progress Control示例
4.1 功能:按照固定步长一次增加1
CProgressCtrl *myProCtrl2 = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
myProCtrl2->SetRange(0,100);
for (int i = 0;i<100;i++)
{
//myProCtrl2->OffsetPos(1); //此句代码等同于下两句,以固定步长1更新显示,该功能也可以这样实现:myProCtrl2->SetPos(i);
myProCtrl2->SetStep(1);
myProCtrl2->StepIt();
Sleep(100);
}
4.2 功能:按固定步长增加,并动态更新百分比
CProgressCtrl myProCtrl;
CRect rect,proRect;
GetClientRect(&rect);
proRect.left = rect.left + rect.Width()/2 - 100;
proRect.top = rect.top + rect.Height()/2 - 20;
proRect.right = rect.right - rect.Width()/2 + 100;
proRect.bottom = rect.bottom - rect.Height()/2 + 20;
//WS_CHILD|WS_VISIBLE|PBS_SMOOTHREVERSE
myProCtrl.Create(WS_VISIBLE,proRect,this,99); //创建位置、大小
myProCtrl.SetRange(0,100);
int i;
for (i = 0; i < 100; i++)
{
myProCtrl.OffsetPos(1);
CString str;
str.Format(_T("%d%%"),i); //百分比
(GetDlgItem(IDC_STATIC1))->SetWindowText(str);
Sleep(100);
}
4.3 功能:搭配定时器,动态更新显示进度条
-
首先在初始化函数中设置范围和当前初始值
CProgressCtrl* pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS); pProg->SetRange(0, 100); pProg->SetPos(0); //也可关联控件变量
-
然后在开始按钮中设置定时器,如上图所示
//设置定时器 SetTimer(1, 100, NULL); //当开始的时候,按钮不可用 CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1); pBtn->EnableWindow(FALSE);
-
然后在定时器函数设置进度条的实时位置
void CMFCTESTDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int iPos = 0; iPos = m_prog.GetPos();//获取当前进度条位置 iPos += 1; m_prog.SetPos(iPos); CString s1,s2; s1 = _T("%"); s2.Format(_T("%d"), iPos); SetDlgItemText(IDC_STATIC_DISPLAY, s1 + s2); if (iPos == 100)//当达到100的时候就关闭定时器,并且事按钮可用,位置设为0 { KillTimer(1); m_prog.SetPos(0); CButton* pBtn = (CButton*)GetDlgItem(IDC_BUTTON1); pBtn->EnableWindow(TRUE); } CDialogEx::OnTimer(nIDEvent); }
上面程序中的设置相加位置搞错了了,导致显示为 % xx,自行更改。
05、小结
Progress Control控件,做好了之后,感觉能够使自己的程序提升一个档次,所以说,学一下这个还是很有必要的。
要想自己的Progress Control控件更加棒,最好是根据某某某程序的执行时间来算出进度每增加1步长,用时多久,这样就更加精准,当然,固定执行也行,锦上添花罢了。
关于Progress Control就大致了解到这里了,多实践,相信大家很快就会掌握此控件了。
版权声明:转载请注明出处,谢谢!