MFC用CProgressCtrl类来表示进度控件。在默认方式下,进度条控件沿水平方向放置,进度用一系列的方块来表示。
可以通过两种方法创建进度控件,一种是在Visaul Studio的资源编辑器中通过工具箱添加;另一种是通过代码添加。
一般基于对话框的MFC程序中,使用资源编辑器的方式来添加进度控件。在“资源视图”中打开对话框资源,之后在右侧的“工具栏”中将Progress Control控件拖入到对话框上,并且调整其位置和大小,如图1所示。
图1 通过“工具栏”添加进度控件
之后,选择右侧的“属性”按键,通过属性栏设置进度控件的属性,如图2所示。
图2 设置进度控件属性
其中,Smooth属性表示进度控件中的进度条是虚线还是实线,将该属性设置为True则是实线,False是虚线;Vertical属性表示控件是否是垂直的,True表示垂直,False表示水平。
基于文档/视图的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_Manual
是
CProgressCtrl
类的对象,需要注意的是该对象必须是类的成员变量,而不能是局部变量,否则控件无法显示。
Create()
函数的参数中,
WS_CHILD
表示该控件是子控件,
WS_VISIBLE
表示控件是可见的;
PBS_SMOOTH
和
PBS_VERTICAL
分别对应在“1.1
在资源编辑器中添加”中提到的
Smooth
属性和
Vertical
属性。
进度控件的作用就是通过进度条的活动来表示某个动作进展的情况。因此,在创建了进度控件之后,接下来就是要控制进度条的活动了。在控制进度条活动时,首先要设置进度条活动的范围,之后设置其的位置来实现进度条的活动。
通过CProgressCtrl::SetRange()函数设置进度条活动的范围。该函数的格式为
void SetRange(
short nLower,
short nUpper
);
其中,参数nLower
和
nUpper
分别表示进度条活动的起始位置和结束位置。
m_Progress_Control_Manual.SetRange(0, 100);
以上代码的功能是将进度条的活动范围设置到了0~100
之间,
m_Progress_Control_Manual
是在“
1.2
通过代码添加”中定义的
CProgressCtrl
类的对象。
可以通过三种方法设置进度条位置:第一种是直接设置位置;第二种是设置位置的偏移量;第三种是设置步进。
通过CProgressCtrl::SetPos()直接设置进度条的位置。该函数的作用是设置进度条的位置并且重画进度控件。该函数的格式为
int SetPos(int nPos);
其中,参数nPos
表示要设置的进度条位置,该位置必须在“
2.1
设置进度条活动的范围”中设置的范围之内;返回值是设置新位置之前,进度条所在的位置。
m_Progress_Control_Manual.SetPos(50);
以上代码的作用是将进度条的位置设置到整个进度控件的中间位置。
通过CProgressCtrl::OffsetPos()函数设置控制条新位置相对于之前位置的偏移量。该函数的格式为
int OffsetPos(int nPos);
其中,参数nPos
表示新位置相对于之前位置的偏移量;返回值是设置新位置之前,进度条所在的位置。
for(int i=0; i<4; ++i)
{
m_Progress_Control_Manual.OffsetPos((100-0)/4);
Sleep(100);
}
以上代码的功能是进度条每次前进整个进度控件的四分之一,分四次前进到进度控件的最顶端。
进度条的步进指的是进度条每次前进的长度。通过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
设置进度条位置的偏移量”中的代码功能相同。
通过向控件发送PBM_SETBARCOLOR消息或者调用CProgressCtrl::SetBarColor()函数来设置进度条的颜色;通过向控件发送PBM_SETBKCOLOR消息或者调用CProgressCtrl::SetBkColor()函数来设置进度控件背景颜色。
通过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()
函数,第一个参数表示要发送的消息,第二个参数和第三个参数均表示消息的信息,其中,第三个参数表示要设置的颜色。以上代码的功能是将进度条颜色设置为红色,将进度控件背景颜色设置为绿色。
通过调用CProgressCtrl::SetBarColor()函数和CProgressCtrl::SetBkColor()函数来设置颜色。这两个成员函数最终还是向控件发送了改变颜色的消息。
m_ProgressCtrl.SetBarColor(RGB(255, 0, 0));
m_ProgressCtrl.SetBkColor(RGB(0, 255, 0));
以上代码与“
3.1
发送改变颜色的消息”中代码的功能相同。
经测试,修改进度条颜色的功能只能在VC++6.0中实现,VS2008及以上版本无法实现该功能。