选择显示字体大小

用visual c++.net简单实现gif动画


  自从gif动画格式推出这十几年来,可是忙坏了c/c++的程序员。远的不说,就说这几年吧,各种方法可谓五花八门,有的直读文件,一行一行不厌其烦的分析;有的使用ipicture,大把大把的玩接口;有的封装成com,谁也不知道他怎么实现的......现在有了gdi+,大家更忙活了,所以我写了这篇文章。

  其实只要使用.net框架封装好的几个函数,就能轻松搞定了,这里要用到的工具是vs.net2003。

  第一步:新建一个.net窗体工程


  第二步:添加成员变量和消息(就是行为和外观啦),只要双击空白处系统就会自动填写默认函数,添加图中的三个函数就够了。


  第三步:添加成员变量image及在form1_load中初始化

private:	image *image;private: system::void form1_load(system::object *  sender, system::eventargs *  e){	//按路径读入文件	image=image::fromfile(l"测试图片.gif");}private: system::void form1_closed(system::object *  sender, system::eventargs *  e){	if(image) image->dispose();}

  第四步:好了,动画文件已经读入,现在的任务是把它显示出来

private: system::void form1_paint(system::object *  sender, system::windows::forms::painteventargs *  e){	//在form1_paint中启用动画,这个函数的功能是读取图片中每个对象的时间信息,然后每到一次时间就调用一次onpaintgif	imageanimator::animate(image, new eventhandler(this,onpaintgif));	//显示图片	e->graphics->drawimage(0,0,image->width,image->height);	//将图片按照时间间隔向后翻一页	imageanimator::updateframes(image);}private: system::void onpaintgif(object* sender, eventargs* e){	//时间到啦,该显示下一张图啦,置显示区域无效	this->invalidate();}

  到此,已经可以正确显示gif格式的动画了,简单吧,才几行就解决了。
  
  ........不过嘛,呵呵,大家仔细观察会发现,图片一闪一闪的,很不好看.....那怎么办呢?用双缓冲方法?非也,根本就不是一码事!图片闪铄的问题几乎每天都能在论坛上看到,我在这里顺便说一下原因。数据量大时的闪动是因为计算机来不及载入数据,这时可以用双缓冲法;但是数据量不大时图片闪动是因为当程序置屏幕无效时框架会用背景色来擦除,这样就会闪一下,这时用双缓冲法就无效了。后者在mfc中我们可以响应onerasebkgnd()来解决;可是在.net中找不到这个消息,怎么办呢?其实只要避开屏幕无效就好了,请往下看:

private:	image *image;	graphics *p;//添加一个用来显示的变量private: system::void form1_load(system::object *  sender, system::eventargs *  e){	image=image::fromfile(l"测试图片.gif");//按路径读入文件	p=graphics::fromhwnd(this->handle);//按窗口句柄创建graphics	imageanimator::animate(image, new eventhandler(this,onpaintgif));//启动动画}private: system::void form1_closed(system::object *  sender, system::eventargs *  e){	if(p) p->dispose();	if(image) image->dispose();}private: system::void onpaintgif(object* o, eventargs* e){	p->drawimage(image,0,0,image->width,image->height);//显示图片	imageanimator::updateframes();//将图片向后翻一页,由于onpaintgif()本身就是按时间启动的,所以updateframes()要不要参数无所谓了}private: system::void form1_paint(system::object *  sender, system::windows::forms::painteventargs *  e){	//呵呵,这个可以不要了,在属性页中删除所有文字即可自动删除代码}

  是不是也很简单啊?这样就把图像的闪烁问题也解决了。部分图片的效果如下,图像文件打包在代码文件夹里了,代码包里的程序可以读取多种图片并且可以点击任意位置拖动


  总结一下:

  1. 由于使用.net封装类,所以只要animate()启动动画,然后updateframes()翻页即可,十分简便;
  2. 先汗一下,由于上面那两个函数的具体功能和使用方法(特别是updateframes()的参数)找不到详细描述的文档,所以是笔者猜的....请知道的达人帮忙在下面留个言;
  3. 这个文档应该算是第一篇描述vc写.net框架程序的中文原创文档了,很多东西没有资料,都是笔者自己琢磨出来的,比如按窗口句柄创建graphics那句,开始想this->getsafehwnd();后来xxx.m_hwnd;再后来...再再后来.....最后终于发现了this->handle,再汗...另外编译器提示不要在initializecomponent()里输入自己的代码,你就不要输嘛,否则...555~~代价很惨重呐~~狂汗^_^!
  4. 我在代码文件里顺便做了点扩充,可以读入大部分常用的图像文件,但不是很完善,就当作给大家留个作业呵。现在的看图工具如acdsee等的载入速度是越来越慢了,而我们的这个小程序运行起来速度比它那个快多了;既然我们自己的程序就能显示大多常见图片了,那么双击图像文件,用我们的程序飞快地打开浏览,岂不爽哉,快哉?


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons