📄 01_9_17_42.asp.html
字号:
</table>
<table width=100% >
<tr>
<td class=a14> 块的类型及解释:</td>
</tr>
<tr>
<td class=a14>
<div align="center"><img src="01_9_17_59.GIF" width="347" height="166"></div>
</td>
</tr>
</table>
<table width=100% >
<tr>
<td class=a14><font color="#CC0000"> FLC动画播放源程序简介</font></td>
</tr>
</table>
<table width=100% >
<tr>
<td class=a14> 我们分析一下FLC动画源程序:打开文件flcw.h,可以看见文件中定义了FLC文件头、帧头、块头及块类型的宏。另外我们可以发现类FLCW是从类MYDIB中派生来的,这是因为不管FLC动画本身如何复杂,只要是往屏幕上画图,最后都是要在内存中转换成位图形式。FLC动画实现过程中,在Open阶段就生成了一个大小与FLC动画相同的内存位图,以后每次读取下一帧,就把数据写入内存位图,再将内存位图贴到屏幕上。</td>
</tr>
<tr>
<td class=a14><a href="../../../../app/down/源程序3.txt"><font color="#3300FF">查看程序</font></a>。</td>
</tr>
</table>
<table width=100% >
<tr>
<td class=a14><font color="#CC0000"> 程序员调用FLC流程</font></td>
</tr>
</table>
<table width=100% ><tr><td class=a14>
1. 用Open(LPCSTR lpszFile,int id)函数打开FLC文件,其参数lpszFile指要打开的文件名,参数id意义与类BMP中Open函数相同,值为零表示使用FLC文件中内建的调色板,否则忽略这个调色板,当在屏幕上播放多个动画或既有动画又有图片时要用到这个参数。程序首先打开指定文件,读入文件头,根据文件头信息申请内存建立内存位图,初始化部分参数,并将文件指针指向文件起始数据区。</td></tr></table><table width=100% ><tr><td class=a14>
2. PlayFlc(HWND hwnd,WORD xorg,WORD yorg,WORD wm_notify)开始播放动画。在类FLCW内部,用参数fStatus决定动画播放与否,只要这个参数值为FLC_PLAYING,就播放动画,我们还可以用这个参数检验当前播放状态,函数QueryFlc()就是返回fStatus值。参数xorg和yorg指定播放位置,假如在播放过程中想移动位置,可以用这个函数重新指定。参数wm_notify指定当动画播放完成后将发送什么消息给父窗口。</td></tr></table><table width=100% ><tr><td class=a14>
3. FlcIdle()函数是使用整个FLC类的关键。由于FLC播放是一个过程,不是一转眼就能完成的事,我们当然不能把整个程序的控制权交给它,让它播放完后再交回来,只好每隔一段时间关照它一下,让它检查一下现在的状态,假如时间到了,可以播放下一帧了,就放下一帧后返回,否则直接返回。因此在程序中需要有一个定时器,不停地调用FlcIdle。在FlcIdle函数中,核心又是if(GetTickCount()>=dwNextTime)PlayFlcAFrame()函数,这个函数的作用是检测是否到了播放下一帧的时间,然后调用PlayFlcAFrame函数播放下一帧。</td></tr></table>
<table width=100% >
<tr>
<td class=a14><font color="#CC0000"> FLC播放单帧图片机理</font></td>
</tr>
</table>
<table width=100% ><tr><td class=a14>
1. PlayFlcAFrame(),PlayFlcAFrame()的作用是逐帧播放FLC,它首先调用ReadFrame()函数,如读取成功则使用MYDIB类函数Show将内存位图拷贝至屏幕。</td></tr></table><table width=100% ><tr><td class=a14>
2. ReadFrame(),ReadFrame()函数是整个FLC类的核心所在,它的作用是读取文件数据,再将数据解码至内存中。其操作过程如下:读取帧头,获取当前帧内块数,循环读取块头、块数据,根据块类型解码数据至内存位图中。块类型FLI_COLOR_256、FLI_WORLD_LC、FLI_LC、FLI_BALCK、FLI_BRUN、FLI_COPY分别对应于函数DecodeColor()、DecodeDeltaFlc()、DecodeDeltaFli()、DecodeBlack()、DecodeBRun()、DecodeCopy()。</td></tr></table>
<table width=100% >
<tr>
<td class=a14><font color="#CC0000"> 实例分析</font></td>
</tr>
</table>
<table width=100% ><tr><td class=a14>
在这个实例中,我们要在一个窗口中同时播放三个FLC动画,注意这三个动画的调色板是不同的,为了协调这三个动画的颜色,干脆这三个调色板一个都不要,使用一个photoshop内置公用调色板,这个调色板在二百五十六种颜色范围内,采用每种颜色兼顾一点的办法,在实际应用中,要使用抖动算法才能模拟出与原来颜色乱真的效果,在此自己算太累,系统又不提供算法,况且这个算法与我们的主题关系不大,因此你看到的颜色会有些失真,除非系统设置大于二百五十六色。</td></tr></table><table width=100% ><tr><td class=a14>
建立一个基于对话框的应用程序playflc,在类CPlayflcDlg内定义三个FLCW类flc,外加一个BMP类bmp,bmp类的作用是取得一个调色板,我们已事先用photoshop作了一个长宽分别为1比1的图片,当然它包含了公用调色板的信息。在对话框初始化过程函数OnInitDialog()中,我们设定一个定时器,并分别读入文件1.flc、2.flc、3.flc、1.bmp,注意读FLC时第二个参数为(PALETTE*)&bmp,这就是告诉程序使用bmp的调色板。我们打算当用户按下ok键时开始播放动画,因此增加一个按键响应函数OnOK() ,添加三个PlayFlc函数,在定时器响应过程函数中填入三个FlcIdle函数。运行程序。</td></tr></table><table width=100% ><tr>
<td class=a14>
<div align="center"><img src="01_9_17_60.GIF" width="347" height="251"><br>
<br>
图5.5</div>
</td>
</tr>
</table><br>
<style>.a1{font-size:1}</style>
<table width=100% ><tr><td align=right>(网页编辑:<a href='mailto:liu_yang@ccw.com.cn'>风之翼</a>)</td></tr></table>
</td><td class=a1 bgcolor=#f46240> </td>
<td valign=top width=138 align=right><table width=98% ><tr><td>
<form action='/app/gsearch1.asp' name=pdn><table width=100% ><tr><td>应用与方案
频道全文检索</td></tr>
<tr><td><input type="text" name="textfile" size=15 value=频道内检索 onfocus="this.value=''">
<input border=0 src="../../../../../images/jian.gif" name="I1" type="image" align=absmiddle>
</td></tr>
</table>
</form>
<form name=srch action="/search/which.asp" method=post onsubmit="JavaScript:return chk()">
<table width=100% >
<tr><td><select size="1" name="func">
<option selected value="2">主题检索</option>
<option value="1">周报全文检索</option>
<option value="3">模糊词检索</option>
</select></td></tr>
<tr><td><input type="text" name="SrchStr" size=15 value="输入待检索的词"
onfocus="this.value=''">
<input src="../../../../../images/jian.gif" name="I1" type="image" align="absMiddle" border=0>
</td></tr>
</table>
<script language="JavaScript">
function chk()
{if (!document.srch.SrchStr.value){
alert("请输入需检索的词!");
document.srch.SrchStr.focus();
return false;
}
else{if (document.srch.SrchStr.value.length>30){
alert("检索的词请不要超过30个字符!");
document.srch.SrchStr.focus();
return false;
}
}
}
</script></form>
<table width=100% ><tr><td class=f colspan=2><b>相关文章</b></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_41.asp.html'>5.4 图像合成</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_40.asp.html'>5.3 多媒体图形图像技术</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_39.asp.html'>5.2 多媒体文件I/O</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_38.asp.html'>5.1.2 波形混音器</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_17_37.asp.html'>5.1.1 媒体控制接口</a></td></tr>
</table>
</td></tr></table></td></tr></table><br>
<table align=center width=680><tr><td align=right>
<form name=mail method=post action='/pub/subMail.asp' onsubmit='JavaScript: return chkField(this)'>
<INPUT type='hidden' name='rec' value='24397'>
您的姓名:<INPUT type="text" name=myName size=10>
您朋友的E-mail:<INPUT type="text" name=friendMail size=10>
<INPUT type="submit" value="推荐给好友">
</form>
</td></tr>
<tr><td align=right>
<b>[<a href="javascript:window.close()">关闭窗口</a>]</b>
</td></tr>
</table>
<script language="javascript">
function chkField(fmObj)
{if (!fmObj.friendMail.value){
alert("请输入您朋友的E-mail!");
fmObj.friendMail.focus();
return false;
}
return true;
}
</script>
<table align=center width=680>
<tr><td><hr size=1 width=660 color=#f46240></td></tr>
</table><br>
<p align=center>Copyright(C) ccw.com.cn,All rights reserved</p>
<p align=center><b>中国计算机世界出版服务公司版权所有</b></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -