如何在VC中显示动态的GIF_第1页
如何在VC中显示动态的GIF_第2页
如何在VC中显示动态的GIF_第3页
如何在VC中显示动态的GIF_第4页
如何在VC中显示动态的GIF_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何在 vc 中显示动态的 gif作者:薛碧下载本文示例源代码如果是使用 vb,也许这个话题是多余的,因为vb有一个图象控件可以非常容易地实现各种格式的图象显示功能,然而对于vc 却没有一个象样的控件可以达到这种效果, 怎么办?经过一段日子的研究,发现只需要实现两步工作, 就可以在 vc 中实现如同 vb 中一样的 gif 动态效果。本文将介绍的两部分是ipicture 接口的使用和 gif 的储存格式,好象一听到储存格式,读者就不想再看下去了! 其实不然, 这里只须用到其最基本的一部分,请读者耐心地往下看。一ipicture 接口ipicture 接口是一个 com 类,其成员函数可参见微软

2、的msdn,这里只需用到以下几个函数:get_width 返回当前图像的宽度get_height 返回当前图像的高度render在指定的位置、设备上下文上绘制指定的图像ipicture 的使用不需要 cocreateinstance 函数,而只需要使用oleloadpicture,鉴于此接口在许多文章杂志上均有介绍,这里略去(因为不是本文的重点)。二gif 储存格式gif 储存格式是一个非常复杂的内容,如果要讲透彻可以写很多篇文章,庆幸的是要实现本文的主题只需要知道其中的一个图象储存结构就可以了,这里定义该图象结构为 gifimage :typedef struct gifimage word

3、 logx; word logy; word width; word height; struct flag byte d:3; byte c:1; byte b:3; byte a:1; flag; gifimage,*pgifimage; 在该结构中 , logx 为图象相对于逻辑屏幕左上角的x 坐标,常为 0;logy 为图象相对于逻辑屏幕左上角的y 坐标,常为 0;width 为图象的宽度;height 为图象的高度;flag 为一个标志, a 指是否存在局域性调色板, b 为存储方式 (与本主题无关) ,c 为 rgb值是否经过排序(无关),d 为调色板的大小,为3*2(d+1);最

4、后想提一下, 因为每副图象都以0 x2c 开头,并且 0 x2c 前面必为 0,故在储存格式中要找到图象的起始位置,只需查找0 x2c 并且前面一个值为0(具体请看下面代码) ,其次,一副图象可能储存为多个数据块,每个数据快都是以数据长度为起始的,这一点很重要。即其图象储存为:0 x2c图象开头gifimage图象头结构byte numbernumber 为一个跟 gif 压缩有关的数字,可以不理踩。第一副图象的大小.图象存储内容第二副图象大小.0 x00数据块结束好,介绍完了主要的两大部分也该进入今天的主题了。由于使用 ipicture 接口可以非常轻松地显示gif 的第一副图画,那么我们就

5、是利用这一点,利用gif 的图象格式,把第二,三。图画逐一拷贝到第一副图画的位置,再使用ipicture进行读取,便可以形成一副十分连续的gif 动画了,接下来就让我来给大家展示以下:hinstance handle = :afxgetresourcehandle();/首先获得资源句柄hrsrc hrsrc= :findresource(handle,makeintresource(idr_image2),image); dword word = :sizeofresource(handle,hrsrc); byte* lpby = (byte*)loadresource(handle,hr

6、src);/获得图象的首地址byte* pbyte20; /用来储存 gif 每幅图象的地址dword nu20; /用来储存每幅图象的大小int num = 0; /用来计算有几副图象dword firstlocation = 0; /第一副图象的位置,用来替换for(dword j=0;jflag.a=0) /a为 0时指图象不存在局部调色板 dword number = 1+sizeof(gifimage); while(lpbyj+number!=0) number = number+(dword)lpbyj+number+1; /算得图象大小 number+; /把最后一个0 x00

7、 加上 pbytenum = new bytenumber; for(dword n=0;nflag.d); while(lpbyj+number!=0) number = number+(dword)lpbyj+number+1; /算得图象大小 number+; /把最后一个0 x00 加上 pbytenum = new bytenumber; for(dword n=0;nnumber;n+) *(byte*)(pbytenum+n) = lpbyj+n; /将图象储存起来。 nunum = number; j = j+number-1; /跳过图象 num+; int working=

8、 1; while(working) for(int m=0;mfillrect(crect(0,0,500,500),&brush); dword ddd; virtualprotect(lpby,word,page_readwrite,&ddd); /修改页面的保护属性,以进行写操作 for(dword n=0;nnum;n+) lpbyfirstlocation+n = *(byte*)(pbytem+n); virtualprotect(lpby,word,ddd,null); /因为 ipicture必须把图象存成流的形式才能工作,所以有下面一段函数 cmemfile

9、 file(lpby,word); carchive ar(&file,carchive:load|carchive:bnoflushondelete); carchivestream arcstream(&ar); ccomqiptr m_picture; hresult hr = oleloadpicture(lpstream)&arcstream,0,false, iid_ipicture,(void*)&m_picture); long a,b; m_picture-get_width(&a); m_picture-get_height(&b); csize sz(a,b); pdc-himetrictodp(&sz); /时 ole格式的大小转化为正常大小 crect rect; m_picture-render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect); sleep(100); /停止一段时间。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论