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

luckzengwei 2010-10-25 10:03:07
我工程是基于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);*/

谢谢谢谢
...全文
342 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-11-24
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖

相关规定详见界面界面版关于版主结帖工作的具体办法
Eleven 2010-10-29
  • 打赏
  • 举报
回复
你的SetData函数是在哪里调用的
tompaz 2010-10-29
  • 打赏
  • 举报
回复
memdc用的不对,去搜个cmemdc的类用吧,简单
逸萌 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tompaz 的回复:]
memdc用的不对,去搜个cmemdc的类用吧,简单
[/Quote]up
pshchao 2010-10-29
  • 打赏
  • 举报
回复
双缓冲的例子


void CCustomInputDialog::OnPaint()
{
CPaintDC dc(this);

CDC memDC;

memDC.CreateCompatibleDC(&dc);

memDC.SelectObject(&m_bgbmp);

CDC maskDC;

maskDC.CreateCompatibleDC(&dc);

CBitmap maskbmp;

maskbmp.CreateCompatibleBitmap(&dc,480,276);//

maskDC.SelectObject(&maskbmp);

maskDC.BitBlt(0,0,480,276,&memDC,0,0,SRCCOPY);

if(!v_keyinfo.empty())
{
for(int i = 0;i<v_keyinfo.size();i++)
{
if(m_bDownShift == false)
{
if(i >= 36 && i< 62)
continue;
if(v_keyinfo[i].pImage[0]!=NULL)
if(v_keyinfo[i].keydown == false)
v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
else
{
v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
}
}else
{
if(i >= 10 && i<=35)
continue;
if(v_keyinfo[i].pImage[0]!=NULL)
if(v_keyinfo[i].keydown == false)
v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
else
{
v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
}
}
}
}
dc.BitBlt(0,0,480,276,&maskDC,0,0,SRCCOPY);

memDC.DeleteDC();
maskDC.DeleteDC();
maskbmp.DeleteObject();
}
ls2141 2010-10-28
  • 打赏
  • 举报
回复
同问 怎么draw里面还有redraw函数的 建议LZ一步步来 全部屏蔽掉后把能显示的不闪烁的 看看到底哪里有问题
记得WM_ERASEBKGND直接返回TRUE
快乐鹦鹉 2010-10-25
  • 打赏
  • 举报
回复
int width=rt.right-rt.left;
int height=rt.top-rt.bottom;
你这个rt是什么矩形啊?为什么height不等于rt.bottom-rt.top?难道top比bottom大?
icoomoo 2010-10-25
  • 打赏
  • 举报
回复
,你必须MemDC.SelectObject一副图片,然后操作这副图片.不然肯定都在空操作
傻X 2010-10-25
  • 打赏
  • 举报
回复
有点看走眼,另外你断点测试下你那个MemBitmap建立是否成功
傻X 2010-10-25
  • 打赏
  • 举报
回复
问题是这样的:
楼主你用双缓存的话,你必须MemDC.SelectObject一副图片,然后操作这副图片.不然肯定都在空操作
zgl7903 2010-10-25
  • 打赏
  • 举报
回复
思路有点乱, 既然是在绘制怎么又有RedrawWindow Invalidate导致重绘的的语句,
最好是把刷新的部分都放到WM_PAINT中, WM_ERASEBKGND直接返回TRUE
luckzengwei 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tiger9991 的回复:]
问题是这样的:
楼主你用双缓存的话,你必须MemDC.SelectObject一副图片,然后操作这副图片.不然肯定都在空操作
[/Quote]
我这个不就相当于选择了一幅图片啊
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
蝈蝈能不能给点成功了的源代码啊
谢谢

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧