| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> 平台系统 >> 文章正文
Windows下的高级动画技术浅析        【字体:
Windows下的高级动画技术浅析
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

摘要:动画是图形创意中的一个重要组成部分,在程序设计中,动画的实现是程序员经常要遇到的问题。本文将介绍一些Windows操作系统下的动画编程实现方式。程序大多采用Visual C++的Windows API实现。

  关键词: 动画技术,Windows操作系统,程序设计

  1.动画技术的原理

  动画是图形创意中的一个重要组成部分,其基本原理与普通的动画原理相同,即都是利用人眼的"暂留"效应,使连续的静止画面看上去具有动感。动画根据其显示维数又可以分为二维动画和三维动画,我们见到的动画大多为二维动画,本文将着重介绍这方面的内容。三维动画的实现较二维动画的实现要复杂的多。

  2.Windows下的常用动画技术

  在程序设计中,动画的实现方式有很多种,但基本的原理却非常类似,即在初始位置显示初始图形,经过短暂的延时后,去除掉初始图形,并在新的位置显示新的图形;这些步骤加以循环,便形成了动画的效果。下面结合C++程序介绍一些Windows下的常用动画技术,其中的实际绘图方法参见相关的Windows程序设计书籍。

  2.1底色覆盖

  底色覆盖法是利用屏幕底色将原始图形覆盖掉,这种方法是实现动画的最简单的方式,其基本原理如下:

while( 条件 )
{
 在(x, y)位置绘制图形。
 短暂的延时。
 在(x, y)位置将原来的图形用屏幕底色(如黑色)覆盖掉。
 将(x, y)参数赋新值。
}

  利用底色覆盖的方法实现的动画有着明显的闪烁效果,一般,极为简单的动画可以用这种方法来实现,如不断闪烁的星星等。

  2.2多图片切换

  这种动画实现方法的效果类似于Gif动画的效果,其原理是将动画的帧事先绘制出来,存为位图文件或位图资源,并按照动画的顺序为这些帧加以编号。当要显示动画时,在指定的位置,间隔适当的时间,按照顺序显示已经绘制好的位图帧,从而达到动画的目的。

  下面是利用这种方式实现的动画程序框架:

// bm[]为多张位图文件的路径及文件名数组,按照顺序储存了多张位图
// picBox为PictureBox控件的一个实例

for( i=0; i<len(hbm); i++ )
{
 picBox->Picture = bm[i]; // 选中位图
 ::Seep(100); // 延时
 if( i == len(hbm) - 1 ) i = -1
}

  当在屏幕的固定位置有规律地显示动画时,可以考虑采用这种动画方式。
2.3异或方式

  用异或方式实现动画的例子比较多,如绘图软件中的"橡皮筋技术"便是利用这种方式实现的。

  "异或"是一种逻辑组合的方式(在Windows编程中,绘图颜色的各种逻辑组合操作被称为"光栅操作")。在这种绘图模式下进行绘图,源颜色与屏幕底色将会进行异或逻辑组合,实际的显示颜色将会是逻辑组合后的颜色。而且,用相同的颜色在同一位置绘图两次,其效果和没有绘图时完全相同。

  下面是利用异或方式进行绘图的程序结构框架。

// 设置当前绘图方式为异或方式,hDC为用来绘图的设备对象HDC,
::SetROP2(hDC, R2_XORPEN);
while( 条件 )
{
 在(x, y)位置用颜色color绘图。
 延时。
 重新在(x, y)位置用颜色color绘图,这时原来绘制的图形将会被消除。
 更新(x, y)坐标或color颜色,为在下一个循环中绘图做准备。
}

  利用异或方式进行绘图通常能够得到很好的动画效果。

  2.4像素操作

  像素操作一般和其他动画实现方法(如底色覆盖)相结合使用。

  首先用GetPixel()函数得到初始屏幕某位置像素的颜色,并保存起来;然后在该位置进行绘图;经过延时后,利用SetPixel()函数用事先保存好的颜色在原位置覆盖掉已经绘制的图形,并更新位置参数;接着进行下一个循环。

  2.5多缓冲技术

  多缓冲技术是将图形绘制在不同的帧中,通过将屏幕在这些不同的帧之间进行切换,来达到动画效果。具体的帧数目可以根据实际动画的需要自行确定。

  在Nord-Tec SoftWare开发的Nord-Tec Snow Flakes屏幕保护程序(可以在www. nord-tec.com下载)中,逼真的雪花动画便是利用这种技术实现的。仿照该程序,我也作了一个类似的屏幕保护程序。下面通过介绍我编制的程序的结构框架,来具体地介绍多缓冲技术的实现方法。

  程序采用3帧来实现动画,不同的帧通过不同的设备对象句柄来引用,实现各自的功能。下面是程序的结构框架:

HDC hMemoryDC; // 内存设备对象,用来绘图 -- 绘图帧
HDC hScreenDC; // 当前显示屏幕的设备对象,用来显示图形 -- 显示帧
HDC hMemoryDCBk; // 内存设备对象,用来保存图形背景 -- 背景帧
int screenX, screenY // 当前整个屏幕的分辨率参数
void DrawPictureOnMemoryDC ( HDC hDC ); // 实际绘图函数
void JudgeAndChangeMemoryDCBk( HDC hDC ); // 判断函数

screenX = ::GetSystemMetrics(SM_CXSCREEN); // 获得屏幕的分辨率
screenY = ::GetSystemMetrics(SM_CYSCREEN);
hScreenDC = ::GetDC(hWnd); // 获得当前窗口的设备对象句柄,即创建显示帧

// 创建一个与当前屏幕相同大小的位图对象
HB99vMAP hBitMap = ::CreateCompatibleBitmap(hScreenDC,screenX,screenY);
// 创建绘图帧
hMemoryDC = ::CreateCompatibleDC(hScreenDC);
// 将位图对象选中到绘图帧中,因为绘图要操作整个屏幕
::SelectObject(hMemoryDC,hBitMap);

// 创建另一个位图对象
hBitMap = ::CreateCompatibleBitmap(hScreenDC,screenX,screenY);
// 创建背景帧
hMemoryDCBk = ::CreateCompatibleDC(hScreenDC);
// 将位图对象选中到背景帧中
::SelectObject(hMemoryDCBk,hBitMap);

// 将当前屏幕的状态复制到背景帧中
::BitBlt(hMemoryDCBk,0,0,screenX,screenY,hScreenDC,0,0,SRCCOPY);

while( 条件 )
{
 // 将背景帧的图形复制到绘图帧中
 ::BitBlt(hMemoryDC,0,0,screenX,screenY,hMemoryDCBk,0,0,SRCCOPY);
 // 在绘图帧中绘制图形
 DrawPictureOnMemoryDC ( hMemoryDC );
 // 将绘图帧中的图形复制到当前显示屏幕上
 ::BitBlt(hScreenDC,0,0,screenX,screenY,hMemoryDC,0,0,SRCCOPY);

[1] [2] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 利用底层键盘钩子屏蔽任意按…

  • 深入剖析MFC中Windows消息处…

  • VC++中进程与多进程管理的方…

  • Window 消息大全使用详解

  • 关于键盘输入

  • Windows多线程多任务设计初步

  • VC++实现Win2000下直接读写磁…

  • 多进程编程的相关知识总结(…

  • 图形显示CPU内存利用率

  • Win32环境下dll编程原理

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |