本帖最后由 VisualEleven 于 2014-02-27 17:56:35 编辑

解决方案 »

  1.   

    你反复刷新会闪烁。解决办法:
    将OnPaint中的绘图代码独立封装成一个函数,CDC作为参数。然后在OnPaint中调用这个函数。另外,在你所有需要刷新的地方,调用这个函数即可,不要用Invalidate之类的函数!
      

  2.   

    你的GDI操作的最后需要SelectObject 旧的HBRUSH
      

  3.   

    OnEraseBkgnd 返回 TRUE这个是防止闪烁的最关键的技术,使用两个memDC是无病呻吟的做法
      

  4.   

    我把绘图代码写到OnEraseBkgnd(CDC* dc)里面了,如下:
    BOOL CdlgPlayerWnds::OnEraseBkgnd(CDC* dc)
    {
    if(1==m_lViewNumber)
    {
    RECT rect;
    GetParent()->GetClientRect(&rect);

    dc=GetDC();
    CDC mdc;
    mdc.CreateCompatibleDC(dc); HBITMAP hold;
    CBitmap cbmp;
    cbmp.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP_NOVEDIO));
    hold=(HBITMAP)mdc.SelectObject(&cbmp); BITMAP   bmInfo;   
    GetObject(cbmp,   sizeof(BITMAP),   (LPBYTE)&bmInfo);   //得到图片尺寸  dc->StretchBlt(0,0,rect.right,rect.bottom,&mdc,0,0,bmInfo.bmWidth,bmInfo.bmHeight,SRCCOPY);
    mdc.SelectObject(&hold); mdc.DeleteDC();
    CWnd::ReleaseDC(dc);
    DeleteObject(cbmp);
    }
    return TRUE;
    }现在窗口不动的话背景图不闪烁了,但是拉伸窗口背景图还是闪烁啊...而且有其他窗口遮挡这窗口的时候,窗口上就会出现背景图,怎么让遮挡的时候不重绘呢?
      

  5.   

    矫枉过正,按下面思路写吧,这里不好编辑,花挎号可能没配对,你你自己配对一下
    BOOL CdlgPlayerWnds::OnEraseBkgnd(CDC* dc)
    {
    return true;
    }BOOL CdlgPlayerWnds::OnPaint()
    {
    if(1==m_lViewNumber)
    {
    RECT rect;
    GetParent()->GetClientRect(&rect);
    CPaintDC dc(this);CDC mdc;
    mdc.CreateCompatibleDC(&dc);HBITMAP hold;
    CBitmap cbmp;
    cbmp.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP_NOVEDIO));
    hold=(HBITMAP)mdc.SelectObject(&cbmp);BITMAP   bmInfo;   
    GetObject(cbmp,   sizeof(BITMAP),   (LPBYTE)&bmInfo);   //得到图片尺寸 dc.StretchBlt(0,0,rect.width(),rect.height(),&mdc,0,0,bmInfo.bmWidth,bmInfo.bmHeight,SRCCOPY);
    mdc.SelectObject(&hold);
    }
      

  6.   

    这个MFC基本解决不了,要用到Windows API.
    你可以在View 里屏蔽掉所有消息,自己来绘图。