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;
}

Symbian中卡拉OK字幕实现相关推荐

  1. EDIUS中怎么实现卡拉OK字幕的制作

    我们在看歌曲的MV的时候,经常会看到歌词一个一个地按照人声的节奏出现,这种效果是怎么实现的呢?其实这种字幕效果的实现一点也不难,用EDIUS视频编辑软件就可以完成.下面就让小编通过一篇EDIUS教程文 ...

  2. MFC开发——卡拉OK字幕制作

    依然是为了赶老师作业,又去学了点东西,然后做了个小项目.首先在开始做项目之前,说一下整体思路,要实现卡拉OK字幕效果,就要对文本类与定时器有一定的掌握,通过定时器的更新,可以实现字体颜色的变化,与字幕 ...

  3. 卡拉ok歌词html,怎样制作卡拉ok字幕,如何亲手制作专业卡拉ok视频|卡拉ok字幕制作软件...

    如何亲手制作专业卡拉ok字幕视频,是今天的主题.卡拉OK和MTV一样,同样是种歌词字幕效果.不同在于,MTV是逐行显示的,而卡拉OK和我们在KTV看到的MV的歌词字幕一样,是逐字显示的.然后卡拉OK的 ...

  4. 用小灰熊做卡拉OK字幕

      发表时间:2007-1-31    阅读次数:662 1.制作歌词脚本文件 在进行歌曲卡拉OK字幕制作工作之前,我们先用文本编辑软件,如记事本程序将<会有那么一天>歌曲的歌词文件编辑好 ...

  5. VC实现卡拉OK字幕叠加

    一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...

  6. 个人第一个卡拉OK字幕诞生

    做到一半,我才发现自己选错了歌- 最麻烦的是不懂韩语,所以很难拿捏每个单字的起止时间,而且还有部分连音和变音,更懵了- 最后做完了还发现,原本的拼写完全被打乱,单字中间的空格统统不见了-- 要不要这么 ...

  7. 制作卡拉OK字幕KSC文件

    制作卡拉OK字幕KSC文件          1.制作歌词脚本文件          在进行歌曲卡拉OK字幕制作工作之前,我们先用文本编辑软件,如记事本程序将歌曲的歌词文件编辑好,行与行之间不要留空行 ...

  8. 继第一个卡拉OK字幕之后,第一个动态字幕诞生~T-ara - Day By Day

    前面发过一次截图,没有内容,竟然被告知不符合互联网相关安全规范-这又不是AV图- 先放链接: [MV] Day By Day (Dance Ver.) 字幕  [点击下载] [MV] Day By D ...

  9. 小灰熊卡拉OK字幕使用教程

    1.1 什么是KBuilder3.5 KBuilder 是"小灰熊卡拉OK字幕设计工具"的主程序,通过视频非线性编辑软件 Adobe Premiere.Sony Vegas 等将其 ...

最新文章

  1. iOS底层原理 - 常驻线程
  2. python 元组传参 *args 字典传参 **kwargs 的用法
  3. java如何实现乌龟爬行_乌龟是怎样爬行的
  4. 并发和Read-copy update(RCU)
  5. mt19937 -- 高质量随机数
  6. 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
  7. 现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心... [zz]
  8. 完全搞定iframe(框架)里的滚动条
  9. 【Spring学习笔记-MVC-12】Spring MVC视图解析器之ResourceBundleViewResolver
  10. Square(hdu 1511)
  11. 精品微信小程序ssm培训机构管理系统+后台管理系统|前后分离VUE
  12. CCNet:Criss-Cross Attention for semantic Segmentation
  13. 高一 Unit2 动名词
  14. 数据结构名词解释详细总结
  15. 计算机专业需不需要英语翻译,谈计算机专业英语翻译的方法.doc
  16. 远程控制与Nvidia显卡驱动和CUDA版本
  17. MySQL数据库——数据库设计概念和数据库设计步骤
  18. Kubernetes学习之Helm包管理器
  19. clickhouse的日期处理
  20. 迎难而上 数据库管理员怎样走向成功?(转)

热门文章

  1. ANSYS接触类型概述
  2. MAC苹果电脑关闭系统完整性保护SIP
  3. Linux中fork系统调用
  4. 「行业前瞻」我国智能安防监控行业的5大趋势
  5. ue4模型导出_UE4-导入和导出
  6. 知乎高赞:“那些花1500元买一条牛仔裤的人......”
  7. 51单片机编程简单入门——点亮实验板上的LED灯
  8. React实现登录表单
  9. ARouter 问题
  10. c++ 单源最短路径-狄杰斯特拉算法