VC画图刷新时画面闪烁问题求助

luckzengwei luckzengwei 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我工程是基于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);*/

谢谢谢谢
...全文

相关推荐

评论 13
收藏 已收藏
分享
返回顶部
luckzengwei
界面 15,976 成员 115,866 内容