当前位置: 代码迷 >> WinCE >> wince 视频/图片 平添字幕
  详细解决方案

wince 视频/图片 平添字幕

热度:625   发布时间:2016-04-28 12:21:10.0
wince 视频/图片 添加字幕
现在手头有个项目,需要在WINCE6.0的平台上,播放视频/图片等,并且要求可以插播滚动字幕(如电视上的滚动新闻),要求是:透明滚动字幕,不能影响视频播放,不能闪烁,高清视频,分辨率为1280*720。
设备性能:300MHZ+128内存。
现在我第一步要实现的是在图片上添加字幕,思路如下:
在Static控件上实现该功能,为了实现功能,继承Static并创建自己的类CCreditStatic。
在CCreditStatic类中做一个Timer,在Timer中创建一个和控件兼容的CDC memDC,选入图像memDC.SelectObject(&m_BmpMain),设置透明并用背景色填充memDC.SetBkMode(TRANSPARENT);memDC.FillSolidRect(&m_ScrollRect,BackColor);在这个CDC上实现滚动字幕,每次滚动一个像素。
然后将滚动字幕的图片m_BmpMain(只有字幕,背景用背景色填充)覆盖到背景图片m_bitmap上,并使用bitblt将处理好的图片copy到控件的CClientDC *pDC中显示。
现在上诉功能已经实现,是我从一个windows应用程序上移植过来的,这些代码在windows下工作正常,但在CE下效率极其低下,我设置的Timer间隔为40ms,但实现测试发现刷新一次的时间接近1s,请教各位能否帮我看下有什么办法提高效率。。或者有其他高效率的实现方法。

代码如下:
参数说明:
pDC:控件的CClientDC指针,用来刷新控件显示
m_ScrollRect:控件的客户区域;
m_ClientRect:滚动字幕的区域
//设置背景
void CCreditStatic::AddBackGround(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect)
{
CDC memDC;
memDC.CreateCompatibleDC( pDC );

    if( m_bitmap.m_hObject == NULL )//背景图片m_bitmap为空,则直接显示字幕m_BmpMain
{
        CBitmap* pOldBitmap = memDC.SelectObject( &m_BmpMain );
        pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
                                        &memDC, 0, 0, SRCCOPY );
memDC.SelectObject(pOldBitmap);
return;
}
   // Draw bitmap in the background if one has been set
                // Now create a mask

if (!m_bShowScrollText)//如果不显示滚动字幕,则不需要做透明处理
{
CDC tempDC;
tempDC.CreateCompatibleDC(pDC);
CBitmap* pOldTempDCBitmap = tempDC.SelectObject( &m_bitmap );

CDC imageDC;
CBitmap bmpImage;
imageDC.CreateCompatibleDC( pDC );
bmpImage.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );

imageDC.BitBlt( 0, 0, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );
pDC->BitBlt(0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), &imageDC, 0, 0, SRCCOPY);
imageDC.SelectObject(pOldImageDCBitmap);
tempDC.SelectObject(pOldTempDCBitmap);
}
else
{
CBitmap bitmap;
  相关解决方案