
MFC在调用updateview时候如何保证图片不闪烁
1个回答
2013-11-28
展开全部
调用Invalidate()或者直接调用OnDraw()、OnPaint()绘图时会产生闪烁首先,响应WM_ERASEBKGND,在函数中return true;
第二,开始设置双缓冲,为了简单明了 我全部在OnDraw中定义变量,个人可根据自己需要来设置局部或者全局变量
void CXXDlg::OnPaint()
//在OnDraw()中的DC是CDC* pDC 与CPaintDC在这里可以认为一样只不过在此是对象,需要指针式取地址即可
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CBitmap MemBitmap;
//创建一个位图既画布,以后的绘图图片都是在画布上完成然后一次性读出所以不会造成闪烁
CDC MemDC;
//画笔
CRect wholerect;
//整个客户区
CvvImage ad;
//要画的图片(本文用到的是OpenCV的一种图片格式,旨在说明用到其他类型DC的处理方式)
GetClientRect(&wholerect);
MemDC.CreateCompatibleDC(&dc);
//建立与屏幕显示内容兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(&dc,1024,768);
//如果是第一个参数为NULL图片会显示黑白
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//将位图添加到内存显示设备表
MemDC.FillSolidRect(wholerect,dc.GetBkColor());
HDC hDC;
//CvvImage显示必须用hDC
hDC=MemDC.GetSafeHdc();
//hDC与画笔联系
ad.CopyOf(pROIImg);
//这里的pROIImg是我定义的一个全局变量具体赋值不另作说明 这里既是ad得到赋值
CRect recDrawPic;
recDrawPic.SetRect(CPoint(100,100),CPoint(200,200));
ad.DrawToHDC(hDC,&recDrawPic);
//将图片绘制到画布上
/*Start自绘图形*/
MemDC.MoveTo(....);//参数不列出了
MemDC.LineTo(......);
MemDC.Circle(......);
/*End自绘图形*/
dc.BitBlt(0,0,500,500,&MemDC,0,0,SRCCOPY);
//一次性显示出画布
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ad.Destroy();
//删除这些变量是必要的
}
另外说明,有时需要在Dlg上绘图,在OnDraw()时候会产生控件的闪烁,建议不要直接调用Invalidate();而是调用InvalidateRect()只刷新需要的部分,控件区域不刷新
第二,开始设置双缓冲,为了简单明了 我全部在OnDraw中定义变量,个人可根据自己需要来设置局部或者全局变量
void CXXDlg::OnPaint()
//在OnDraw()中的DC是CDC* pDC 与CPaintDC在这里可以认为一样只不过在此是对象,需要指针式取地址即可
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CBitmap MemBitmap;
//创建一个位图既画布,以后的绘图图片都是在画布上完成然后一次性读出所以不会造成闪烁
CDC MemDC;
//画笔
CRect wholerect;
//整个客户区
CvvImage ad;
//要画的图片(本文用到的是OpenCV的一种图片格式,旨在说明用到其他类型DC的处理方式)
GetClientRect(&wholerect);
MemDC.CreateCompatibleDC(&dc);
//建立与屏幕显示内容兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(&dc,1024,768);
//如果是第一个参数为NULL图片会显示黑白
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//将位图添加到内存显示设备表
MemDC.FillSolidRect(wholerect,dc.GetBkColor());
HDC hDC;
//CvvImage显示必须用hDC
hDC=MemDC.GetSafeHdc();
//hDC与画笔联系
ad.CopyOf(pROIImg);
//这里的pROIImg是我定义的一个全局变量具体赋值不另作说明 这里既是ad得到赋值
CRect recDrawPic;
recDrawPic.SetRect(CPoint(100,100),CPoint(200,200));
ad.DrawToHDC(hDC,&recDrawPic);
//将图片绘制到画布上
/*Start自绘图形*/
MemDC.MoveTo(....);//参数不列出了
MemDC.LineTo(......);
MemDC.Circle(......);
/*End自绘图形*/
dc.BitBlt(0,0,500,500,&MemDC,0,0,SRCCOPY);
//一次性显示出画布
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ad.Destroy();
//删除这些变量是必要的
}
另外说明,有时需要在Dlg上绘图,在OnDraw()时候会产生控件的闪烁,建议不要直接调用Invalidate();而是调用InvalidateRect()只刷新需要的部分,控件区域不刷新
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询