Invalidate函数造成屏幕闪烁问题解决方法

 1、建立一个类变量:m_bNeedErase,根据需要设定其值,通常没有图片显示时,为真(调用默认背景擦除),否则为假(关闭默认背景擦除)
 处理类似:OnEraseBkgnd(CDC* pDC)方法
里面的代码大概这样:
if(!m_bNeedErase) return FALSE;
else return CView::OnEraseBkgnd(pDC);

3、在绘制方法中使用内存DC绘制,如下是一个PicView的简单绘制代码,供参考:
void CSPicView::OnDraw(CDC* pDC)
{
CRect rect;  
this->GetClientRect(&rect);
static CBrush brush(RGB(255,255,255));

if(!m_bReady) 
{
pDC->FillRect(&rect,&brush);
m_bNeedErase = TRUE;
return ;
}
if(m_pRecPicPage->m_pImage == NULL) 
{
pDC->FillRect(&rect,&brush);
m_bNeedErase = TRUE;
return ;
}

m_bNeedErase= FALSE;
CBitmap memBitmap;
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
CBitmap* pOldBmp= memDC.SelectObject(&memBitmap);
memDC.FillRect(&rect,&brush);
m_pRecPicPage->m_pImage->Draw(memDC.GetSafeHdc(),-m_x+5,-m_y+5,m_lWidth-m_x+5,m_lHeight-m_y+5);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();

}

 

 

 

 

这应该是和第一种方法一样的

        编译运行程序,尝试改变窗口大小,可以发现闪烁现象。

  在双缓冲方法中,首先要做的是屏蔽背景刷新。背景刷新其实是在响应WM_ERASEBKGND消息。我们在视类中添加对这个消息的响应,可以看到缺省的代码如下:

BOOL CMYView::OnEraseBkgnd(CDC* pDC)

{

      return CView::OnEraseBkgnd(pDC);

}

是调用父类的OnEraseBkgnd函数,我们屏蔽此调用,只须直接return TRUE;即可。

下面是内存缓冲作图的步骤。

CPoint ptCenter;

CRect rect,ellipseRect;

GetClientRect(&rect);

ptCenter = rect.CenterPoint();

CDC dcMem;                                                  //用于缓冲作图的内存DC

CBitmap bmp;                                                 //内存中承载临时图象的位图

dcMem.CreateCompatibleDC(pDC);               //依附窗口DC创建兼容内存DC

bmp.CreateCompatibleBitmap(&dcMem,rect.Width(),rect.Height());//创建兼容位图

dcMem.SelectObject(&bmp);                          //将位图选择进内存DC

dcMem.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,不然会是黑色

for(int i=20;i>0;i--)                                          //在内存DC上做同样的同心圆图象

{

       ellipseRect.SetRect(ptCenter,ptCenter);

       ellipseRect.InflateRect(i*10,i*10);

       dcMem.Ellipse(ellipseRect);

}

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台

dcMem.DeleteDC();                                       //删除DC

bm.DeleteObject();                                        //删除位图

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值