MFC 双缓冲画图

//利用又缓冲来打印位图  
  //首先打印背景图,再者就是把所有棋子位图打印出来  
  //如果棋已经开始比赛,则应打印当前的区域,以指明当前玩家  
  //利用双缓冲  
  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);  
  } 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值