• 双缓冲显示字幕(卡拉ok字幕)


    思路:

    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 = 0;
    
        m_nWithRect += 1;
        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( 300 , 300 , 300+nTextWei+20 , 300+ nTextHei );
        
        
    
        if( m_nWithRect > nTextWei )
        {
            m_nWithRect = 10;
            nindex ++;
            m_strText = GetGeci( nindex );
            Sleep(1000);        
        }
    
        rectRetangle.SetRect( nTextWei +20 - m_nWithRect , 30 , nTextWei +20 , 30+nTextHei );
        rectColor.SetRect( 300 , 300 , 300+m_nWithRect , 300+nTextHei );
        Sleep(30);
        DrawText( m_strText );
        
        CView::OnTimer(nIDEvent);
    }

    然后呢就把字贴出来;怎样贴呢就根据需求;

    void CShowFontView::DrawText( CString strText )
    {
        if( strText.IsEmpty() )
        {
            return;
        }
        static int ncout = 0;
        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( 0  ,0 , rtclient.Width() , rtclient.Height() , RGB( 199 , 237 , 208));
        MemDC.SetTextColor( RGB( 255 , 0 , 0));
        MemDC.DrawText( strText , &rectRetangle , DT_LEFT );//字幕向左滚动;
    
    
        MemDC.SetTextColor( RGB( 0 , 0 , 0 ) );//先把这段歌词全部显示
        MemDC.DrawText( strText , &RectShow , DT_LEFT );
        
        MemDC.SetTextColor( RGB( 0, 0 , 255 ));//在把要变色的再显示一遍;
        MemDC.DrawText( strText , &rectColor , DT_LEFT );
    
    
        dc.BitBlt( 0 , 0 , rtclient.Width() , rtclient.Height() , &MemDC , 0, 0 , SRCCOPY );
        MemBitmap.DeleteObject();
        MemDC.DeleteDC();    
        ncout ++;
        
        
    }
    int CShowFontView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CView::OnCreate(lpCreateStruct) == -1)
            return -1;
        readGeci();
        SetTimer( 0 , 3 ,0 );
        return 0;
    }
    
    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()>0 )
            strText = m_ListCtring.GetAt( m_ListCtring.FindIndex( m_ListCtring.GetCount() -nindex -1  ));
        else
            KillTimer(0);
        return strText;
    }

     

  • 相关阅读:
    Sencha的Eclipse插件提示和技巧
    《敏捷软件开发过程及最佳实践》培训总结
    《Sencha应用程序的UI测试 》一文的示例分析
    Ext JS 4.2 Beta版发布
    迅速解决resin或者tomcat启动闪一下就消失的问题
    import javax.servlet 出错
    有爱好者把我的CMS管理系统改成了JAVA版,有兴趣的可以看看
    一个@符号引发的血案:Access数据库无法更新
    Windows 7下如何安装和配置IIS 7和ASP
    .Net中Freetextbox_1.6.3的使用与ftb.imagegallery.aspx安全修正
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3361654.html
Copyright © 2020-2023  润新知