双缓冲显示字幕(卡拉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 ...
随机推荐
- Java实现 LeetCode 402 移掉K位数字
402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...
- Java实现 蓝桥杯VIP 算法提高 高精度乘法
算法提高 高精度乘法 时间限制:1.0s 内存限制:256.0MB 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-2 ...
- java实现第六届蓝桥杯垒骰子
垒骰子 题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...
- 解读三组容易混淆的Dockerfile指令
长话短说,今天分享三组容易混淆的Dockerfile指令, 帮助大家编写更优雅的Dockfile文件.构建更纯净的Docker镜像. COPY vs ADD COPY.ADD主体功能类似:从指定位置拷 ...
- 手把手教你用JS/Vue/React实现幸运水果机(80后情怀之作)
项目体验地址 免费视频教程 分别使用原生JS,Vue和React,手把手教你开发一个H5小游戏,快速上手Vue和React框架的使用. 项目截图 在线体验 在线体验 游戏介绍 幸运水果机是一款街机游戏 ...
- SpringBoot 中注解方式的拦截过滤
使用场景 公司运行的App 登陆-验证码短信接口,遭到大量的恶意攻击.处于安全的考虑,需要客户端api目前的一些接口加上验证签名的功能,以提高安全性. 现行的App之前也有过签名的秘钥在,后来出于性能 ...
- window.open打开新的独立页面
如下所示的代码: window.open('xxxxx.html', '_blank', 'height=100, width=400, top=0, left=0, toolbar=no, menu ...
- ucore系统 eclipse-cdt实验环境准备
官网下载eclipse eclipse-cpp-luna-SR2-linux-gtk-x86_64.tar.gz省略安装jdk 等配置解压安装即可导入实验的项目 点击完成即可完成导入 开始配置qemu ...
- Python函数&异常处理
1. 函数基础 1.1 参数和返回值 1.1.1 参数 位置参数.关键字参数 def my_func1(x, y, z): print(x+y+z, "计算结束") my_func ...
- 14.Django-JWT
一.基于JWT的Token登录认证 1. JWT简介 json Web Token(缩写JWT)是目前最流行的跨域认证解决方案 session登录的认证方案是看,用户从客户端传递用户名和密码登录信息, ...