思路:

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. Java实现 LeetCode 814 二叉树剪枝 (遍历树)

    814. 二叉树剪枝 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1. 返回移除了所有不包含 1 的子树的原二叉树. ( 节点 X 的子树为 X 本身,以及所有 X 的后代. ...

  2. Java实现 LeetCode 786 第 K 个最小的素数分数(大小堆)

    786. 第 K 个最小的素数分数 一个已排序好的表 A,其包含 1 和其他一些素数. 当列表中的每一个 p<q 时,我们可以构造一个分数 p/q . 那么第 k 个最小的分数是多少呢? 以整数 ...

  3. Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)

    试题 算法提高 转圈游戏 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在 ...

  4. Java实现 LeetCode 209 长度最小的子数组

    209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = ...

  5. Java实现约瑟夫环问题

    约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...

  6. java实现第七届蓝桥杯骰子游戏

    骰子游戏 PS: 骰子哪有从0开始的只能是1-6,而他i j k的范围都是0-5,所以都要加1 题目描述 我们来玩一个游戏. 同时掷出3个普通骰子(6个面上的数字分别是1~6). 如果其中一个骰子上的 ...

  7. Spring源码之自动装配

    我们使用Spring开发过程中经常会用到Autowired注解注入依赖的bean,这部分也是面试的热点问题之一.今天咱们一起来深入研究下自动注入的背后实现原理.首先上一个例子,如下所示: @RestC ...

  8. 下拉式菜单中的内容堆叠(ul型)

    今天使用ul创建下拉式菜单,菜单中的内容堆在了一起. 这是我的html代码 <!DOCTYPE html> <html lang="en"> <hea ...

  9. Kubernetes内部域名解析的那些事儿

    前言 在kubernets环境中,服务发现大都是基于内部域名的方式.那么就涉及到内部域名的解析.从1.11版本开始,kubeadm已经使用第三方的CoreDNS替换官方的kubedns作为集群内部域名 ...

  10. boost常用库(一):boost数值转换

    在STL中有一些字符转换函数,例如atoi,itoa等,在boost里面只需用一个函数lexical_cast进行转换,lexical_cast是模板方法,使用时需要传入类型.只能是数值类型转字符串. ...