Symbian中卡拉OK字幕实现
纯属个人娱乐,代码贴出,有什么问题和建议可以留言。
实现步骤如下:
在.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即可。还算是比较方便的。
抱歉贴掉了一个函数,在这里补上
void ConvGbk2Uni(TDesC8& original, TDes& res)
{
//RFs
aFileServerSession = CEikonEnv::Static()->FsSession();
RFs
aFileServerSession;
aFileServerSession.Connect();
// CleanupStack::Pop();
CCnvCharacterSetConverter*
converter=CCnvCharacterSetConverter::NewLC();
if(converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,aFileServerSession)!=CCnvCharacterSetConverter::EAvailable)
User::Leave(KErrNotSupported);
TInt state=CCnvCharacterSetConverter::KStateDefault;
TPtrC8 str( original );
HBufC* iInfoText = HBufC::NewL(
str.Length() );
TPtr16 ptr = iInfoText->Des();
if(CCnvCharacterSetConverter::EErrorIllFormedInput ==
converter->ConvertToUnicode(ptr, str, state))
User::Leave(KErrArgument);
res.Zero() ;
res.Copy(ptr) ;
aFileServerSession.Close();
CleanupStack::PopAndDestroy();
delete iInfoText;
}

在Symbian环境下实现卡拉OK字幕功能,包括双缓冲位图资源的创建、释放及重画,使用特定字体颜色在两张位图上显示文字信息,并通过BitBlt函数将这两张图拼接实现字幕效果。实现过程涉及窗口、位图、字体、颜色和坐标等概念。

被折叠的 条评论
为什么被折叠?



