1. 程式人生 > >計算機圖形學——雙緩衝

計算機圖形學——雙緩衝

客戶區中間繪製20個巢狀正方形,以步長dx,dy移動,進行碰撞檢測,如果最大的正方形觸到某個邊界,就反方向運動,直接繪製和用雙緩衝區實現,並觀察不同

全域性變數:
    int x0=200,x1=500;
	int y0=200,y1=500;
	int x2=200,x3=500;
	int y2=800,y3=800;
	int xMax=0; //最大矩形x座標
    int flag=1; //0:左,1:右
void CHomeWork3View::OnDraw(CDC* pDC)
{
	CHomeWork3Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CPoint ptCenter;
    CRect rect;
    GetClientRect(&rect); //獲得視窗客戶區的大小
    ptCenter = rect.CenterPoint(); //獲得矩形的中心點,目的是為了確定後面同心圓影象的圓心
    CDC menDC;                // 宣告記憶體DC
    CBitmap NewBitmapmp;                  // 建立記憶體中存放臨時影象的點陣圖物件bmp
    menDC.CreateCompatibleDC(pDC);     // 依附視窗DC(視窗物件為pDC),建立相容記憶體DC(就是建立一個記憶體DC,所有圖形先畫在這上面)
    NewBitmapmp.CreateCompatibleBitmap(&menDC, rect.Width(), rect.Height());// 在相容記憶體DC上,建立相容點陣圖
    menDC.SelectObject(&NewBitmapmp);                 // 將點陣圖選入記憶體DC
    menDC.FillSolidRect(rect, RGB(255,255,255));// 按照原有背景色填充客戶區,否則會成為黑色,同時也使記憶體DC的背景色保持一致
    // 繪圖操作
     int i;//正方形的數量
     int speed=7;//移動速度
     for(i=0;i<20;i++)
     {
	   CRect rect(x0+i*speed,y0+i*speed,x1-i*speed,y1-i*speed);
       menDC.Rectangle(&rect);
       CRect rect1(x2+i*speed,y2+i*speed,x3-i*speed,y3-i*speed);
       menDC.Rectangle(&rect1);
	   if(i==19)
	   {
		 xMax=x1-i*speed;
	   }
   }
       pDC->BitBlt(0, 0, rect.Width(), rect.Height(),
	   &menDC, 0, 0, SRCCOPY);     // 將記憶體DC上的影象複製到前臺pDC,即實際螢幕物件pDC

       menDC.DeleteDC();      // 刪除記憶體DC
       NewBitmapmp.DeleteObject();      // 刪除記憶體點陣圖
       SetTimer(1, 10, NULL);
}
新增OnTime()函式
void CHomeWork3View::OnTimer(UINT nIDEvent)
{
		//獲取客戶區視窗大小
       CRect rt;
       GetClientRect(&rt);
       //判斷移動方向
      if(flag) //flag=1 向右移動
     {
        x0+=5;
        x1+=5;

	    x2+=5;
	     x3+=5;

      }
      else     //flag=0 向左移動
      {
	     x0-=5;
	     x1-=5;

 	     x2-=5;
	     x3-=5;
      }
     if(x0<=0)
    {
	   flag=1;
    }
    if(xMax>=rt.Width()-200)
    {
	   flag=0;
    }
 
  //重新整理客戶區
  Invalidate();		
  CView::OnTimer(nIDEvent);
}