Picture控件播放图片闪烁,急!!

我用Picture控件动态播放图片,可是图片要闪几下才完全显示出来??
求高手帮忙看看啦!很急啊!!!!

C/C++ code
void CTvPlayerDlg::OnPaint()
{
    CPaintDC dc(this);

    CString strAppFullName;
    CString strAppPath;
    GetModuleFileName(AfxGetApp()->m_hInstance, strAppFullName.GetBuffer(MAX_PATH), MAX_PATH);
    strAppFullName.ReleaseBuffer();
    int nPos = 0;
    nPos = strAppFullName.ReverseFind(_T('\\')); 
    strAppPath = strAppFullName.Left(nPos + 1);    
    CString strPictureName;
    if(mark == 1)
    {
        strPictureName = strAppPath + _T("Bitmap1.bmp");
    }
    if(mark == 2)
    {
        strPictureName = strAppPath + _T("Bitmap2.bmp");
    }

    HBITMAP bmpHandle = (HBITMAP)LoadImage(NULL,strPictureName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

    CDC mdc;
    CBitmap bmpPicture;
    CBitmap *bmpFromHandle = bmpPicture.FromHandle(bmpHandle);    

    CRect rctPicture;
    m_VideoWindow.GetWindowRect(&rctPicture);//m_VideoWindow是与Picture控件相关联的变量
    ScreenToClient(&rctPicture);

    mdc.CreateCompatibleDC(&dc);
    CBitmap * bmpPrevious = mdc.SelectObject(bmpFromHandle);
        
    BITMAP bmp;
    bmpPicture.GetBitmap(&bmp);
        
    dc.StretchBlt(0, 0,rctPicture.Width(), rctPicture.Height(),&mdc, 0, 0,bmp.bmWidth,bmp.bmHeight, SRCCOPY);
    dc.BitBlt(rctPicture.left,rctPicture.top,rctPicture.Width(), rctPicture.Height(),&mdc, 0, 0, SRCCOPY);
    DeleteObject(bmpHandle);
}
BOOL CTvPlayerDlg::OnEraseBkgnd(CDC* pDC)
{
       return true;
}

高手帮忙看看啊!!还有就是图片的大小也不会跟着Picture控件窗口的大小而变化/
现在主要要解决的问题是闪烁,怎么让图片不闪烁???

作者: Happy_BlueSky   发布时间: 2011-06-15

dc.StretchBlt(0, 0,rctPicture.Width(), rctPicture.Height(),&mdc, 0, 0,bmp.bmWidth,bmp.bmHeight, SRCCOPY);
  dc.BitBlt(rctPicture.left,rctPicture.top,rctPicture.Width(), rctPicture.Height(),&mdc, 0, 0, SRCCOPY);
贴了2次,当然会闪了!
用多缓冲,在缓冲里面画,贴最终结果,只贴一次!会好些!

作者: fandh   发布时间: 2011-06-15

mdc.CreateCompatibleDC(&dc);--用完没有删除,GDI泄露
mdc.SelectObject(bmpFromHandle);--没有对应的环境恢复!容易造成GDI泄露

作者: fandh   发布时间: 2011-06-15

在内存dc中绘制好,然后一次StretchBlt/BitBlt();到目的DC

作者: VisualEleven   发布时间: 2011-06-15

引用 1 楼 fandh 的回复:
dc.StretchBlt(0, 0,rctPicture.Width(), rctPicture.Height(),&mdc, 0, 0,bmp.bmWidth,bmp.bmHeight, SRCCOPY);
dc.BitBlt(rctPicture.left,rctPicture.top,rctPicture.Width(), rctPicture.Height(),&m……


我只用dc.BitBlt()这个也回闪,我多加一个是想改变大小,可也该没改变,

用双缓冲 是怎么用,能否给我改一下,谢谢了,现在很急!!!

作者: Happy_BlueSky   发布时间: 2011-06-15

引用 3 楼 visualeleven 的回复:
在内存dc中绘制好,然后一次StretchBlt/BitBlt();到目的DC


能否帮我改一下。。我试了好几次了都不行!!谢谢了

作者: Happy_BlueSky   发布时间: 2011-06-15

还有,确定流程是对的?我觉得,你的闪烁,可能还有其它原因!

作者: fandh   发布时间: 2011-06-15

引用 6 楼 fandh 的回复:
还有,确定流程是对的?我觉得,你的闪烁,可能还有其它原因!


哦,我不太懂你们说的多缓冲。。。能否把我上面的代码改一下改成双缓冲的我看一下。谢谢了!!!

作者: Happy_BlueSky   发布时间: 2011-06-15

现在图片都是双缓冲的。

另外,如果图片移动的话,当然会闪,GDI必竟不是DirectX

作者: liulcsy   发布时间: 2011-06-15

http://www.vckbase.com/document/viewdoc/?id=1612
这是双缓冲画图的例子!
按照你画的,应该不会闪,应该是其它原因造成的!

作者: fandh   发布时间: 2011-06-15

是不是你切换图片的频率太高了?

作者: VisualEleven   发布时间: 2011-06-15