用双缓冲出了问题

yangyifeng01 2011-12-02 10:37:33
我用CArry<CPoint,CPoint>pt[20]来动态的记录n个贝塞尔曲线的点
用鼠标事件来添加点
total来表示已绘制的曲线的个数
menu里面点 绘制贝塞尔曲线 使total++

在onDraw里面循环绘制每个贝赛尔曲线

void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

int i,j;
long x0,y0;
CPen MyPen1,*OldPen1,MyPen2,*OldPen2,MyPen3,*OldPen3;
MyPen1.CreatePen(PS_SOLID,1,RGB(0,0,255));
MyPen2.CreatePen(PS_SOLID,1,RGB(255,0,0));
MyPen3.CreatePen(PS_SOLID,1,RGB(0,255,255));

CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pDC);

MemBitmap.CreateCompatibleBitmap(pDC,cWidth,cHeight);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,cWidth,cHeight,RGB(255,255,255));

// TODO: add draw code for native data here

for(j=0;j<total;j++)
{
if(show)
{
OldPen1=MemDC.SelectObject(&MyPen1);
for(i=0;i<pt[j].GetSize();i++)
{
MemDC.Rectangle(pt[j].GetAt(i).x-5,pt[j].GetAt(i).y-5,pt[j].GetAt(i).x+5,pt[j].GetAt(i).y+5);
}

OldPen3=MemDC.SelectObject(&MyPen3);
if(pt[j].GetSize()>0)
{
x0=pt[j].GetAt(0).x;
y0=pt[j].GetAt(0).y;
for(i=1;i<pt[j].GetSize();i++)
{
MemDC.MoveTo(x0,y0);
x0=pt[j].GetAt(i).x;
y0=pt[j].GetAt(i).y;
MemDC.LineTo(x0,y0);
}
}
}
OldPen2=MemDC.SelectObject(&MyPen2);

if(select[j])
{
DrawBezier(&MemDC,pt[j]);
}
else
{
DrawBYangTiao(&MemDC,pt[j],bstep[j]);
}

pDC->BitBlt(0,0,cWidth,cHeight,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();

}

}


一用双缓冲,在添加 贝塞尔曲线的时候就死掉了

求解
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nickytoooo 2011-12-03
  • 打赏
  • 举报
回复
你应该在全部曲线画到缓冲DC上后,再BitBlt(贴图),也就是BitBlt也得放循环外面~
yangyifeng01 2011-12-03
  • 打赏
  • 举报
回复
恩,是这个原因

我把它们放循环外面后,就好了

可是这时候只有第一个画曲线不闪,后面画的都很闪
用户 昵称 2011-12-03
  • 打赏
  • 举报
回复
同2楼
,你在循环外创建的环境,一定要在循环外销毁,

而且要先把被选中的设备选出,然后再销毁。
zgszft 2011-12-03
  • 打赏
  • 举报
回复
MemBitmap.DeleteObject();
MemDC.DeleteDC();
把这两个调换位置,然后到for循环外面
libralibra 2011-12-02
  • 打赏
  • 举报
回复
也在弄bezier,bspline和nurbs呢?干吗不用opengl捏?

19,468

社区成员

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

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