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

谢谢谢谢
...全文
369 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一副图片,然后操作这副图片.不然肯定都在空操作
看不见的裂痕 2010-10-25
  • 打赏
  • 举报
回复
有点看走眼,另外你断点测试下你那个MemBitmap建立是否成功
看不见的裂痕 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);
蝈蝈能不能给点成功了的源代码啊
谢谢
源码链接: https://pan.quark.cn/s/a4b39357ea24 Language: 中文 欢迎来到戈戈圈! 当你点开这个存储库的候,你会看到戈戈圈的图标↓ 本图片均在知识共享 署名-相同方式共享 3.0(CC BY-SA 3.0)许可协议下提供,如有授权遵照授权协议使用。 那么恭喜你,当你看到这个图标的候,就代表着你已经正式成为了一名戈团子啦! 欢迎你来到这个充满爱与希望的大家庭! 「与大家创造更多快乐,与人们一起改变世界。 」 戈戈圈是一个在中国海南省诞生的创作企划,由王戈wg的妹妹于2018年7月14日正式公开。 戈戈圈的创作类型广泛,囊括插画、小说、音乐等各种作品类型。 戈戈圈的目前成员: Contributors 此外,支持戈戈圈及本企划的成员被称为“戈团子”。 “戈团子”一词最初来源于2015年出生的名叫“团子”的大熊猫,也因为一种由糯米包裹着馅料蒸熟而成的食品也名为“团子”,不仅有团圆之意,也蕴涵着团结友爱的象征意义和大家的美好期盼,因此我们最终于2021年初决定命名戈戈圈的粉丝为“戈团子”。 如果你对戈戈圈有兴趣的话,欢迎加入我们吧(σ≧︎▽︎≦︎)σ! 由于王戈wg此前投稿的相关视频并未详细说明本企划的信息,且相关视频的表述极其模糊,我们特此创建这个存储库,以文字的形式向大家介绍戈戈圈。 戈戈圈自2018年7月14日成立至今,一直以来都秉持着包容开放、和谐友善的原则。 我们深知自己的责任和使命,始终尊重社会道德习俗,严格遵循国家法律法规,为维护社会稳定和公共利益做出了积极的贡献。 因此,我们不允许任何人或组织以“戈戈圈”的名义在网络平台或现实中发布不当言论,同我们也坚决反对过度宣传戈戈圈的行为,包括但不限于与戈戈圈无关的任何...

15,977

社区成员

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

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