上一篇我已经讲过形变、位变和色变的基本原理,我不知道我是否说清楚了没有我希望大家多给点意见,虽然大牛们十分忙但是希望多给点建议。好了,咱们来说说这第二篇的内容,动画是什么?就是一张张图片存在系统中,然后不停的刷新、重绘,然后显示出来就是动画了。大家都知道图片运行的时候是存在内存当中,系统不停地去刷屏重绘然后显示。在这个过程中是全屏的刷消耗系统资源多还是区域刷消耗的系统资源多呢?这毋庸置疑,当然是区域刷消耗的系统资源少。那么咱们就来看看程序来怎样显示这种情况了(这一篇的话题也许有点简单了,下一篇我将会补上!)。上代码:
1、创建单文档程序,然后添加两个变量int ixunhuan;CBitmap m_Bitmap(这是用来加载位图);
2、创建位图 在构造函数对位图和变量进行初始化
CMy1_5View::CMy1_5View()
{
m_Bitmap.LoadBitmap(IDB_BITMAP1);//获得位图
ixunhuan=0;
}
3、分别添加消息响应函数OnCreate和OnTimer的函数
int CMy1_5View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(1,1200,NULL);
return 0;
}
void CMy1_5View::OnTimer(UINT nIDEvent)
{
ixunhuan=(ixunhuan+30)%400;//即大于400后变小
Invalidate(); //整个屏刷新
CView::OnTimer(nIDEvent);
}
4、在OnDraw(CDC* pDC)函数中添加画多图形多颜色的语句,并且加上位图
void CMy1_5View::OnDraw(CDC* pDC)
{
CMy1_5Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//画复杂图形,有多种颜色
for(int j=0;j<25;j++)
for(int i=0;i<44;i++)
{
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB((i*20)%255,(j*20)%255,(i+j+20)%255));
//正方形
CRect myrect1(20*i,20*j,20*i+20,20*j+20);
pDC->FillRect(myrect1,&mybrush1);
//圆
pDC->Ellipse(20*i,20*j,20*i+20,20*j+20);
//小正方形
CRect myrect2(20*i+4,20*j+4,20*i+16,20*j+16);
pDC->FillRect(myrect2,&mybrush1);
//小圆
pDC->Ellipse(20*i+4,20*j+4,20*i+16,20*j+16);
//更小正方形
CRect myrect3(20*i+7,20*j+7,20*i+13,20*j+13);
pDC->FillRect(myrect3,&mybrush1);
//更小圆
pDC->Ellipse(20*i+7,20*j+7,20*i+13,20*j+13);
//最小正方形
CRect myrect4(20*i+9,20*j+9,20*i+11,20*j+11);
pDC->FillRect(myrect4,&mybrush1);
}
//在不同位置显示位图
Dc.SelectObject(m_Bitmap);
pDC->StretchBlt(70+ixunhuan,70,160,160,&Dc,0,0,71,71,SRCCOPY);
}
然后编译连接看看效果。看过效果以后,再添加以下代码然后看看效果
void CMy1_5View::OnTimer(UINT nIDEvent)
{
ixunhuan=(ixunhuan+30)%400;
if(ixunhuan<40) //如果图象回到开头,全部重画
Invalidate();/
CRect r;
r.left=70+ixunhuan-40;
r.top=70;
r.bottom=r.top+160;
r.right=r.left+200;
//部分更新函数
InvalidateRect(r,TRUE);
CView::OnTimer(nIDEvent);
}
当然看过效果以后就可以知道了全屏刷新对资源的占用有多大,好了我的这一篇写的不是太好的希望大家谅解,我坚决在明天给大家出现一个比较有技术含量的博客。