Symbian中卡拉OK字幕实现
<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length > 300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script>
纯属个人娱乐,代码贴出,有什么问题和建议可以留言。
实现步骤如下:
在.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;
}