您的位置:首页 > 其它

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

2011-08-01 09:39 232 查看
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(); //删除位图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐