上一页 下一页 返回

11.5动画控件

  Windows 95支持一种动画控件(Animate control),动画控件可以播放AVI格式的动画片(AVI Clip),动画片可以来自一个AVI文件,也可以来自资源中。合理地使用动画控件,可以使程序的界面更加形象生动。

11.5.1 动画控件的使用

MFC的CAnimateCtrl类封装了动画控件,该类的Create成员函数负责创建动画控件,其声明为:

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

  参数dwStyle是如表11.3所示的控件风格的组合,参数rect指定了控件的尺寸,pParentWnd指向父窗口,nID是控件的ID。若创建成功则函数返回TRUE。

表11.3 动画控件的风格

风格

含义

ACS_CENTER

使动画片居于控件中央,并使动画片打开后控件窗口的尺寸和位置保持不变。如果不指定该风格,则控件的尺寸会自动调整来适应动画片的大小。

ACS_TRANSPARENT

使动画片的背景透明(不输出动画片的背景色)。

ACS_AUTOPLAY

一旦打开动画片后就一直重复播放。

  除表中的风格外,一般还要为动画控件指定WS_CHILD、WS_VISIBLE和WS_BORDER窗口风格。例如,要创建一个能自动播放的动画控件,应该指定其风格为WS_CHILD|WS_VISIBLE|WS_BORDER|ACS_AUTOPLAY。

  用户可以向对话框模板中加入动画控件,在模板编辑器的控件面板上,动画控件是用一个电影胶片的图形来表示的。在动画控件的属性对话框中可以指定上表列出的风格。只要不指定ACS_CENTER风格,用户就不必关心动画控件的尺寸,因为在打开动画片时控件的尺寸会被自动调整成动画片的幅面大小。

CAnimateCtrl类主要的成员函数包括:

BOOL Open( LPCTSTR lpszFileName );
BOOL Open( UINT nID );
Open函数从AVI文件或资源中打开动画片,如果参数lpszFileName或nID为NULL,则系统将关闭以前打开的动画片。若成功则函数返回TRUE。

BOOL Play( UINT nFrom, UINT nTo, UINT nRep );
该函数用来播放动画片。参数nFrom指定了播放的开始帧的索引,索引值必须小于65536,若为0则从头开始播放。nTo指定了结束帧的索引,它的值必须小于65536,若为-1则表示播放到动画片的末尾。nRep是播放的重复次数,若为-1则无限重复播放。若成功则函数返回TRUE。

BOOL Seek( UINT nTo );
该函数用来静态地显示动画片的某一帧。参数nTo是帧的索引,其值必须小于65536,若为0则显示第一帧,若为-1则显示最后一帧。若成功则函数返回TRUE。

BOOL Stop( );
停止动画片的播放。若成功则函数返回TRUE。

BOOL Close( );
关闭并从内存中清除动画片。若成功则函数返回TRUE。

  一般来说,应该把动画片放在资源里,而不是单独的AVI文件中。这样做可以使应用程序更容易管理,否则,如果应用程序要附带一大堆BMP或AVI文件,会给人一种凌乱和不专业的感觉。Visual C++不直接支持AVI资源,但用户可以创建一种新的资源类型来包含AVI。在VC的一个名为cmnctrls的MFC例子中提供了几个AVI文件(如dillo.avi),如果用户要把象dillo.avi这样的AVI文件包含到程序的资源中,则应按以下几步去做:

在程序的资源视图中单击鼠标右键,并在弹出菜单中选择Import...命令。

在文件选择对话框中选择dillo.avi文件,按Import按钮退出。

按Import按钮退出后,会出现一个Custom Resource Type对话框,如图11.5所示。如果是第一次向资源中加入AVI文件,那么应该在Resource type编辑框中为动画片类资源起一个名字(如AVI),若以前已创建过AVI型资源,则可以在直接在列表框中选择AVI型。按OK后,dillo.avi就被加入到资源中。

按Alt+Enter键后,可以在属性对话框中修改资源的ID。

T11_5.tif (104882 bytes)

图11.5 Custom Resource Type对话框

 

  创建动画控件的方法与创建普通控件相比并没有什么不同,用户可以用ClassWizard把动画控件和CAnimateCtrl对象联系起来。动画控件的使用很简单,下面的这段代码打开并不断重复播放一个资源动画,它们通常是位于OnInitDialog函数中:

m_AnimateCtrl.Open(IDR_AVI1);

m_AnimateCtrl.Play(0,-1,-1);

  如果为动画控件指定了ACS_AUTOPLAY风格,则在调用Open后就会自动重复播放,不必调用Play。程序一般不需要调用Close来关闭动画片,因为这个任务在控件被删除时会自动完成。但如果在控件已包含一个动画片的情况下,需要打开一个新的动画片,则程序应先调用Close删除原来的动画片。

11.5.2 动画控件的局限

动画控件并不能播放所有的AVI文件,只有满足下列条件的AVI文件才能被播放:

  • AVI文件必须是无声的,不能有声道。

  • AVI文件必须是未压缩的,或是用RLE算法压缩的。

  • AVI的调色板必须保持不变。

  动画控件最大的局限性在于它只能显示系统调色板中缺省的颜色,因此如果用动画控件来播放一个256色的AVI文件,那么播放效果看起来就象一个16色的动画一样,很不理想。

  总之,动画控件只能播放一些简单的,颜色数较少的AVI动画。如果要较满意地播放256色的AVI文件,就要利用下面介绍的MCI接口。