VC画图刷新时画面闪烁问题求助
我工程是基于MFC对话框的。定义了一个画图函数
void CInterFaceDlg:: SetData(long *data)
{
int width=rt.right-rt.left;
int height=rt.top-rt.bottom;
CDC MemDC;
CDC* pDC=GetDC() ;
CPen *pOldPen;
CPen penDot;
penDot.CreatePen(PS_DOT, 1,RGB(255,255,0));
pOldPen = pDC->SelectObject(&penDot);
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,width,height);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,width,height,RGB(255,255,255));
//下面大部分都是绘图操作可以不看,只有最后几句是一些处理的操作
for(int i=0;i<8;i++)
{
b[8*times+i]=*(data+i);
}
if (times==0)
{
if(drawflag==0)
{
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int p=0;p<7;p++)
{
MemDC.MoveTo(point);
point.x=rt.left+((p+1)*width/512);
point.y=rt.bottom+(height*(b[p+1]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
else
{
RedrawWindow(rt,NULL,RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE);
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
MemDC.MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
}
else
{
if(drawflag==0)
{
CPoint point(rt.left+((8*times-1)*width/512),rt.bottom+(height*(b[8*times-1]-ampmin))/(ampmax-ampmin));
for(int k=0;k<8;k++)
{
MemDC.MoveTo(point);
point.x=rt.left+((8*times+k)*width/512);
point.y=rt.bottom+(height*(b[8*times+k]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
else
{
RedrawWindow(rt,NULL,RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE);
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
MemDC.MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
}
pDC->BitBlt(0,0,width,height,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);
}
这部分代码是我在网上看的双缓冲绘图然后加上自己的东西,不知道为什么显示不出来,但是仍然可以看到刷新时抖动的效果
下面这部分代码是直接画图,但是刷新时会闪烁,麻烦大家帮我看看啊
/*int width=rt.right-rt.left;
int height=rt.top-rt.bottom;
CDC* pDC = GetDC();
CPen *pOldPen;
CPen penDot;
penDot.CreatePen(PS_DOT, 1,RGB(255,255,0));
pOldPen = pDC->SelectObject(&penDot);
for(int i=0;i<8;i++)
{
b[8*times+i]=*(data+i);
}
if (times==0)
{
if(drawflag==0)
{
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int p=0;p<7;p++)
{
pDC->MoveTo(point);
point.x=rt.left+((p+1)*width/512);
point.y=rt.bottom+(height*(b[p+1]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
else
{
Invalidate();
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
pDC->MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
}
else
{
if(drawflag==0)
{
CPoint point(rt.left+((8*times-1)*width/512),rt.bottom+(height*(b[8*times-1]-ampmin))/(ampmax-ampmin));
for(int k=0;k<8;k++)
{
pDC->MoveTo(point);
point.x=rt.left+((8*times+k)*width/512);
point.y=rt.bottom+(height*(b[8*times+k]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
else
{
RedrawWindow(rt,NULL,RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE);
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
pDC->MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
}
ReleaseDC(pDC);*/
谢谢谢谢
void CInterFaceDlg:: SetData(long *data)
{
int width=rt.right-rt.left;
int height=rt.top-rt.bottom;
CDC MemDC;
CDC* pDC=GetDC() ;
CPen *pOldPen;
CPen penDot;
penDot.CreatePen(PS_DOT, 1,RGB(255,255,0));
pOldPen = pDC->SelectObject(&penDot);
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,width,height);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,width,height,RGB(255,255,255));
//下面大部分都是绘图操作可以不看,只有最后几句是一些处理的操作
for(int i=0;i<8;i++)
{
b[8*times+i]=*(data+i);
}
if (times==0)
{
if(drawflag==0)
{
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int p=0;p<7;p++)
{
MemDC.MoveTo(point);
point.x=rt.left+((p+1)*width/512);
point.y=rt.bottom+(height*(b[p+1]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
else
{
RedrawWindow(rt,NULL,RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE);
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
MemDC.MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
}
else
{
if(drawflag==0)
{
CPoint point(rt.left+((8*times-1)*width/512),rt.bottom+(height*(b[8*times-1]-ampmin))/(ampmax-ampmin));
for(int k=0;k<8;k++)
{
MemDC.MoveTo(point);
point.x=rt.left+((8*times+k)*width/512);
point.y=rt.bottom+(height*(b[8*times+k]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
else
{
RedrawWindow(rt,NULL,RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE);
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
MemDC.MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
MemDC.LineTo(point);
}
}
}
pDC->BitBlt(0,0,width,height,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(pDC);
}
这部分代码是我在网上看的双缓冲绘图然后加上自己的东西,不知道为什么显示不出来,但是仍然可以看到刷新时抖动的效果
下面这部分代码是直接画图,但是刷新时会闪烁,麻烦大家帮我看看啊
/*int width=rt.right-rt.left;
int height=rt.top-rt.bottom;
CDC* pDC = GetDC();
CPen *pOldPen;
CPen penDot;
penDot.CreatePen(PS_DOT, 1,RGB(255,255,0));
pOldPen = pDC->SelectObject(&penDot);
for(int i=0;i<8;i++)
{
b[8*times+i]=*(data+i);
}
if (times==0)
{
if(drawflag==0)
{
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int p=0;p<7;p++)
{
pDC->MoveTo(point);
point.x=rt.left+((p+1)*width/512);
point.y=rt.bottom+(height*(b[p+1]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
else
{
Invalidate();
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
pDC->MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
}
else
{
if(drawflag==0)
{
CPoint point(rt.left+((8*times-1)*width/512),rt.bottom+(height*(b[8*times-1]-ampmin))/(ampmax-ampmin));
for(int k=0;k<8;k++)
{
pDC->MoveTo(point);
point.x=rt.left+((8*times+k)*width/512);
point.y=rt.bottom+(height*(b[8*times+k]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
else
{
RedrawWindow(rt,NULL,RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE);
CPoint point(rt.left,rt.bottom+(height*(b[0]-ampmin))/(ampmax-ampmin));
for(int j=1;j<512;j++)
{
pDC->MoveTo(point);
point.x=rt.left+(j*width/512);
point.y=rt.bottom+(height*(b[j]-ampmin))/(ampmax-ampmin);
pDC->LineTo(point);
}
}
}
ReleaseDC(pDC);*/
谢谢谢谢
...全文
相关推荐
VC6下的GDI+双缓冲 解决闪烁问题
然而,在进行动态图形更新时,尤其是在VC6环境下,用户界面可能会出现闪烁现象,这主要是由于重绘过程中的屏幕刷新与窗口更新不协调造成的。为了解决这个问题,开发者通常会采用双缓冲技术。
VC 实现刷新不闪烁代码例子.rar
在VC++编程环境中,开发人员经常遇到的一个问题是窗口在快速刷新时出现闪烁,这极大地影响了用户体验。为了解决这个问题,开发者通常会采用一种叫做"双缓冲"的技术。
VC.rar_VC word_vc .db_vc 画图_vc 画图程序
当在屏幕上绘制新的图像时,程序首先在内存中的一个缓冲区(后台缓冲区)进行操作,待全部绘制完成后,再一次性将整个缓冲区的内容复制到显示缓冲区(前台缓冲区),从而确保用户看到的是完整的、无闪烁的画面。
VC+MFC 托盘图标闪烁与消息提示
本文将深入探讨如何使用VC+MFC实现托盘图标闪烁、快捷键支持、右键菜单以及消息提示等功能。
vc重绘时屏幕闪烁解决办法
为了解决这个问题,一种常见方法是将背景刷设置为NULL,这样重绘时不会清除屏幕,从而消除闪烁。但这会导致旧图形和新图形叠加,画面混乱。


界面
