📄 samplecontainer.cpp
字号:
/*
* ============================================================================
* Name : CSampleContainer from SampleContainer.h
* Part of : Sample
* Created : 2005-09-27 by
* Implementation notes:
* Initial content was generated by Series 60 AppWizard.
* Version :
* Copyright:
* ============================================================================
*/
// INCLUDE FILES
#include "SampleContainer.h"
#include "sampleappui.h"
#include <eiklabel.h> // for example label control
_LIT (KMultiBitmapFilename,"c:\\System\\Apps\\sample\\images.mbm");
// ================= MEMBER FUNCTIONS =======================
// ---------------------------------------------------------
// CSampleContainer::ConstructL(const TRect& aRect)
// EPOC two phased constructor
// ---------------------------------------------------------
//
void CSampleContainer::ConstructL(const TRect& aRect)
{
m_bAbort = EFalse;
m_bGainingForeground = EFalse;
m_iBallPos.iX = 0;
m_iBallPos.iY = 30;
m_iXVelocity = 5;
CreateWindowL();
SetRect(aRect);
ActivateL();
iCoeEnv->AddForegroundObserverL(*this);
m_pDSA = CDirectScreenAccess::NewL( iCoeEnv->WsSession(),
*iCoeEnv->ScreenDevice(),
Window(),
*this);
m_pPeriodic = CPeriodic::NewL(EPriorityMuchLess);
//初始化图形设备接口
InitGDI();
//加载位图
m_pBitmap_Background = CreateBitmapLC(KMultiBitmapFilename,EMbmImagesImage1);
m_pBitmap_Ball = CreateBitmapLC(KMultiBitmapFilename,EMbmImagesImage2);
m_pBitmap_Ball_Mask = CreateBitmapLC(KMultiBitmapFilename,EMbmImagesImage2_mask);
}
void CSampleContainer::InitGDI()
{
//创建位图
m_pBackSurface = new (ELeave)CFbsBitmap();
//设置该位图宽高和显示模式(EColor4k:4096色)
User::LeaveIfError(m_pBackSurface->Create(TSize(SCREEN_WIDTH, SCREEN_HEIGHT), EColor4K));
//用该位图创建TBitmapUtil实例
m_pBmpUtil = new (ELeave) TBitmapUtil(m_pBackSurface);
//基于该位图创建位图设备
m_pBackDevice = CFbsBitmapDevice::NewL(m_pBackSurface);
//基于该设备创建位图图形场景
User::LeaveIfError(m_pBackDevice->CreateContext(m_pBackGc));
m_pBackGc->SetBrushStyle(CGraphicsContext::ESolidBrush) ;
ResetBackSurfDataPtr();
}
CFbsBitmap* CSampleContainer::CreateBitmapLC(const TDesC& aFileName,TInt aId)
{
CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();
CleanupStack::PushL(bitmap);
TInt loadException = bitmap->Load(aFileName,aId);
User::LeaveIfError(loadException);
CleanupStack::Pop();
return bitmap;
}
TInt CSampleContainer::PeriodicCallBack(TAny *pAny)
{
((CSampleContainer*)pAny)->GameCycle();
return 0;
}
void CSampleContainer::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)
{
if (m_pDSA)
{
AbortNowImpl();
m_pDSA->Cancel();
}
}
void CSampleContainer::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/)
{
if (m_bGainingForeground)
{
if (m_pDSA && !m_pDSA->IsActive())
{
StartL();
}
}
}
void CSampleContainer::StartL()
{
TRAPD(dsaError, m_pDSA->StartL());
if (dsaError == KErrNone)
{
m_pGc = m_pDSA->Gc(); // Get graphics context for drawing
m_pGc->SetClippingRegion(m_pDSA->DrawingRegion()); // Set the clipping to this region
RestartImpl();
}
}
void CSampleContainer::HandleGainingForeground()
{
m_bGainingForeground = ETrue;
if (m_pDSA && !m_pDSA->IsActive())
{
StartL();
}
}
void CSampleContainer::HandleLosingForeground()
{
m_bGainingForeground = EFalse;
}
void CSampleContainer::RestartImpl()
{
ResetBackSurfDataPtr();
m_bAbort = EFalse;
m_pPeriodic->Start(0, 1000000 / 60, TCallBack(PeriodicCallBack,(TAny*)this)); // 12帧
}
void CSampleContainer::AbortNowImpl()
{
m_bAbort = ETrue;
m_pPeriodic->Cancel();
}
void CSampleContainer::GameCycle()
{
//利用数据内存指针填充脱屏位图为黑色即刷新屏幕
Mem::FillZ((TAny*)m_pBackSurfaceData,SCREEN_WIDTH*SCREEN_HEIGHT*sizeof(TUint16));
//更新数据
Update();
//将脱屏位图绘制到屏幕
DrawNow();
}
void CSampleContainer::ResetBackSurfDataPtr()
{
//锁定位图堆
m_pBmpUtil->Begin(TPoint(0, 0));
//获得脱屏位图内存数据地址
m_pBackSurfaceData = (TUint16*)m_pBackSurface->DataAddress();
//释放堆
m_pBmpUtil->End();
}
void CSampleContainer::Update()
{
int iNewXPos = m_iBallPos.iX + m_iXVelocity;
if (iNewXPos < 0 ||
iNewXPos + m_pBitmap_Ball->SizeInPixels().iWidth > 176)
{
m_iXVelocity = - m_iXVelocity;
return;
}
m_iBallPos.iX = m_iBallPos.iX + m_iXVelocity;
}
// ---------------------------------------------------------
// CSampleContainer::Draw(const TRect& aRect) const
// ---------------------------------------------------------
//
void CSampleContainer::PartialReset(CFbsBitGc& aGc) const
{
aGc.SetPenSize(TSize(1,1));
aGc.SetPenColor(KRgbBlack);
aGc.SetPenStyle(CFbsBitGc::ESolidPen);
aGc.SetDrawMode(CFbsBitGc::EDrawModePEN);
aGc.DiscardFont();
aGc.DiscardBrushPattern();
aGc.SetBrushColor(KRgbWhite);
aGc.SetBrushStyle(CFbsBitGc::ENullBrush);
aGc.SetCharJustification(0,0);
aGc.SetWordJustification(0,0);
aGc.SetDitherOrigin(TPoint(0,0));
aGc.SetPenStyle(CFbsBitGc::ENullPen);
aGc.SetShadowMode(EFalse);
aGc.SetStrikethroughStyle(EStrikethroughOff);
aGc.SetUnderlineStyle(EUnderlineOff);
aGc.SetUserDisplayMode(ENone);
}
void CSampleContainer::Draw(const TRect& aRect) const
{
if (!m_bAbort)
{
PartialReset(*m_pBackGc);
//将背景图片画到缓冲区
m_pBackGc->BitBlt(TPoint(0,0),m_pBitmap_Background);
//利用蒙版技术将红球图片画到缓冲区
m_pBackGc->BitBltMasked(m_iBallPos,m_pBitmap_Ball,m_pBitmap_Ball->SizeInPixels(),m_pBitmap_Ball_Mask,ETrue);
PartialReset(*m_pBackGc);
//将缓冲区内容画到屏幕上
m_pDSA->Gc()->BitBlt(TPoint(0,0),m_pBackSurface);
m_pDSA->ScreenDevice()->Update();
}
}
// Destructor
CSampleContainer::~CSampleContainer()
{
//注意析构顺序
if (m_pBackGc)
{
delete m_pBackGc;
m_pBackGc = NULL;
}
if (m_pBackDevice)
{
delete m_pBackDevice;
m_pBackDevice = NULL;
}
if (m_pBackSurface)
{
delete m_pBackSurface;
m_pBackSurface = NULL;
}
if (m_pBmpUtil)
{
delete m_pBmpUtil;
m_pBmpUtil = NULL;
}
if (m_pBitmap_Ball)
{
delete m_pBitmap_Ball;
m_pBitmap_Ball = NULL;
}
if (m_pBitmap_Background)
{
delete m_pBitmap_Background;
m_pBitmap_Background = NULL;
}
if (m_pBitmap_Ball_Mask)
{
delete m_pBitmap_Ball_Mask;
m_pBitmap_Ball_Mask = NULL;
}
iCoeEnv->RemoveForegroundObserver(*this);
if (m_pPeriodic)
{
m_pPeriodic->Cancel();
delete m_pPeriodic;
m_pPeriodic = NULL;
}
if (m_pDSA)
{
m_pDSA->Cancel();
delete m_pDSA;
m_pDSA = NULL;
}
}
// ---------------------------------------------------------
// CSampleContainer::CountComponentControls() const
// ---------------------------------------------------------
//
TInt CSampleContainer::CountComponentControls() const
{
return 0; // return nbr of controls inside this container
}
// ---------------------------------------------------------
// CSampleContainer::ComponentControl(TInt aIndex) const
// ---------------------------------------------------------
//
CCoeControl* CSampleContainer::ComponentControl(TInt aIndex) const
{
switch ( aIndex )
{
default:
return NULL;
}
}
// ---------------------------------------------------------
// CSampleContainer::HandleControlEventL(
// CCoeControl* aControl,TCoeEvent aEventType)
// ---------------------------------------------------------
//
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -