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(); //删除位图
处理类似: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(); //删除位图
相关文章推荐
- 双缓冲方法解决屏幕刷新闪烁的问题
- MFC中屏幕刷新闪烁问题解决方法总结
- 双缓冲方法解决屏幕刷新闪烁的问题
- MFC重写OnCtlColor函数造成的文本框文字、闪烁重叠的问题解决办法
- MFC中屏幕刷新闪烁问题解决方法总结
- 如何解决iis权限问题造成的数据无法读取的解决方法
- DELL LATITUDE E5510 笔记本电脑屏幕闪烁问题的解决.
- C#控件的闪烁问题解决方法总结
- [对象和类型]8.C#构造函数,怎样用静态方法解决私有构造函数造成的不能new的问题?
- VS2013 F12无法转到函数的定义处,总是从“元数据”获取的问题的解决方法
- 关于delphi中控件刷新时带来的闪烁问题(gif),转自别人的解决方法描述。
- Android 屏幕截图黑屏问题解决方法
- 对于使用了SSH造成的中文乱码问题,4大解决方法
- word2007的问题 此错误通常是由宏安全性设置造成的。如果您知道宏来自您信任的来源,则可将宏安全性设置更改为允许启用宏。宏安全性设置的更改方式取决于您使用的 Microsoft Office System 程序 解决方法
- Android自定义控件:imageview重写onMeasure方法实现图片按指定比例显示,拉伸永不变形,解决屏幕适配问题
- 双缓冲加重载onpaint,OnEraseBkgnd解决屏幕闪烁问题
- [转]winform 窗口闪烁问题解决方法
- C#控件的闪烁问题解决方法总结
- Matlab中出现:尝试将SCRIPT SVD作为函数执行:C:\User\lc\...问题的解决方法
- 用va_start() va_end()函数解决不定参数问题(即,fun(...)实现方法)