1. 程式人生 > >mfc雙緩衝畫圖-矩形移動

mfc雙緩衝畫圖-矩形移動

問題:

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

解決:

1.定義變數

    int dis=5;//移動速度
    int x0=100,x1=400;
    int y0=100,y1=400;
    int x2=100,x3=400;
    int y2=500,y3=800;
    int x1Max=0;  //最大矩形x座標
    int flag=1;//0->左,1->右

2.ondraw函式畫矩形

void CToxingxue01View::OnDraw(CDC*
pDC) { CToxingxue01Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //雙緩衝區繪圖 CPoint ptCenter; CRect rect, ellipseRect; GetClientRect(&rect); //獲得視窗客戶區的大小 ptCenter = rect.CenterPoint(); //獲得矩形的中心點,目的是為了確定後面同心圓影象的圓心
CDC dcMem; // 建立用於緩衝作圖的記憶體DC物件dcMem CBitmap bmp; // 建立記憶體中存放臨時影象的點陣圖物件bmp dcMem.CreateCompatibleDC(pDC); // 依附視窗DC(視窗物件為pDC),建立相容記憶體DC(就是建立一個記憶體DC,所有圖形先畫在這上面) bmp.CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height());// 在相容記憶體DC上,建立相容點陣圖 dcMem.
SelectObject(&bmp); // 將點陣圖選入記憶體DC dcMem.FillSolidRect(rect, pDC->GetBkColor());// 按照原有背景色填充客戶區,否則會成為黑色,同時也使記憶體DC的背景色保持一致 // 繪圖操作 int i; for(i=0;i<20;i++) { CRect rect(x0+i*dis,y0+i*dis,x1-i*dis,y1-i*dis); dcMem.Rectangle(&rect); CRect rect1(x2+i*dis,y2+i*dis,x3-i*dis,y3-i*dis); dcMem.Rectangle(&rect1); if(i==19) { x1Max=x1-i*dis; } } pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, SRCCOPY); // 將記憶體DC上的影象複製到前臺pDC,即實際螢幕物件pDC dcMem.DeleteDC(); // 刪除記憶體DC bmp.DeleteObject(); // 刪除記憶體點陣圖 SetTimer(1, 10, NULL); }

3.設定定時器函式

void CToxingxue01View::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default\
    //獲取客戶區視窗大小
    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(x1Max>=rt.Width()||x2Max>=rt.Width()-100)
     {
        flag=0;
     }


    //重新整理客戶區
    Invalidate();       
    CView::OnTimer(nIDEvent);

}.

執行結果: 此處為動態效果,上下兩個矩形塊左右移動,遇到邊界反彈;

這裡寫圖片描述