字幕变色

本文仅用于学习交流,商业用途请支持正版!转载请注明: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。

 

原文地址:https://www.cnblogs.com/mxbs/p/6260129.html