图片双缓冲 我想做一个坦克大战,在一个窗口里面bitblt多张图片,但是动的时候总是出现闪烁问题,我知道绘图时可以用双缓冲来解决闪烁问题,但是我现在用的全是位图。想请问下有没有办法解决这个问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BOOL CTankView::Show(){ for(int i=0;i<20;i++) { for(int j=0;j<20;j++) { CDC *pDC=GetDC(); CBitmap m_bmp; if(show[j][i]==1) { m_bmp.LoadBitmap(IDB_BITMAP1); } else if(show[j][i]==2) { m_bmp.LoadBitmap(IDB_BITMAP2); } else if(show[j][i]==3) { m_bmp.LoadBitmap(IDB_BITMAP3); } else if(show[j][i]==4) { m_bmp.LoadBitmap(IDB_BITMAP4); } else if(show[j][i]==5) { m_bmp.LoadBitmap(IDB_BITMAP5); } else if(show[j][i]==6) { m_bmp.LoadBitmap(IDB_BITMAP6); } else if(show[j][i]==7) { m_bmp.LoadBitmap(IDB_BITMAP7); } else if(show[j][i]==8) { m_bmp.LoadBitmap(IDB_BITMAP8); } else if(show[j][i]==9) { m_bmp.LoadBitmap(IDB_BITMAP9); } else if(show[j][i]==10) { m_bmp.LoadBitmap(IDB_BITMAP10); } else { m_bmp.LoadBitmap(IDB_BITMAP11); } BITMAP bm; m_bmp.GetObject(sizeof(BITMAP),&bm); CDC dcMem; dcMem.CreateCompatibleDC(pDC); CBitmap *oldBmp=dcMem.SelectObject(&m_bmp); pDC->BitBlt(j*bm.bmWidth,i*bm.bmHeight,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY); dcMem.SelectObject(oldBmp); ReleaseDC(pDC); // MessageBox("afds"); } } return true;} void CTankView::tank(){ switch (direction) { case 1: Tank[1]++; Tank[0]=10; break; case 2: Tank[2]++; Tank[0]=8; break; case 3: Tank[1]--; Tank[0]=9; break; case 4: Tank[2]--; Tank[0]=7; break; default: break; } Control(); } void CTankView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default switch(nChar) { case 87:direction=4;break; case 65:direction=3;break; case 83:direction=2;break; case 68:direction=1;break; } tank(); CView::OnKeyDown(nChar, nRepCnt, nFlags);}void CTankView::Control(){ for(int i=0;i<20;i++) { for(int j=0;j<20;j++) { show[i][j]=0; } } int x,y; x=Tank[1]; y=Tank[2]; show[x][y]=Tank[0]; Show(); } 2楼太狠了,哈哈屏蔽擦除背景函数,ERASE(false); 有个双缓冲类很不错的memdc.h,你去找找,顺便擦除背景重绘。 那个双缓存我也会做。。但是我不是绘图,我是直接用图片,好像bitmap只能选入一张图片,再选入的话就会被覆盖,所以那个双缓冲的代码行不通。。 http://hi.baidu.com/qiujiejia/blog/item/5e016f01587ed7c6267fb541.html 哪里有水印图片下载 要是8位的才行?? 有关CppUnit进行的软件测试!高手请进! 对话框图象生成程序FOR QQ 如何在MFC中调用,matlab封装的dll? 求!!!!EzWindows库,各位谁有? 如何使用标准字符串流istrstream?? 内存分配问题 我想学习windows SDK编程,用《Windows 95 系统程式设计大奥秘 》合适吗? 对数据库的一个菜鸟问题!!!请大家帮帮我这个菜鸟吧!! 怎样从obj文件转回cpp文件?急 内存不能为读Bug GetClientSite 返回 NULL
{
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
CDC *pDC=GetDC();
CBitmap m_bmp;
if(show[j][i]==1)
{
m_bmp.LoadBitmap(IDB_BITMAP1);
}
else if(show[j][i]==2)
{
m_bmp.LoadBitmap(IDB_BITMAP2);
}
else if(show[j][i]==3)
{
m_bmp.LoadBitmap(IDB_BITMAP3);
}
else if(show[j][i]==4)
{
m_bmp.LoadBitmap(IDB_BITMAP4);
}
else if(show[j][i]==5)
{
m_bmp.LoadBitmap(IDB_BITMAP5);
}
else if(show[j][i]==6)
{
m_bmp.LoadBitmap(IDB_BITMAP6);
}
else if(show[j][i]==7)
{
m_bmp.LoadBitmap(IDB_BITMAP7);
}
else if(show[j][i]==8)
{
m_bmp.LoadBitmap(IDB_BITMAP8);
}
else if(show[j][i]==9)
{
m_bmp.LoadBitmap(IDB_BITMAP9);
}
else if(show[j][i]==10)
{
m_bmp.LoadBitmap(IDB_BITMAP10);
}
else
{
m_bmp.LoadBitmap(IDB_BITMAP11);
}
BITMAP bm;
m_bmp.GetObject(sizeof(BITMAP),&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap *oldBmp=dcMem.SelectObject(&m_bmp);
pDC->BitBlt(j*bm.bmWidth,i*bm.bmHeight,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(oldBmp);
ReleaseDC(pDC);
// MessageBox("afds");
}
}
return true;
}
{
switch (direction)
{
case 1:
Tank[1]++;
Tank[0]=10;
break;
case 2:
Tank[2]++;
Tank[0]=8;
break;
case 3:
Tank[1]--;
Tank[0]=9;
break;
case 4:
Tank[2]--;
Tank[0]=7;
break;
default:
break;
}
Control();
}
{
// TODO: Add your message handler code here and/or call default
switch(nChar)
{
case 87:direction=4;break;
case 65:direction=3;break;
case 83:direction=2;break;
case 68:direction=1;break;
}
tank();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}void CTankView::Control()
{
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
show[i][j]=0;
}
}
int x,y;
x=Tank[1];
y=Tank[2];
show[x][y]=Tank[0];
Show();
}
屏蔽擦除背景函数,ERASE(false);