您的位置:首页 > 其它

标程: GDI 双缓冲技术

2009-05-01 13:35 218 查看
void CGreedySnakeView::OnDraw(CDC* pDC)
{
// TODO: 在此处为本机数据添加绘制代码
CDC memDC;
CDC tempDC;
CBitmap memBmp;

CRect rectClient;
GetClientRect(rectClient);

memDC.CreateCompatibleDC(pDC);
tempDC.CreateCompatibleDC(pDC);
memBmp.CreateCompatibleBitmap(pDC, rectClient.right, rectClient.bottom);
memDC.SelectObject(&memBmp);

drawBackgound(&tempDC, &memDC, rectClient);
drawMap(&tempDC, &memDC);

pDC->BitBlt(0, 0, rectClient.right, rectClient.bottom, &memDC, 0, 0, SRCCOPY);
tempDC.DeleteDC();
memDC.DeleteDC();
pDC->SelectStockObject(BLACK_BRUSH);
}

void CGreedySnakeView::drawBackgound(CDC* tempDC, CDC* memDC, CRect& rectClient)
{
tempDC->SelectObject(&m_bmpBackGound);
memDC->BitBlt(0, 0, rectClient.right, rectClient.bottom, tempDC, 0, 0, SRCCOPY);
}

void CGreedySnakeView::drawMap(CDC* tempDC, CDC* memDC)
{
int tempMap[MAP_HEIGHT][MAP_WIDTH];
memcpy(tempMap,Manager::theManager()->getBlocks(),sizeof(tempMap));
// Manger 构造函数中调用initialGame 已经loadMap

for (int i = 0; i < MAP_HEIGHT; ++i)
for (int j = 0; j < MAP_WIDTH; ++j)
{
switch(tempMap[i][j])
{
case MAP_OBSTACLE:
tempDC->SelectObject(&m_bmpBrick);
memDC->BitBlt(j*10, i*10, 10, 10, tempDC, 0, 0, SRCCOPY);
break;

case MAP_FRUIT:
tempDC->SelectObject(&m_bmpFruit);
memDC->BitBlt(j*10, i*10, 10, 10, tempDC, 0, 0, SRCCOPY);
break;

case MAP_SNAKE_BODY:
tempDC->SelectObject(&m_bmpSnakeBody);
memDC->BitBlt(j*10, i*10, 10, 10, tempDC, 0, 0, SRCCOPY);
break;

case MAP_SNAKE_HEAD:
tempDC->SelectObject(&m_bmpSnakeHead);
memDC->BitBlt(j*10, i*10, 10, 10, tempDC, 0, 0, SRCCOPY);
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: