进度条(Progressbar)控件用于显示某个持续时间比较长的操作进度,例如邮件接受进度和文件下载进度大牛股。本节的ProgressBar示例程序显示了一个简单的进度条,进度随着事件增长,ProgressBar示例程序的运行界面如下如所示:
CEikProgressInfo类的基类
进度条的类是在头文件eikprogi.h中定义的CEikProgressInfo。该类派生自CEIBorderedControl类。
1:在资源文件中定义进度条
进度条的资源类型在eikon.rh文件中定义:
STRUCT PROGRESSINFO
{
WORD text_type = 0;
WORD splits_in_block = 0;
LONG finalval;
LONG width = 120;
LONG height = 10;
}
text_type是进度条上的文本显示设置,splits_in_block是进度的每一步在显示的条格数,这两个值在S60 2.X版本的SDK中不再支持。
finalval设置了进度条一共包含多少步,它是进度条资源文件中必须定义的值。width值设置进度条的宽度,height值设置进度条的高度,这两个值都是以像素为单位。
ProgressBar示例程序中,进度条的资源定义如下:
RESOURCE PROGRESSINFO r_progress_bar
{
text_type = 0;
splits_in_block = 0;
finalval = 20;
width = 120;
height = 20;
}
2: 构造进度条控件
首先在progressBar示例程序的主控件CProgressBarContainer的头文件中,定义进度条控件:
class CEikProgressInfo;
class CProgressBarContainer:public CCoeControl, MCoeControlObserver
{
private:
CEikProgressInfo* iPbar;
}
构造进度条控件的过程与构造滑块类似,都是在主控件的ConstructL()函数中,从资源定义中构造,参考代码如下:
#include //使用CEikProgressInfo
#include //使用R_PROGRESS_BAR资源
#include //使用iCoeEnv
#include //使用TResourceReader
void CProgressBarContainer::ConstructL(const TRect& aRect)
{
TResourceReader reader;
iCoeEnv->CreateResourceResderLC(reader, R_PROGRESS_BAR);
iPBar = new(ELeave)CEikProgressInfo();
iPBar = new(ELeave)CEikProgressInfo();
CleanupStack::PopAndDestroy();
iPbar->SetPosition(TPoint(10,40));
iPbar->SetContainerWindowL(*this);
}
3: 调整进度条的进度
CEikProgressInfo类提供了多个设置进度的函数,比较常用的是IncrementAndDraw()函数和SetAndDraw()函数,它们的定义如下:
void IncrementAndDraw(TInt aInc);
void SetAndDraw(TInt aValue);
IncrementAndDraw()函数的作用是将进度条增加aInc步,并刷新进度条显示。aInc可以是负数,此时进度条的进度会向后跳帧gdang进度条值达到或者超过finalval定义的值后,进度条上显示为最大的进度。SetAndDraw()函数的作用是将当前进度设置成参数aValue代表的一个绝对的值。
ProgressBar示例程序中使用周期定时器CPeriodic控制进度条的前进过程,CPeriodic可以产生周期性定时器事件,示例程序在定时器事件出发时增加进度条的进度。
首先在CProgressBarContainer类中定义定时器对象和相关处理函数,参考代码如下:
class CProgressBarContainer:public CCoeControl, MCoeControlObserver
{
private:
static TInt Period(TAny* aPtr);
void DoStep();
CPeriodic* iPeriodic Timer;
}
其中iPeriodicTimer是周期定时器CPeriodic对象,Period()函数必须是一个静态函数,它作为定时器事件触发时的回调函数,DoStep()函数是实际的增加进度的函数。这两个函数在CProgressBarContainer.cpp文件中实现,代码如下:
void CProgressBarContainer::DoStep()
{
iPBar->IncrementAndDraw();
}
TInt CProgressBarContainer::Period(TAny* aPtr)
{
((CProgressBarContainer*)aPtr)->DoStep();
return TRUE;
}
启动定时器之前首先构造定时器对象,然后使用Start()函数启动定时器,Start()函数的参数中,除了指定周期定时的事件外,还要指定定时器事件触发时需要调用过的回调函数,这里是CProgressBarContainer类的静态函数Period(),参考代码如下:
iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityStandard);
iPeriodicTimer->Start(500000,200000,TCallBack(CProgressBarContainer::Period,this));
需要注意的是,在CProgressBarContainer的析构函数中,除了要删除进度条控件外,还要删除定时器对象,参考代码如下:
CProgressBarContainer::~CprogressBarContaier()
{
delete iPBar;
if(iPeriodicTimer != NULL)
{
iPeriodicTimer->Cancel();
}
delete iPeriodicTimer;
}