字幕变色
Posted 大道至简-giserDev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字幕变色相关的知识,希望对你有一定的参考价值。
本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6260129.html
字幕变色:使字幕平滑变色,使用CDC类提供的DrawText函数实现指定矩形范围内文字输出。文字变色是一个不断变化、自动进行的过程,因此需要用到定时器来自动控制文字变色进程,使不断调用DrawText函数,同时不断增大包含文本的矩形宽度。
在OnCreate()函数中设置定时器: SetTimer(1,100,NULL);//设置定时
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
SetTimer(1,100,NULL);//设置定时器
return 0;
}
在View类中添加OnTimer()函数和变量m_nWidth,具体实现代码如下:
void CTestView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_nWidth += 5;//用于改变包含文字的矩形宽度
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect;
rect.left = 0;
rect.top = 200;
rect.right = m_nWidth;
rect.bottom = rect.top + tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadStringW(IDS_STRINGgiserDev);
dc.DrawText(str,rect,DT_LEFT);
CView::OnTimer(nIDEvent);
}
运行即可看到动态输出文字的效果。但是当我们把文字输出格式改为DT_RIGHT时会出错,而且我们还需要在文字输出之后改变颜色,当字符串全部输出完后还需要让其从头开始输出。为此需要判断限制显示范围的矩形宽度是否超过了该字符串在屏幕上显示时的宽度。
代码如下:
//获取字符串显示时的宽度 CSize sz = dc.GetTextExtent(str); if(m_nWidth > sz.cx) //判断 { m_nWidth = 0; dc.SetTextColor(RGB(0,255,0)); dc.TextOutW(0,200,str); }
运行,可以看到显示效果如图示:
此效果还有很多bug待解决…
如果有疑问,可以联系giserdev@163.com,更多内容请参考:http://www.cnblogs.com/mxbs/,技术交流请加QQ群:586571286。
以上是关于字幕变色的主要内容,如果未能解决你的问题,请参考以下文章
Cg入门19:Fragment shader - 片段级模型动态变色
[新增ST-001片段]全程字幕-20套UML+Enterprise Architect建模示范视频
[新增EA003考勤系统演示片段]全程字幕-22套UML+Enterprise Architect建模示范视频