Symbian中卡拉OK字幕实现

来源:互联网 发布:弗雷戴特cba数据 编辑:程序博客网 时间:2024/04/29 00:44

纯属个人娱乐,代码贴出,有什么问题和建议可以留言。(朋友写的,转来保存下,有空研究下)

实现步骤如下:

在.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网聚知识的力量