我做的是单文档的程序,重载了cmyview的OnEraseBkgnd函数,使用双缓冲绘图,在客户区上显示了一幅位图,但是在弹出的对话框在客户区区域移动时,客户区的位图闪烁很厉害,请问如何去除这种闪烁,谢谢

解决方案 »

  1.   

    图象闪烁是由于你在CView重画了全部图片,建议在重新绘图时只画有移动对话框时漏出来的部分,其他部分就不用画。这样的画,由于其他部分没有重新绘图,所以不会有闪烁。你先试试?
      

  2.   

    BOOL CtestsdiView::OnEraseBkgnd(CDC* pDC)
    {
    HBITMAP bitmap;
    bitmap = (HBITMAP)LoadImage(NULL,"e:\\11.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap m_bit;
    m_bit.Attach(bitmap);
    memDC.SelectObject(&m_bit);
    BITMAP bm;
    m_bit.GetBitmap(&bm);
    CRect rect;
    pDC->GetClipBox(rect);
        pDC->BitBlt(rect.left , rect.top , rect.right - rect.left ,  rect.bottom -  rect.top, &memDC, rect.left, rect.top, SRCCOPY);
    return TRUE;

    }
      

  3.   

    当视图重画时,会引起屏幕的闪烁,解决的一个方法是先在内存中画好图形,然后用 
    位图的方法将内存中画好的图象拷贝到屏幕上。 
    void CDrawView::OnDraw(CDC* pDC) 

    CDrawDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc); CDC dc; 
    CBitmap bitmap; CBitmap* pOldBitmap; 
    CRect client; 
    CRect rect; 
    pDC->GetClipBox(client);//检取无效区 
    GetClientRect(rect);//检取整个客户区 
    if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境 

    if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), 
    rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区 

    OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系 
    pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境 
    dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区 
    dc.IntersectClipRect(client);//再“与上”检取的无效区,使 
    //内存环境与pDC检取的无效区相等 


    CBrush brush; 
    if(!brush.CreateSolidBrush(RGB(255,255,255))) 
    return ; 
    brush.UnrealizeObject(); 
    dc.FillRect(client,&brush);//将dc的作图区刷新成背景色 if(m_drawObjs.GetCount()!=0) 
    Draw(&dc);//将所有的画图对象在内存裁减区内重画 
    pDC->BitBlt(client.left,client.top,client.Width(),client.Height(), 
    &dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图 
    //拷贝到窗口裁减区 
    dc.SelectObject(pOldBitmap); }