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);*/
谢谢谢谢