高手们帮我看看这图片总是重叠在一起

tko2002 2012-12-18 02:05:53
我编写的
原教程图
原图是视频的例子没有图像重在一起,2图是我按照视频里写的代码,为什么我的就会出现这样的图情况,上次画的图像和第二次画的重在一起没有擦除.下面是代码
void CTetrisView::OnFileNew()
{
// TODO: 在此添加命令处理程序代码
SetTimer(1,500,0);
PreBlock();
}


void CTetrisView::PreBlock(void)//创建方块
{
int i;
i=rand()%7;
PreStyle=i+2;
switch(i)
{
case 0:
PrePosi[0].x=5;//□
PrePosi[1].x=5;//□
PrePosi[2].x=5;//□
PrePosi[3].x=5;//□
PrePosi[0].y=0;
PrePosi[1].y=1;
PrePosi[2].y=2;
PrePosi[3].y=3;
break;
case 1:
PrePosi[0].x=5;//□□
PrePosi[1].x=5;//□
PrePosi[2].x=6;//□
PrePosi[3].x=5;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=0;
PrePosi[3].y=2;
break;
case 2:
PrePosi[0].x=6;//□□
PrePosi[1].x=5;// □
PrePosi[2].x=6;// □
PrePosi[3].x=6;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=0;
PrePosi[3].y=2;
break;
case 3:
PrePosi[0].x=5;//□
PrePosi[1].x=5;//□□
PrePosi[2].x=6;//□
PrePosi[3].x=5;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=1;
PrePosi[3].y=2;
break;
case 4:
PrePosi[0].x=5;// □
PrePosi[1].x=5;//□□
PrePosi[2].x=6;//□
PrePosi[3].x=6;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=1;
PrePosi[3].y=2;
break;
case 5:
PrePosi[0].x=5;//□
PrePosi[1].x=6;//□□
PrePosi[2].x=4;// □
PrePosi[3].x=5;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=1;
PrePosi[3].y=2;
break;
case 6:
PrePosi[0].x=5;//□□
PrePosi[1].x=5;//□□
PrePosi[2].x=6;
PrePosi[3].x=6;
PrePosi[0].y=1;
PrePosi[1].y=0;
PrePosi[2].y=0;
PrePosi[3].y=1;
break;
}
DrawPreBlock();
}


void CTetrisView::DrawPreBlock(void)
{
if(PreStyle)
{

CDC *pDC;
pDC=GetDC();
CDC memDC;
CRect rcBlock;//构造一个矩形区域
rcBlock.SetRect(250,40,2*32+250,4*32+40);
pDC->FillSolidRect(&rcBlock,RGB(255,255,255));//使用白色来填充区域

memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(bitmap[PreStyle-1]);
for(int i=0;i<4;i++)
{
pDC->BitBlt((PrePosi[i].x-2)*32+400,PrePosi[i].y*32+50,32,32,&memDC,0,0,SRCCOPY);

}

memDC.DeleteDC();
pDC->DeleteDC();

}
}
void CTetrisView::NewBlock(void)
{
for(int i=0;i<4;i++)
posi[i]=PrePosi[i];//把提示的方块坐标赋值给显示
style=PreStyle;//同样把类型也赋值过显示
PreBlock();//重新产生新的方块
}


void CTetrisView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
NewBlock();
CView::OnTimer(nIDEvent);
}


...全文
167 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tko2002 2012-12-18
  • 打赏
  • 举报
回复
还有窗口一重绘就弹错.把边框一拉就弹错了
tko2002 2012-12-18
  • 打赏
  • 举报
回复
补充一下. void CTetrisView::OnDraw(CDC* pDC) { CTetrisDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //画边框...创建游戏的框边 CPen penNew(PS_SOLID,1,RGB(0,0,255)),*ppenOld; ppenOld=pDC->SelectObject(&penNew); pDC->MoveTo(39,39); pDC->LineTo(40+12*32,39); pDC->LineTo(40+12*32,40+32*20); pDC->LineTo(39,40+32*20); pDC->LineTo(39,39); pDC->SelectObject(&ppenOld);
傻X 2012-12-18
  • 打赏
  • 举报
回复
OnPaint和OnDraw呢?
tko2002 2012-12-18
  • 打赏
  • 举报
回复
引用 1 楼 tiger9991 的回复:
OnPaint和OnDraw呢?
代码发的上来了帮我看看

19,468

社区成员

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

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