Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3472441
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: C/C++

2009-04-20 22:47:06

进度条(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;

   }

阅读(538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~