• 字幕变色


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

     

  • 相关阅读:
    Android如何实现超级棒的沉浸式体验
    这次聊聊Promise对象
    svn add文件名包含@符号的解决方案
    证明3|n(n+1)(2n+1)
    Xcode迁移工程常见问题
    Multiple build commands for output file
    python中descriptor的应用
    xcode快捷键
    Cycript
    令assignment操作符返回一个reference to *this
  • 原文地址:https://www.cnblogs.com/mxbs/p/6260129.html
Copyright © 2020-2023  润新知