易智游戏中的时间条,格斗游戏中的血条,相信是大家在制作游戏当中经常遇到的元素. 现在用一简单的教程介绍如何用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(); } 至此一个时间控件就做好了,大家可以按照以上的步骤做一下.
|