//利用又缓冲来打印位图
//首先打印背景图,再者就是把所有棋子位图打印出来
//如果棋已经开始比赛,则应打印当前的区域,以指明当前玩家
//利用双缓冲
void CMyView::Refresh(CDC *pDC)
{
//建立内存设备上下文
CDC memBufDC, memSrcDC;
memBufDC.CreateCompatibleDC(pDC);
memSrcDC.CreateCompatibleDC(pDC);
//创建内存的缓冲位图
CBitmap Bufbmp;
Bufbmp.CreateCompatibleBitmap(pDC, 600, 600);
CBitmap* pOldBufBitmap = memBufDC.SelectObject(&Bufbmp);
CBitmap bitmap;
CBitmap* pOldSrcBitmap;
//导入背景图,其ID为129
if (bitmap.LoadBitmap(MAKEINTRESOURCE(129)))
{
pOldSrcBitmap = memSrcDC.SelectObject(&bitmap);//选择对象 //600、600为棋盘位图IDB_HEQIQI的宽度、高度
if (!memBufDC.BitBlt(0, 0, 600, 600, &memSrcDC, 0, 0, SRCCOPY))
AfxMessageBox("Refresh出错,是在缓冲中引入背景位图时1");
}
else
TRACE0("函数Refresh()导入位图出错1"); //一个链表,通过此可以知道位图的类型及一些相应的信息
CStone* TempStone;
//TempStone=new CStone;
POSITION TempPos;
TempPos=m_Manager.StoneList.GetHeadPosition();
TempStone=m_Manager.StoneList.GetHead();
while (TempPos!=NULL)
{
TempStone=m_Manager.StoneList.GetAt(TempPos); if (TempStone->m_Position.x < 5)//黑白格区域
{
//引入临时位图,为了显示椭圆区域,使得位图看起来似乎真的是透明的
//IDB_TEMPBMP的ID号为219
if (bitmap.LoadBitmap(MAKEINTRESOURCE(219)))
{
memSrcDC.SelectObject(&bitmap);
if (!memBufDC.BitBlt(
m_BmpBWGeQizi[TempStone->m_Position.x][TempStone->m_Position.y].x, 
m_BmpBWGeQizi[TempStone->m_Position.x][TempStone->m_Position.y].y, 
QiziWidth, QiziHeight, &memSrcDC, 0, 0, SRCPAINT))
AfxMessageBox("Refresh出错,是在缓冲中引入背景位图时2");
}
else
TRACE0("函数Refresh()导入位图出错2");
//选择相应的位图
if (bitmap.LoadBitmap(MAKEINTRESOURCE(FIRSTQIZIID + 
5*TempStone->m_nType+TempStone->m_nColor)))
{
memSrcDC.SelectObject(&bitmap);
if (!memBufDC.BitBlt(
m_BmpBWGeQizi[TempStone->m_Position.x][TempStone->m_Position.y].x, 
m_BmpBWGeQizi[TempStone->m_Position.x][TempStone->m_Position.y].y, 
QiziWidth, QiziHeight, &memSrcDC, 0, 0, SRCAND))
AfxMessageBox("Refresh出错,是在缓冲中引入背景位图时3");
}
else
TRACE0("函数Refresh()导入位图出错3");
}
else //if (TempStone->m_Position.x==5)通眼区域
{
//引入临时位图,为了显示椭圆区域
//IDB_TEMPBMP的ID号为219
if (bitmap.LoadBitmap(MAKEINTRESOURCE(219)))
{
memSrcDC.SelectObject(&bitmap);
if (!memBufDC.BitBlt(
m_BmpTongYanQizi[TempStone->m_Position.y].x, 
m_BmpTongYanQizi[TempStone->m_Position.y].y, 
QiziWidth, QiziHeight, &memSrcDC, 0, 0, SRCPAINT))
AfxMessageBox("Refresh出错,是在缓冲中引入背景位图时4");
}
else
TRACE0("函数Refresh()导入位图出错4");

if (bitmap.LoadBitmap(MAKEINTRESOURCE(FIRSTQIZIID + 
5*TempStone->m_nType+TempStone->m_nColor)))
{
memSrcDC.SelectObject(&bitmap);
if (!memBufDC.BitBlt(
m_BmpTongYanQizi[TempStone->m_Position.y].x, 
m_BmpTongYanQizi[TempStone->m_Position.y].y, 
QiziWidth, QiziHeight, &memSrcDC, 0, 0, SRCAND))
AfxMessageBox("Refresh出错,是在缓冲中引入背景位图时5");
}
else
TRACE0("函数Refresh()导入位图出错5");
} m_Manager.StoneList.GetNext(TempPos);
}
memSrcDC.SelectObject(pOldSrcBitmap); //显示位图,Refresh完毕
if (!pDC->BitBlt(0, 0, 600, 600, &memBufDC, 0, 0, SRCCOPY))
AfxMessageBox("Refresh出错,在打印位图6"); //恢复对象
memBufDC.SelectObject(pOldBufBitmap);
}