以下部分为实现代码
void CBallScreenView::OnDraw(CDC* pDC)
{
CBallScreenDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
DrawBall();
//moving
MovingBall();
// TODO: add draw code for native data here
}
//这段算法是有关球运行轨迹
// 屏保中 球碰到边界然后弹回
void CBallScreenView::MovingBall()
{
int speed = 5;
//y 界
if (m_nY>m_nboardY-60 || m_nY<0 )
m_nAngle = 2*PI-m_nAngle;
//x 界
if (m_nX>m_nboardX-60 || m_nX<0)
m_nAngle = 2*PI-m_nAngle+PI;
m_nX = m_nX - cos(m_nAngle)*speed;
m_nY = m_nY - sin(m_nAngle)*speed;
}
void CBallScreenView::DrawBall()
{
//
CRect rect;
GetClientRect(&rect);//?得客?区;
m_nboardX = rect.Width();
m_nboardY = rect.Height();
CDC *pDC = this->GetDC();
//menmory
CBitmap MemBitmap;//bit
CDC MemDC;
MemBitmap.CreateCompatibleBitmap(pDC,m_nboardX,m_nboardY);
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,m_nboardX,m_nboardY,RGB(255,205,255));
//draw ball
CBrush Brush(RGB(212,22,133));
MemDC.SelectObject(&Brush);
m_rect.SetRect(m_nX+30,m_nY+30,m_nX+30,m_nY+30);
m_rect.InflateRect(30,30);
MemDC.Ellipse(&m_rect);
//copy from memory to screen
pDC->BitBlt(0,0,m_nboardX,m_nboardY,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(&pOldBit);
MemBitmap.DeleteObject(); //clear
MemDC.DeleteDC();
Brush.DeleteObject();
}
int CBallScreenView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
this->SetTimer(1,10,NULL);
// TODO: Add your specialized creation code here
return 0;
}
void CBallScreenView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
InvalidateRect(NULL,true);
UpdateWindow();
CView::OnTimer(nIDEvent);
}
BOOL CBallScreenView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return true;
}
关键注意的几点:
1. 先将图画在内存,然后拷贝到屏幕。
2.重载OnEraseBkgnd(CDC* pDC) 强行返回true。