今天看看了symbian的活动对象介绍,于是写一个有关活动对象的小程序,该程序是一个GUI程序,在view动态显示当前的时间,使用到的活动对象定义如下:
/**//*
============================================================================
Name : AOTest.h
Author : yuankai
Version : 1.0
Copyright : yuankaii@hotmail.com
Description : CAOTest declaration
============================================================================
*/
#ifndef AOTEST_H
#define AOTEST_H
#include <e32base.h> // For CActive, link against: euser.lib
#include <e32std.h> // For RTimer, link against: euser.lib
#include "HelloGUIAppView.h"
class CHelloGUIAppView;
class CAOTest : public CActive
{
public:
// Cancel and destroy
~CAOTest();
// Two-phased constructor.
static CAOTest* NewL(CHelloGUIAppView& view);
// Two-phased constructor.
static CAOTest* NewLC(CHelloGUIAppView& view);
public:
// New functions
// Function for making the initial request
void StartL(TTimeIntervalMicroSeconds32 aDelay);
private:
// C++ constructor
CAOTest(CHelloGUIAppView& view);
// Second-phase constructor
void ConstructL();
private:
// From CActive
// Handle completion
void RunL();
// How to cancel me
void DoCancel();
// Override to handle leaves from RunL(). Default implementation causes
// the active scheduler to panic.
TInt RunError(TInt aError);
private:
enum TAOTestState
{
EUninitialized, // Uninitialized
EInitialized, // Initalized
EError
// Error condition
};
private:
TInt iState; // State of the active object
RTimer iTimer; // Provides async timing service
TInt iCount;
CHelloGUIAppView & iView;//视图类对象的引用
};
#endif // AOTEST_H
对应类中函数实现:
/**//*
============================================================================
Name : AOTest.cpp
Author : yuankai
Version : 1.0
Copyright : yuankaii@hotmail.com
Description : CAOTest implementation
============================================================================
*/
#include "AOTest.h"
CAOTest::CAOTest(CHelloGUIAppView& view) :
CActive(EPriorityStandard) // Standard priority
,iCount(0),iView(view)
{
}
CAOTest* CAOTest::NewLC(CHelloGUIAppView& view)
{
CAOTest* self = new (ELeave) CAOTest(view);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CAOTest* CAOTest::NewL(CHelloGUIAppView& view)
{
CAOTest* self = CAOTest::NewLC(view);
CleanupStack::Pop(); // self;
return self;
}
void CAOTest::ConstructL()
{
User::LeaveIfError(iTimer.CreateLocal()); // Initialize timer
CActiveScheduler::Add(this); // Add to scheduler
}
CAOTest::~CAOTest()
{
Cancel(); // Cancel any request, if outstanding
iTimer.Close(); // Destroy the RTimer object
// Delete instance variables if any
}
void CAOTest::DoCancel()
{
iTimer.Cancel();
}
void CAOTest::StartL(TTimeIntervalMicroSeconds32 aDelay)
{
Cancel(); // Cancel any request, just to be sure
iState = EUninitialized;
iTimer.After(iStatus, aDelay); // Set for later
SetActive(); // Tell scheduler a request is active
}
void CAOTest::RunL()
{
if (iState == EUninitialized)
{
// Do something the first time RunL() is called
iState = EInitialized;
}
else if (iState != EError)
{
iView.DrawNow();
}
iTimer.After(iStatus, 1000000); // Set for 1 sec later
SetActive(); // Tell scheduler a request is active
}
TInt CAOTest::RunError(TInt aError)
{
return aError;
}
在上面的代码中我添加
if (iState == EUninitialized)
{
// Do something the first time RunL() is called
iState = EInitialized;
}
else if (iState != EError)
{
iView.DrawNow();
}
用来调用View中的Draw函数,使得程序中视图可以每1秒钟刷新(重绘)一次。
下面是View类的代码:
/**//*
============================================================================
Name : HelloGUIAppView.h
Author :
Copyright : Your copyright notice
Description : Declares view class for application.
============================================================================
*/
#ifndef __HELLOGUIAPPVIEW_h__
#define __HELLOGUIAPPVIEW_h__
// INCLUDES
#include "AOTest.h"
#include <coecntrl.h>
#include <e32base.h>
#include <e32std.h>
class CAOTest;
// CLASS DECLARATION
class CHelloGUIAppView : public CCoeControl
{
public:
// New methods
/**//**
* NewL.
* Two-phased constructor.
* Create a CHelloGUIAppView object, which will draw itself to aRect.
* @param aRect The rectangle this view will be drawn to.
* @return a pointer to the created instance of CHelloGUIAppView.
*/
static CHelloGUIAppView* NewL(const TRect& aRect);
/**//**
* NewLC.
* Two-phased constructor.
* Create a CHelloGUIAppView object, which will draw itself
* to aRect.
* @param aRect Rectangle this view will be drawn to.
* @return A pointer to the created instance of CHelloGUIAppView.
*/
static CHelloGUIAppView* NewLC(const TRect& aRect);
/**//**
* ~CHelloGUIAppView
* Virtual Destructor.
*/
virtual ~CHelloGUIAppView();
public:
// Functions from base classes
/**//**
* From CCoeControl, Draw
* Draw this CHelloGUIAppView to the screen.
* @param aRect the rectangle of this view that needs updating
*/
void Draw(const TRect& aRect) const;
/**//**
* From CoeControl, SizeChanged.
* Called by framework when the view size is changed.
*/
virtual void SizeChanged();
/**//**
* From CoeControl, HandlePointerEventL.
* Called by framework when a pointer touch event occurs.
* Note: although this method is compatible with earlier SDKs,
* it will not be called in SDKs without Touch support.
* @param aPointerEvent the information about this event
*/
virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);
/**//*
* 进行活动对象的初始化工作
*
* */
void ininMyActiveObject();
private:
// Constructors
CAOTest* iMyAO;
/**//**
* ConstructL
* 2nd phase constructor.
* Perform the second phase construction of a
* CHelloGUIAppView object.
* @param aRect The rectangle this view will be drawn to.
*/
void ConstructL(const TRect& aRect);
/**//**
* CHelloGUIAppView.
* C++ default constructor.
*/
CHelloGUIAppView();
};
#endif // __HELLOGUIAPPVIEW_h__
// End of File
在上面代码中一定要在类上方提前声明一下类中用到的其他类型:
例如在class CHelloGUIAppView : public CCoeControl之前添加class CAOTest;否则编译器编译的时候提示CAOTest未声明。
下面是View类中实现代码:
/**//*
============================================================================
Name : HelloGUIAppView.cpp
Author :
Copyright : Your copyright notice
Description : Application view implementation
============================================================================
*/
// INCLUDE FILES
#include <coemain.h>
#include "HelloGUIAppView.h"
#include<e32math.h>
// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
// CHelloGUIAppView::NewL()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CHelloGUIAppView* CHelloGUIAppView::NewL(const TRect& aRect)
{
CHelloGUIAppView* self = CHelloGUIAppView::NewLC(aRect); //使用NewLC进行视图的创建
CleanupStack::Pop(self); //把构造的对象的指针弹出清除栈中
return self;
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::NewLC()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CHelloGUIAppView* CHelloGUIAppView::NewLC(const TRect& aRect)
{
CHelloGUIAppView* self = new (ELeave) CHelloGUIAppView; //使用默认的构造函数进行视图的创建
CleanupStack::PushL(self); //把构造的对象的指针压入清除栈中
self->ConstructL(aRect); //使用第2阶段的构造函数进行视图的创建
return self;
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CHelloGUIAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL(); //为应用程序的视图创建一个window
// Set the windows size
SetRect(aRect); //设置视图窗口的大小为aRect
// Activate the window, which makes it ready to be drawn
ActivateL(); //激活窗口使得可以在它上面绘图
//初始化自己定义的活动对象
ininMyActiveObject();
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::CHelloGUIAppView()
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CHelloGUIAppView::CHelloGUIAppView()
{
// No implementation required
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::~CHelloGUIAppView()
// Destructor.
// -----------------------------------------------------------------------------
//
CHelloGUIAppView::~CHelloGUIAppView()
{
// No implementation required
if(iMyAO)
{
iMyAO->Cancel();
delete iMyAO;
iMyAO=NULL;
}
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::Draw()
// Draws the display.
// -----------------------------------------------------------------------------
//
void CHelloGUIAppView::Draw(const TRect& aRect) const
{
// Get the standard graphics context
CWindowGc& gc = SystemGc(); //获得标准的绘图上下文
// Gets the control's extent //获得当前控件大小的矩形
TRect drawRect(Rect());
// Clears the screen
gc.Clear(drawRect); //进行屏幕清除操作
// 自己写的绘图代码
//设置画刷的风格
//gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
//设置画笔的风格大小
gc.SetPenStyle(CGraphicsContext::ESolidPen);
gc.SetPenSize(TSize(1,1));
//设置画笔颜色
gc.SetPenColor(TRgb(255,0,0));
TInt x=aRect.Width()/10;
TInt y=aRect.Height()/4;
TPoint point(x,y);
//获得系统的时间并且显示出来
TTime time;
_LIT(timeformat,"%F%Y-%M-%D %H:%T:%S.%C\t");
time.HomeTime();
TBuf<60> str;
time.FormatL(str,timeformat);
//获得字体
const CFont * normalfont=iCoeEnv->NormalFont();
//设置字体
gc.UseFont(normalfont);
//绘制文字
gc.DrawText(str,point);
//撤销字体
gc.DiscardFont();
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::SizeChanged()
// Called by framework when the view size is changed.
// -----------------------------------------------------------------------------
//
void CHelloGUIAppView::SizeChanged()
{
DrawNow(); //视图大小发生变化的时候,进行重绘
}
// -----------------------------------------------------------------------------
// CHelloGUIAppView::HandlePointerEventL()
// Called by framework to handle pointer touch events.
// Note: although this method is compatible with earlier SDKs,
// it will not be called in SDKs without Touch support.
// -----------------------------------------------------------------------------
//
void CHelloGUIAppView::HandlePointerEventL(const TPointerEvent& aPointerEvent)
{
// Call base class HandlePointerEventL()
CCoeControl::HandlePointerEventL(aPointerEvent);//在支持触摸屏的情况下,调用父类的指针事件响应函数
}
void CHelloGUIAppView::ininMyActiveObject()
{
/**//*
* 此处无需再次创建一个活动规划器,因为GUI框架中已经存在
* */
//CActiveScheduler * scheduler=new (ELeave)CActiveScheduler();
//CleanupStack::PushL(scheduler);
//CActiveScheduler::Install(scheduler);
iMyAO=CAOTest::NewLC(*this);
iMyAO->StartL(0);
CActiveScheduler::Start();
//CleanupStack::PopAndDestroy(scheduler);
}
// End of File
在上面代码中void CHelloGUIAppView::ininMyActiveObject() 处无需再次创建一个活动对象规划器,只有在非GUI程序中需要,因为GUI框架中已经存在,GUI应用程序会自动安装和运行活动调度器,不用手动安装。如果重复创建活动对象规划器那么程序在运行时候提示E32USER-CBase43错误。