mfc雙緩衝畫圖-矩形移動
阿新 • • 發佈:2018-12-10
問題:
客戶區中間繪製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);
}.
執行結果: 此處為動態效果,上下兩個矩形塊左右移動,遇到邊界反彈;