m_pWnd->ReleaseDC(pDC);
}
参数x1,y1,x2,y2指定了矩形区的尺寸,color指定了填充色。其实现方法与4中所述一样,在此不必多介绍。
6、添加了绘图函数,下面再介绍如何使用CMemBitmap类,来实现动画效果:
首先,我们在视图类(也可以是其它窗口类)中声明一个CMemBitmap成员变量m_MemBitmap,代码如下:
private:
CMemBitmap m_MemBitmap;
然后,我们重载Cview类函数OnInitialUpdate(),以便视图初始化结束后初始化位图对象,并且视图指针传递过去,其实现代码如下:
void CTestBitmapView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_MemBitmap.init(this);
SetTimer(1,100,NULL);
}
在函数最后,启动了一个定时器, 我们将用定时来实现动画功能。
接着,我们重载定时器消息函数OnTimer实现动画功能。其实现代码如下:
void CTestBitmapView::OnTimer(UINT nIDEvent)
{
int x , y;//文本显示的位置
CRect rect;//客户区域
CDC* pDC = GetDC();//获取视图的DC
CDC dcComp;
//得到客户区尺寸
GetClientRect(&;rect);
//随机获得要显示文本的位置
srand( (unsigned)time( NULL ) );
//控制文本显示的位置位于客户区以内
x = rand()%rect.Width()/2;
y = rand()%rect.Height();
//在内存中显示文本
m_MemBitmap.Clear(rect.left,rect.top,rect.right,rect.bottom,RGB(0,0,0));
m_MemBitmap.TextOut(10,10,500,"固定的文本",RGB(255,255,255));
m_MemBitmap.TextOut(x,y,400,"GDI函数实现高速动画
演示",RGB(255,255,0));
//内存设备环境将位图对象选入
dcComp.CreateCompatibleDC(pDC);
dcComp.SelectObject(&;m_MemBitmap);
//用位传输函数显示出来
pDC->BitBlt(0,0,rect.Width(),
rect.Height(), &;dcComp, 0,0,SRCCOPY);
dcComp.DeleteDC();
ReleaseDC(pDC);
CView::OnTimer(nIDEvent);
}
读者可根据注释理解代码的含义,需要说明的是:在内存中绘制位图时,本例采用了一个静态显示文本和一个随机动态显示的文本来比较,从运行情况可以看出动态显示的文本0.1秒就随机移动一次位置,虽然每次绘制位图都使用Clear函数清屏,但静态文本的显示没有一点闪动,动画非常平滑,速度也很快。
怎么样,很简单吧?如果您再创建一个线程后台绘制图形,将会实现很多特殊效果的动画来,我们可以将这项技术用在用户界面上或其他地方,将会收到意想不到的动画效果。
三、结束语
通过以例子,用GDI函数实现高速平滑的动画也很简单。我们可以添加绘制位图,画线、画矩形等成员函数,便能实现各种GDI绘图函数的操作,如果读者还有兴趣,可以在显示位图,作优化显示,如:不是将位图全部显示出来,而是显示其中动画的一部分,因为BitBlt函数作位传输很慢。我开发的纸牌游戏“扑克麻将”就经过优化,其动画速很快,如果读者有兴趣,