思路:

1.设置定时器SetTime,在Ontime()里面确定显示矩形的大小,让后用DrawText把字铁道矩形上面;

2.

int nTextHei = dc.GetTextExtent( m_strText ).cy; // length of horizontal label文字的高度
int nTextWei = dc.GetTextExtent( m_strText ).cx; // length of horizontal label文字的宽度

获取文字高度和宽度。

3.设置矩形的大小

矩形的宽度可以每次都加1;

  1. void CShowFontView::OnTimer(UINT nIDEvent)
  2. {
  3.  
  4. CClientDC dc(this);
  5. CFont font;
  6. CRect rt;
  7. GetClientRect( &rt );
  8. TEXTMETRIC tm;
  9. dc.GetTextMetrics(&tm);
  10. static int nindex = ;
  11.  
  12. m_nWithRect += ;
  13. if( !nindex )
  14. m_strText = GetGeci( nindex );
  15. int nTextHei = dc.GetTextExtent( m_strText ).cy; // length of horizontal label文字的高度
  16. int nTextWei = dc.GetTextExtent( m_strText ).cx; // length of horizontal label文字的宽度
  17. RectShow.SetRect( , , +nTextWei+ , + nTextHei );
  18.  
  19. if( m_nWithRect > nTextWei )
  20. {
  21. m_nWithRect = ;
  22. nindex ++;
  23. m_strText = GetGeci( nindex );
  24. Sleep();
  25. }
  26.  
  27. rectRetangle.SetRect( nTextWei + - m_nWithRect , , nTextWei + , +nTextHei );
  28. rectColor.SetRect( , , +m_nWithRect , +nTextHei );
  29. Sleep();
  30. DrawText( m_strText );
  31.  
  32. CView::OnTimer(nIDEvent);
  33. }

然后呢就把字贴出来;怎样贴呢就根据需求;

  1. void CShowFontView::DrawText( CString strText )
  2. {
  3. if( strText.IsEmpty() )
  4. {
  5. return;
  6. }
  7. static int ncout = ;
  8. CClientDC dc( this );
  9. CRect rtclient;
  10. GetClientRect( &rtclient );
  11. CBitmap MemBitmap;
  12. CDC MemDC; //首先定义一个显示设备对象
  13. MemDC.CreateCompatibleDC( &dc );
  14. MemBitmap.CreateCompatibleBitmap( &dc , rtclient.Width() , rtclient.Height() );
  15. MemDC.SelectObject( &MemBitmap );
  16. MemDC.FillSolidRect( , , rtclient.Width() , rtclient.Height() , RGB( , , ));
  17. MemDC.SetTextColor( RGB( , , ));
  18. MemDC.DrawText( strText , &rectRetangle , DT_LEFT );//字幕向左滚动;
  19.  
  20. MemDC.SetTextColor( RGB( , , ) );//先把这段歌词全部显示
  21. MemDC.DrawText( strText , &RectShow , DT_LEFT );
  22.  
  23. MemDC.SetTextColor( RGB( , , ));//在把要变色的再显示一遍;
  24. MemDC.DrawText( strText , &rectColor , DT_LEFT );
  25.  
  26. dc.BitBlt( , , rtclient.Width() , rtclient.Height() , &MemDC , , , SRCCOPY );
  27. MemBitmap.DeleteObject();
  28. MemDC.DeleteDC();
  29. ncout ++;
  30.  
  31. }
  32. int CShowFontView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  33. {
  34. if (CView::OnCreate(lpCreateStruct) == -)
  35. return -;
  36. readGeci();
  37. SetTimer( , , );
  38. return ;
  39. }
  40.  
  41. BOOL CShowFontView::OnEraseBkgnd(CDC* pDC)
  42. {
  43.  
  44. return CView::OnEraseBkgnd(pDC);
  45. }
  46. void CShowFontView::readGeci()
  47. {
  48. CStdioFile dlg;
  49. if( dlg.Open("res\\text.txt" , CFile::modeRead ) )
  50. {
  51. CString strText;
  52. while ( dlg.ReadString( strText ))
  53. {
  54. m_ListCtring.AddHead( strText );
  55. }
  56. dlg.Close();
  57. }
  58. }
  59. CString CShowFontView::GetGeci( int nindex )
  60. {
  61. CString strText;
  62. if( nindex < m_ListCtring.GetCount()&& m_ListCtring.GetCount()> )
  63. strText = m_ListCtring.GetAt( m_ListCtring.FindIndex( m_ListCtring.GetCount() -nindex - ));
  64. else
  65. KillTimer();
  66. return strText;
  67. }

双缓冲显示字幕(卡拉ok字幕)的更多相关文章

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

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

  2. (转载)GDI+双缓冲

    双缓冲在GDI+里可以有效的提高描画效率.改善显示的质量. 下面的代码是一个最简单的双缓冲的模板.可以根据需要,做简单的修改即可. Bitmap CacheImage( [Width], [Heigh ...

  3. OpenGL的消隐与双缓冲

    首先是大家可能已经发现,在我们之前提到的所有例子中,在图形的旋转过程中整个图形都有一定程度的闪烁现象,显得图形的过渡极不平滑,这当然不是我们所要的效果,幸好opengl 支 持一个称为双缓存的技术,可 ...

  4. MFC双缓冲绘图实例

    本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...

  5. C#绘图双缓冲

    C#绘图双缓冲 C#双缓冲解释: 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉 ...

  6. C#-gdi绘图,双缓冲绘图,Paint事件的触发

    一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1  绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...

  7. Qt组件中的双缓冲无闪烁绘图

      双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...

  8. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  9. C# 控件双缓冲控制 ControlStyles 枚举详解

    ControlStyles 枚举 .NET Framework 4    指定控件的样式和行为. 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合. 命名空间:  Sy ...

随机推荐

  1. jchdl - RTL实例 - And

    https://mp.weixin.qq.com/s/86d_sFN0xVqk1xRaRyoAkg   使用rtl语法,实现简单的与门.   参考链接 https://github.com/wjcdx ...

  2. Java实现 LeetCode 326 3的幂

    326. 3的幂 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: tru ...

  3. Java实现 蓝桥杯 数独游戏

    你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...

  4. java实现第六届蓝桥杯九数组分数

    九数组分数 九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. public class A { public s ...

  5. Mysql添加索引及索引的优缺点

    一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高 ...

  6. Java对象实例化的过程

    1.先为对象分配空间,并按属性类型默认初始化 ps:八种基本数据类型,按照默认方式初始化,其他数据类型默认为null 2.父类属性的初始化(包括代码块,和属性按照代码顺序进行初始化) 3.父类构造函数 ...

  7. 聊一聊Asp.net过滤器Filter那一些事

    最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断.权限认证.日志记录.异常处理等通用操作,在项目中的action中到处都是.在代码优化上,这一点是很重要着力点.这是.net中的过滤器 ...

  8. 关于adb的下载和基本使用

    我们无论是开发还是测试,对Android SDK一定都不陌生,如果我们要使用adb(Android debug bridge)命令,那么这个就必不可少了. 1.给大家提供一个下载地址:https:// ...

  9. cnblogs 博客爬取 + scrapy + 持久化 + 分布式

    目录 普通 scrapy 分布式爬取 cnblogs_spider.py 普通 scrapy # -*- coding: utf-8 -*- import scrapy from ..items im ...

  10. 如何在Vim中的查找替换

    “%s/最/第二/g” 用vim的人都知道,这是把所有“最”替换成“第二”的意思.其实vim的查找替换功能非常强大,用的好可以极大提升效率. vim的查找替换命令如下所示:    :{作用范围}s/{ ...