Chinaunix首页 | 论坛 | 博客
  • 博客访问: 193084
  • 博文数量: 23
  • 博客积分: 2556
  • 博客等级: 少校
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 15:57
文章分类

全部博文(23)

文章存档

2012年(2)

2010年(6)

2009年(4)

2008年(11)

我的朋友

分类: WINDOWS

2008-05-15 23:21:28

//利用又缓冲来打印位图  
  //首先打印背景图,再者就是把所有棋子位图打印出来  
  //如果棋已经开始比赛,则应打印当前的区域,以指明当前玩家  
  //利用双缓冲  
  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);  
  }
阅读(1172) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~