纯属个人娱乐,代码贴出,有什么问题和建议可以留言。(朋友写的,转来保存下,有空研究下)
实现步骤如下:
在.h文件中
private:
/**
* CreateBackBufferL.
* 用于创建双缓冲位图资源的函数.
*/
void CreateBackBufferL();
/**
* ReleaseBackBuffer.
* 用于释放双缓冲位图资源的函数.
*/
void ReleaseBackBuffer();
void DrawToBackBuffer();
//双缓冲用到的私有成员
private:
CFbsBitmap* iBackBuffer; //双缓冲中用到的位图
CFbsBitmapDevice* iBackBufferDevice; //用于得到Gc
CFbsBitGc* iBackBufferContext; //双缓冲位图Gc
CFbsBitmap* iBackBuffer_2; //双缓冲中用到的位图
CFbsBitmapDevice* iBackBufferDevice_2; //用于得到Gc
CFbsBitGc* iBackBufferContext_2; //双缓冲位图Gc
在。cpp中函数的实现
void CAuditionContainer::CreateBackBufferL()
{
// Create back buffer bitmap
iBackBuffer = new (ELeave) CFbsBitmap;
User::LeaveIfError( iBackBuffer->Create(TSize(240,30),
iEikonEnv->DefaultDisplayMode()));
// Create back buffer graphics context
iBackBufferDevice = CFbsBitmapDevice::NewL(iBackBuffer);
User::LeaveIfError(iBackBufferDevice->CreateContext(iBackBufferContext));
iBackBufferContext->SetPenStyle(CGraphicsContext::ESolidPen);
iBackBuffer_2 = new (ELeave) CFbsBitmap;
User::LeaveIfError( iBackBuffer_2->Create(TSize(240,30),
iEikonEnv->DefaultDisplayMode()));
// Create back buffer graphics context
iBackBufferDevice_2 = CFbsBitmapDevice::NewL(iBackBuffer_2);
User::LeaveIfError(iBackBufferDevice_2->CreateContext(iBackBufferContext_2));
iBackBufferContext_2->SetPenStyle(CGraphicsContext::ESolidPen);
}
void CAuditionContainer::ReleaseBackBuffer()
{
// Release double buffering classes
if (iBackBufferContext)
{
delete iBackBufferContext;
iBackBufferContext = NULL;
}
if (iBackBufferDevice)
{
delete iBackBufferDevice;
iBackBufferDevice = NULL;
}
if (iBackBuffer)
{
delete iBackBuffer;
iBackBuffer = NULL;
}
if (iBackBufferContext_2)
{
delete iBackBufferContext_2;
iBackBufferContext_2 = NULL;
}
if (iBackBufferDevice_2)
{
delete iBackBufferDevice_2;
iBackBufferDevice_2 = NULL;
}
if (iBackBuffer_2)
{
delete iBackBuffer_2;
iBackBuffer_2 = NULL;
}
}
void CAuditionContainer::DrawToBackBuffer()
{
const CFont *Font = CEikonEnv::Static()->DenseFont();
iBackBufferContext->UseFont(Font);
// _LIT(KText,"hello world");
TBuf8<20> msg8 ;
TBuf<20> KText ;
msg8.Format(_L8(" 谢谢您的使用")) ;
ConvGbk2Uni(msg8, KText) ;
iBackBufferContext->SetPenColor(KRgbGreen);
iBackBufferContext->DrawText(KText,TPoint(0,Font->HeightInPixels()));
iBackBufferContext_2->UseFont(Font);
// _LIT(KText,"hello world");
iBackBufferContext_2->SetPenColor(KRgbRed);
iBackBufferContext_2->DrawText(KText,TPoint(0,Font->HeightInPixels()));
}
void CAuditionContainer::Draw( const TRect& /*aRect*/ ) const
{
CWindowGc& gc = SystemGc();
gc.Clear();
gc.BitBlt(TPoint(0,100),iBackBuffer,TRect(TPoint(0,0),TSize(iBackBuffer->SizeInPixels().iWidth/5,iBackBuffer->SizeInPixels().iHeight)));
gc.BitBlt(TPoint(iBackBuffer_2->SizeInPixels().iWidth/5,100),iBackBuffer_2,TRect(TPoint(iBackBuffer_2->SizeInPixels().iWidth/5,0),TSize(iBackBuffer_2->SizeInPixels().iWidth*4/5,iBackBuffer_2->SizeInPixels().iHeight)));
}
使用步骤
第一步:初始化
在container的SetRect之前添加如下代码:
iBackBuffer = NULL;
iBackBufferDevice = NULL;
iBackBufferContext = NULL;
iBackBuffer_2 = NULL;
iBackBufferDevice_2 = NULL;
iBackBufferContext_2 = NULL;
第二步:在sizechange中添加代码
ReleaseBackBuffer(); //释放双缓冲位图资源
CreateBackBufferL(); //创建双缓冲位图资源
DrawToBackBuffer(); //重画双缓冲位图资源
第三步:编译运行即可。
图片没发上传,看不到效果了。
实现的基本思路:将 “谢谢您的使用”这句话分别用两种字体颜色写在两张位图上,在Draw函数中通过BitBlt函数将两张图拼接,即可实现一个字,两种颜色。如需要实现卡拉OK中的移动效果,只需要通过一个循环定时器,改变BitBlt函数中的TPoint和TRect即可。还算是比较方便的。
Symbian的黄埔论坛~~
http://www.DevDiv.net
DevDiv网聚知识的力量