MFC双缓冲贴图问题
用MFC做俄罗斯方块。函数如下:
void CRussia::DrawJiemian(CDC *pDC)//画界面
{
int nOldDC=pDC->SaveDC();
//背景
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(cBkgound);
//画分数、级别、速度
DrawScore(&memDC);//已实现
CDC memDC1;
memDC1.CreateCompatibleDC(pDC);
memDC1.SelectObject(cBlock);
//画方块
//m_RowCount,m_ColCount为格子行列数
//Russia[][]是存储方块的数组,为1表示当前位置有方块
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
if(Russia[i][j]==1)
memDC.BitBlt(j*20+300,i*20+100,20,20,&memDC1,0,0,SRCCOPY);
//预览方块
//Will[4][4]是下一个方块的数组,为1表示当前位置有方块
for(int n=0;n<4;n++)
for(int m=0;m<4;m++)
if(Will[n][m]==1)
memDC.BitBlt(542+m*20,115+n*20,20,20,&memDC1,0,0,SRCCOPY);
pDC->BitBlt(0,0,800,600,&memDC,0,0,SRCCOPY);
pDC->RestoreDC(nOldDC);
}
(OnEraseBkgnd(CDC* pDC) return TRUE和FALSE结果一样)
函数首先在OnDraw()中调用,显示界面,游戏开始后在定时器中方块每一秒下落一格,该函数也就每秒调用一次重绘;但是每一次重绘,方块前面的轨迹并没有擦出,结果界面上全是方块。。。
应该怎样修改啊?
[解决办法]
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
if(Russia[i][j]==1)
{
memDC.BitBlt(j*20+300,i*20+100,20,20,&memDC1,0,0,SRCCOPY);
}
else
{
memDC.BitBlt(j*20+300,i*20+100,20,20,&跟背景颜色相同的位图(用于把先前的方块覆盖掉),0,0,SRCCOPY);
}
[解决办法]
每次重绘之前先用背景刷刷一次背景,然后在贴图,这样就不会有痕迹了
[解决办法]
2楼说的对 我就是这么实现的,一般GetSysColor(COLOR_BTNFACE)获得的颜色就是背景
[解决办法]
memDC初始化的时候,填充背景色即可。
另外不用双缓存的话,你屏幕不闪么?