思路:

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字幕)的更多相关文章

  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. undefined和nul

  2. 我的web课堂作业

    001 my first page <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  3. SpringBoot 及其 基本原理、配置文件(二)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.SpringBoot 的版本与启动过程 1.SpringBoot都是jar工程 ​ 2.Spring ...

  4. footer部分,当页面主题内容不满一屏时,始终位于页面底部

    比如上面这种情况,footer部分本来应该位于最底部,但是main内容太少导致连在一起,影响美观 解决方案: 给footer加上margin-top:负值 值的大小为footer的高度 写了个小dem ...

  5. Java实现 LeetCode 374 猜数字大小 II

    375. 猜数字大小 II 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字. 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了. 然而,当你猜 ...

  6. java实现哈密顿回路问题

    1 问题描述 什么是哈密顿回路? 引用自百度百科: 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往 ...

  7. NumPy之计算两个矩阵的成对平方欧氏距离

    问题描述 设 \({X_{m \times k}} = \left[ {\vec x_1^T;\vec x_2^T; \cdots ;\vec x_m^T} \right]\) (; 表示纵向连接) ...

  8. cocos2dx Android 使用ant 批量打包

    参考文章: 例子:http://www.2cto.com/kf/201305/208139.html http://blog.csdn.net/ljb_blog/article/details/127 ...

  9. opencl(3)程序、内核

    1:程序 1)从上下文中创建程序 cl_program clCreateProgramWithSource( cl_context context, //上下文 cl_uint count, //文本 ...

  10. ElasticSearch系列之(一):介绍、安装(Docker、Windows、Linux)

    1.介绍 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并 ...