CSDN专家博客精华版

为人民服务!
  首页  :: 新随笔  :: 管理

时间条控件制作简明教程

Posted on 2007-12-17 10:30  csdnexpert  阅读(133)  评论(0编辑  收藏  举报

 转自百度symbian吧 > 浏览贴子:http://post.baidu.com/f?kz=139962353

 

           易智游戏中的时间条,格斗游戏中的血条,相信是大家在制作游戏当中经常遇到的元素. 现在用一简单的教程介绍如何用S60自定义控件完成它,该控件可以随意控制大小,控制时间长度. 

          该控件将用到,窗口,如何制作自定义,时间周期类等知识.

          制作之前首先请大家看看 Nokia Forum 关于 自定义控件的原理和教程 
    CPeriodic 的类的使用可以参考sdk中
    Developer Library >> API Reference >> C++ API reference >> Timers and Timing Services >> CPeriodic

1.类的定义:
Code:
class CMyTimerContainer : public CCoeControl
{
 public:
    
    void ConstructL (TInt aSecond ,TPoint aPoint, TSize aSize);// aSecond 初始的秒数,TPoint 控件所在位置; TSize控件大小
    ~CMyTimerContainer();
    void Draw(const TRect& aRect) const;

    static TInt Start__(TAny* aObject);    //周期函数
    void Start_();//周期函数
private: //data

  CPeriodic* iPeriodic; 
  TInt iLeft; //剩余的时间
  TInt iTotal;//总共的时间
  TPoint iPoint; //控件所在位置,
  TSize iSize; //控件的大小
}


2.周期函数:

Code:
TInt CMyTimerContainer::Start__(TAny* aObject)
{
  ((CMyTimerContainer*)aObject)->Start_(); // cast, and call non-static function
    return 1;
}

void CMyTimerContainer::Start_()
{
  iLeft--;
  if(iLeft==0)
  {
    DrawNow();
    iPeriodic->Cancel();
    return;
  }
  DrawNow();
}
3.绘图函数
Code:


void CMyTimerContainer::Draw(const TRect& aRect) const
    {
    CWindowGc& gc = SystemGc();

    /*画背景*************************/
    gc.SetBrushColor( KRgbBlack );
    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
    gc.DrawRect(aRect);

    /*画进度条*************************/
     gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
     gc.SetBrushColor( KRgbRed );
     gc.SetPenStyle( CGraphicsContext::ENullPen );
     gc.DrawRect( TRect(TSize(iLeft*Size().iWidth/iTotal,iSize.iHeight)) );
    }

4.控件的构造



Code:
void CMyTimerContainer::ConstructL(TInt aSecond ,TPoint aPoint, TSize aSize)
    {
    CreateWindowL();
    iTotal = aSecond;
    iLeft = iTotal;
    iPoint = aPoint;
    iSize = aSize;
    iPeriodic = CPeriodic::NewL(CActive::EPriorityIdle);
    iPeriodic->Start(0/*8000000*/, 1000000/*35714*/, TCallBack(Start__, this));
    SetExtent(aPoint,aSize);
    ActivateL();
    }

5.如何调用该控件



Code:
a,在XXXContainer.h中加入该控件
   private: //data
     CMyTimerContainer* iTimer;

b,在构造函数中构造其,秒数,位置,以及大小
void CXXXXContainer::ConstructL(const TRect& aRect)
    {
    CreateWindowL();

    iTimer =  new (ELeave) CMyTimerContainer;
    iTimer->ConstructL( 60/*init seconds*/,TPoint(0,100),TSize(176,15),this);

    SetRect(aRect);
    ActivateL();
    }
至此一个时间控件就做好了,大家可以按照以上的步骤做一下.

 

贴子相关图片:



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1479018