進度條(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
<eikprogi.h>//使用CEikProgressInfo
#include
<ProgressBar.rsg>//使用R_PROGRESS_BAR資源
#include
<coemain.h>//使用iCoeEnv
#include
<barsread.h>//使用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;
}