symbian 進度條 processbar

來源:互聯網
上載者:User

 進度條(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;

   }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.