双缓冲显示字幕(卡拉ok字幕)
思路:
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;
- void CShowFontView::OnTimer(UINT nIDEvent)
- {
- CClientDC dc(this);
- CFont font;
- CRect rt;
- GetClientRect( &rt );
- TEXTMETRIC tm;
- dc.GetTextMetrics(&tm);
- static int nindex = ;
- m_nWithRect += ;
- if( !nindex )
- m_strText = GetGeci( nindex );
- int nTextHei = dc.GetTextExtent( m_strText ).cy; // length of horizontal label文字的高度
- int nTextWei = dc.GetTextExtent( m_strText ).cx; // length of horizontal label文字的宽度
- RectShow.SetRect( , , +nTextWei+ , + nTextHei );
- if( m_nWithRect > nTextWei )
- {
- m_nWithRect = ;
- nindex ++;
- m_strText = GetGeci( nindex );
- Sleep();
- }
- rectRetangle.SetRect( nTextWei + - m_nWithRect , , nTextWei + , +nTextHei );
- rectColor.SetRect( , , +m_nWithRect , +nTextHei );
- Sleep();
- DrawText( m_strText );
- CView::OnTimer(nIDEvent);
- }
然后呢就把字贴出来;怎样贴呢就根据需求;
- void CShowFontView::DrawText( CString strText )
- {
- if( strText.IsEmpty() )
- {
- return;
- }
- static int ncout = ;
- CClientDC dc( this );
- CRect rtclient;
- GetClientRect( &rtclient );
- CBitmap MemBitmap;
- CDC MemDC; //首先定义一个显示设备对象
- MemDC.CreateCompatibleDC( &dc );
- MemBitmap.CreateCompatibleBitmap( &dc , rtclient.Width() , rtclient.Height() );
- MemDC.SelectObject( &MemBitmap );
- MemDC.FillSolidRect( , , rtclient.Width() , rtclient.Height() , RGB( , , ));
- MemDC.SetTextColor( RGB( , , ));
- MemDC.DrawText( strText , &rectRetangle , DT_LEFT );//字幕向左滚动;
- MemDC.SetTextColor( RGB( , , ) );//先把这段歌词全部显示
- MemDC.DrawText( strText , &RectShow , DT_LEFT );
- MemDC.SetTextColor( RGB( , , ));//在把要变色的再显示一遍;
- MemDC.DrawText( strText , &rectColor , DT_LEFT );
- dc.BitBlt( , , rtclient.Width() , rtclient.Height() , &MemDC , , , SRCCOPY );
- MemBitmap.DeleteObject();
- MemDC.DeleteDC();
- ncout ++;
- }
- int CShowFontView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -)
- return -;
- readGeci();
- SetTimer( , , );
- return ;
- }
- BOOL CShowFontView::OnEraseBkgnd(CDC* pDC)
- {
- return CView::OnEraseBkgnd(pDC);
- }
- void CShowFontView::readGeci()
- {
- CStdioFile dlg;
- if( dlg.Open("res\\text.txt" , CFile::modeRead ) )
- {
- CString strText;
- while ( dlg.ReadString( strText ))
- {
- m_ListCtring.AddHead( strText );
- }
- dlg.Close();
- }
- }
- CString CShowFontView::GetGeci( int nindex )
- {
- CString strText;
- if( nindex < m_ListCtring.GetCount()&& m_ListCtring.GetCount()> )
- strText = m_ListCtring.GetAt( m_ListCtring.FindIndex( m_ListCtring.GetCount() -nindex - ));
- else
- KillTimer();
- return strText;
- }
双缓冲显示字幕(卡拉ok字幕)的更多相关文章
- VC实现卡拉OK字幕叠加
一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...
- (转载)GDI+双缓冲
双缓冲在GDI+里可以有效的提高描画效率.改善显示的质量. 下面的代码是一个最简单的双缓冲的模板.可以根据需要,做简单的修改即可. Bitmap CacheImage( [Width], [Heigh ...
- OpenGL的消隐与双缓冲
首先是大家可能已经发现,在我们之前提到的所有例子中,在图形的旋转过程中整个图形都有一定程度的闪烁现象,显得图形的过渡极不平滑,这当然不是我们所要的效果,幸好opengl 支 持一个称为双缓存的技术,可 ...
- MFC双缓冲绘图实例
本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...
- C#绘图双缓冲
C#绘图双缓冲 C#双缓冲解释: 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉 ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- Qt组件中的双缓冲无闪烁绘图
双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- C# 控件双缓冲控制 ControlStyles 枚举详解
ControlStyles 枚举 .NET Framework 4 指定控件的样式和行为. 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合. 命名空间: Sy ...
随机推荐
- jchdl - RTL实例 - And
https://mp.weixin.qq.com/s/86d_sFN0xVqk1xRaRyoAkg 使用rtl语法,实现简单的与门. 参考链接 https://github.com/wjcdx ...
- Java实现 LeetCode 326 3的幂
326. 3的幂 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: tru ...
- Java实现 蓝桥杯 数独游戏
你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...
- java实现第六届蓝桥杯九数组分数
九数组分数 九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. public class A { public s ...
- Mysql添加索引及索引的优缺点
一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高 ...
- Java对象实例化的过程
1.先为对象分配空间,并按属性类型默认初始化 ps:八种基本数据类型,按照默认方式初始化,其他数据类型默认为null 2.父类属性的初始化(包括代码块,和属性按照代码顺序进行初始化) 3.父类构造函数 ...
- 聊一聊Asp.net过滤器Filter那一些事
最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断.权限认证.日志记录.异常处理等通用操作,在项目中的action中到处都是.在代码优化上,这一点是很重要着力点.这是.net中的过滤器 ...
- 关于adb的下载和基本使用
我们无论是开发还是测试,对Android SDK一定都不陌生,如果我们要使用adb(Android debug bridge)命令,那么这个就必不可少了. 1.给大家提供一个下载地址:https:// ...
- cnblogs 博客爬取 + scrapy + 持久化 + 分布式
目录 普通 scrapy 分布式爬取 cnblogs_spider.py 普通 scrapy # -*- coding: utf-8 -*- import scrapy from ..items im ...
- 如何在Vim中的查找替换
“%s/最/第二/g” 用vim的人都知道,这是把所有“最”替换成“第二”的意思.其实vim的查找替换功能非常强大,用的好可以极大提升效率. vim的查找替换命令如下所示: :{作用范围}s/{ ...