双缓冲显示字幕(卡拉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 ...
随机推荐
- undefined和nul
- 我的web课堂作业
001 my first page <%@ page language="java" contentType="text/html; charset=UTF-8&q ...
- SpringBoot 及其 基本原理、配置文件(二)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.SpringBoot 的版本与启动过程 1.SpringBoot都是jar工程 2.Spring ...
- footer部分,当页面主题内容不满一屏时,始终位于页面底部
比如上面这种情况,footer部分本来应该位于最底部,但是main内容太少导致连在一起,影响美观 解决方案: 给footer加上margin-top:负值 值的大小为footer的高度 写了个小dem ...
- Java实现 LeetCode 374 猜数字大小 II
375. 猜数字大小 II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜 ...
- java实现哈密顿回路问题
1 问题描述 什么是哈密顿回路? 引用自百度百科: 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往 ...
- NumPy之计算两个矩阵的成对平方欧氏距离
问题描述 设 \({X_{m \times k}} = \left[ {\vec x_1^T;\vec x_2^T; \cdots ;\vec x_m^T} \right]\) (; 表示纵向连接) ...
- cocos2dx Android 使用ant 批量打包
参考文章: 例子:http://www.2cto.com/kf/201305/208139.html http://blog.csdn.net/ljb_blog/article/details/127 ...
- opencl(3)程序、内核
1:程序 1)从上下文中创建程序 cl_program clCreateProgramWithSource( cl_context context, //上下文 cl_uint count, //文本 ...
- ElasticSearch系列之(一):介绍、安装(Docker、Windows、Linux)
1.介绍 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并 ...