MFC中进度控件的基本用法

原创 2017年09月27日 21:56:41

MFCCProgressCtrl类来表示进度控件。在默认方式下,进度条控件沿水平方向放置,进度用一系列的方块来表示。

1 进度控件的创建

可以通过两种方法创建进度控件,一种是在Visaul Studio的资源编辑器中通过工具箱添加;另一种是通过代码添加。

1.1 在资源编辑器中添加

一般基于对话框的MFC程序中,使用资源编辑器的方式来添加进度控件。在“资源视图”中打开对话框资源,之后在右侧的“工具栏”中将Progress Control控件拖入到对话框上,并且调整其位置和大小,如图1所示。

 

1 通过“工具栏”添加进度控件

之后,选择右侧的“属性”按键,通过属性栏设置进度控件的属性,如图2所示。

 

2 设置进度控件属性

其中,Smooth属性表示进度控件中的进度条是虚线还是实线,将该属性设置为True则是实线,False是虚线;Vertical属性表示控件是否是垂直的,True表示垂直,False表示水平。

1.2 通过代码添加

基于文档/视图的MFC程序一般通过代码来添加进度控件。通过CProgressCtrl::Create()函数实现控件的创建。该函数的格式为

BOOL Create(
  DWORD dwStyle,
  const RECT& rect,
  CWnd* pParentWnd,
  UINT nID
);
其中,参数dwStyle表示进度控件的风格;rect表示控件的位置和大小;pParentWnd指定了控件的父窗口的指针;nID是控件的ID。如果创建成功,则返回值是TRUE,否则返回值是FALSE

可以使用如下代码创建进度控件

m_Progress_Control_Manual.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH|PBS_VERTICAL, CRect(10,10, 500, 60), this, 10001);
其中,m_Progress_Control_ManualCProgressCtrl类的对象,需要注意的是该对象必须是类的成员变量,而不能是局部变量,否则控件无法显示。Create()函数的参数中,WS_CHILD表示该控件是子控件,WS_VISIBLE表示控件是可见的;PBS_SMOOTHPBS_VERTICAL分别对应在“1.1 在资源编辑器中添加”中提到的Smooth属性和Vertical属性。

2 进度控件中进度条的活动

进度控件的作用就是通过进度条的活动来表示某个动作进展的情况。因此,在创建了进度控件之后,接下来就是要控制进度条的活动了。在控制进度条活动时,首先要设置进度条活动的范围,之后设置其的位置来实现进度条的活动。

2.1 设置进度条活动的范围

通过CProgressCtrl::SetRange()函数设置进度条活动的范围。该函数的格式为

void SetRange(
  short nLower,
  short nUpper
);
其中,参数nLowernUpper分别表示进度条活动的起始位置和结束位置。

m_Progress_Control_Manual.SetRange(0, 100);
以上代码的功能是将进度条的活动范围设置到了0~100之间,m_Progress_Control_Manual是在“1.2 通过代码添加”中定义的CProgressCtrl类的对象。

2.2 设置进度条位置

可以通过三种方法设置进度条位置:第一种是直接设置位置;第二种是设置位置的偏移量;第三种是设置步进。

2.2.1 直接设置进度条位置

通过CProgressCtrl::SetPos()直接设置进度条的位置。该函数的作用是设置进度条的位置并且重画进度控件。该函数的格式为

int SetPos(int nPos);
其中,参数nPos表示要设置的进度条位置,该位置必须在“2.1 设置进度条活动的范围”中设置的范围之内;返回值是设置新位置之前,进度条所在的位置。

m_Progress_Control_Manual.SetPos(50);
以上代码的作用是将进度条的位置设置到整个进度控件的中间位置。

2.2.2 设置进度条位置的偏移量

通过CProgressCtrl::OffsetPos()函数设置控制条新位置相对于之前位置的偏移量。该函数的格式为

int OffsetPos(int nPos);
其中,参数nPos表示新位置相对于之前位置的偏移量;返回值是设置新位置之前,进度条所在的位置。

for(int i=0; i<4; ++i)
{
m_Progress_Control_Manual.OffsetPos((100-0)/4);
Sleep(100);
}
以上代码的功能是进度条每次前进整个进度控件的四分之一,分四次前进到进度控件的最顶端。

2.2.2 设置进度条的步进

进度条的步进指的是进度条每次前进的长度。通过CProgressCtrl::SetStep()函数设置步进,该函数的格式为

int SetStep(int nStep);
该函数的参数为新的步进值;返回值是设置新步进之前的步进值。

在设置了进度条步进之后,需要调用CProgressCtrl::StepIt()函数来使得进度条按照设置的步进前进。

m_Progress_Control_Manual.SetStep((100-0)/4);
for(int i=0; i<4; ++i)
{
m_ProgressCtrl.StepIt();
Sleep(100);
}
以上代码与2.2.2 设置进度条位置的偏移量”中的代码功能相同。

3 设置进度条颜色及进度控件背景颜色

通过向控件发送PBM_SETBARCOLOR消息或者调用CProgressCtrl::SetBarColor()函数来设置进度条的颜色;通过向控件发送PBM_SETBKCOLOR消息或者调用CProgressCtrl::SetBkColor()函数来设置进度控件背景颜色。

3.1 发送改变颜色的消息

通过CProgressCtrl类的对象,调用该类的SendMessage()函数向控件发送改变颜色的消息。

m_ProgressCtrl.SendMessage(PBM_SETBARCOLOR, 0, (LPARAM)RGB(255, 0, 0));
m_ProgressCtrl.SendMessage(PBM_SETBKCOLOR, 0, (LPARAM)RGB(0, 255, 0));
对于SendMessage()函数,第一个参数表示要发送的消息,第二个参数和第三个参数均表示消息的信息,其中,第三个参数表示要设置的颜色。以上代码的功能是将进度条颜色设置为红色,将进度控件背景颜色设置为绿色。

3.2 调用CProgressCtrl类控制颜色的成员函数

通过调用CProgressCtrl::SetBarColor()函数和CProgressCtrl::SetBkColor()函数来设置颜色。这两个成员函数最终还是向控件发送了改变颜色的消息。

m_ProgressCtrl.SetBarColor(RGB(255, 0, 0));
m_ProgressCtrl.SetBkColor(RGB(0, 255, 0));
以上代码与3.1 发送改变颜色的消息”中代码的功能相同。

经测试,修改进度条颜色的功能只能在VC++6.0中实现,VS2008及以上版本无法实现该功能

CProgressCtrl进度条 使用方法总结

CProgressCtrl 常用属性 CProgressCtrl 类常用成员函数 CProgressCtrl 代码示例 一、 CProgressCtrl 控件属性     当我们在处理大程序时...
  • qingzai_
  • qingzai_
  • 2016年03月03日 09:19
  • 3536

进度条重绘(CProgressCtrl)

一个简单的进度条重绘,这个是基于MFC的CProgressCtrl做的#if !defined(AFX_ENHPROGRESSCTRL_H__12909D73_C393_11D1_9FAE_81925...
  • u011100345
  • u011100345
  • 2017年03月25日 14:34
  • 249

CProgressCtrl::SetBarColor无效的缘由

CProgressCtrl::SetBarColor无效的缘由,苦心找了好久才发现……
  • npu_wy
  • npu_wy
  • 2014年06月12日 10:50
  • 992

不要拿SetBkColor,SetBkMode设置整个窗口的背景色啦

不要拿SetBkColor,SetBkMode设置整个窗口的背景色啦!! SetBkColor的作用范围 根据目前的经验,setBkColor只在两个地方好用:  1.填充空隙(Gaps):此处空隙...
  • zj060607
  • zj060607
  • 2014年03月19日 20:47
  • 4402

MFC进度条控件CProgressCtrl实现进度滚动效果

关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 在网上搜索半天发现了了这个方法:CProgressCtr...
  • milanleon
  • milanleon
  • 2015年11月07日 22:11
  • 5217

MFC带文字显示的进度条

很多时候我们都要在UI上显示事件的进度信息,MFC也提供了现成的进度条控件CProgressCtrl,只要在UI上放置一个CProgressCtrl控件,然后在程序中调用SetRange和SetPos...
  • jslmes
  • jslmes
  • 2016年07月15日 08:42
  • 3138

自绘CProgressCtrl进度条控件,支持自定义显示文本和进程百分比信息

// CXProgressCtrl 头文件 #pragma once // CXProgressCtrl class CXProgressCtrl : public CProgres...
  • VisualEleven
  • VisualEleven
  • 2011年01月26日 15:57
  • 10284

MFC 单文档应用程序如何为状态栏添加进度条

将CMainFrame头文件中的m_wndStatusBar变量的 public: CMFCStatusBar     m_wndStatusBar;
  • zhonglixianyun
  • zhonglixianyun
  • 2017年08月03日 20:45
  • 333

SetBkMode函数用法详解

输出的字符串时,发现存在背景色,这样的输出是破坏背景的。那需要使用什么方法来保持背景不变,而又能输出红色的字符串呢?比如按钮的文字颜色是黑色的,而背景是灰色的。这就需要使用SetBkMode函数来设置...
  • u010983763
  • u010983763
  • 2017年01月02日 21:47
  • 1363

MFC 用进度条在状态栏显示某个按钮响应函数的过程,并用多线程实时更新

因为写的一个按钮的响应函数在数据量大的情况下会出现未响应的情况,所以为了让人直观的可以觉得程序仍然还在运行,并实时显示函数的运行状态。 (1)首先MFC工程中新建一个类,这个类不是MFC类而是Gene...
  • HW140701
  • HW140701
  • 2016年09月01日 21:19
  • 2092
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC中进度控件的基本用法
举报原因:
原因补充:

(最多只允许输入30个字)