没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-03-25 10:52:00.000|阅读 1289 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
适用于:
摘要:学习如何创建基于 .NET Framework 精简版的动画控件。
下载 AnimationControl.msi(英文)。(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解。)
目录
简介
在最近的项目中,有一项要求是在 Microsoft® .NET Framework 精简版的 Windows® 窗体中显示动画
GIF。.NET Framework 精简版的 1.0 版没有显示动画 GIF 文件的功能,也不包含 .NET Framework 完整版中的
ImageAnimator 辅助类。通过 ImageAnimator 类可以为基于时间帧的图像制作动画。
尽管可以编写 C# 代码读取 GIF86a 格式的动画 GIF,但是我在程序中选择了一种更简单直观的方法来显示动画。
创建情节
如果您在选定的 GIF 编辑器中打开一个动画 GIF,将会看到此文件是由相互衔接的多个图像(帧)组成的:
using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Imaging; public class AnimateCtl : System.Windows.Forms.Control { // 在此添加类的实现 } |
向这个类中添加一个公共的 Bitmap 属性,用于从客户端传递位图。不要忘记为这个位图声明一个私有成员,以便在类中使用:
private Bitmap bitmap; public Bitmap Bitmap { get { return bitmap; } set { bitmap = value; { { |
我们创建的这个控件将使用在其中检索的 Graphics 对象的 DrawImage 方法来绘制这些帧:
private void Draw(int iframe) { //计算图形框的左边位置 int XLocation = iframe * frameWidth; Rectangle rect = new Rectangle(XLocation, 0, frameWidth, frameHeight); //绘制图像 graphics.DrawImage(bitmap, 0, 0, rect, GraphicsUnit.Pixel); } |
此方法接受需要绘制的当前帧号。然后计算图形框的左边位置以创建矩形。
为了实现该控件的循环逻辑,我选择使用 System.Windows.Forms.Timer。
还有不少其他选项可以提供同样的功能,例如使用 System.Threading.Timer 或是创建一个单独的线程也可以达到相同的目的;但是使用
System.Windows.Forms.Timer 更简单方便。在控件的构造函数中添加以下代码:
public AnimateCtl() { //缓存 Graphics 对象 graphics = this.CreateGraphics(); //实例化 Timer fTimer = new System.Windows.Forms.Timer(); //与 Timer 的 Tick 事件挂钩 fTimer.Tick += new System.EventHandler(this.timer1_Tick); } |
在构造函数中,我们从控件的实例中缓存 Graphics 对象并创建一个新的 Timer 实例,然后将其与 Timer 的 Tick 事件挂钩。现在已经可以插入 StartAnimation 方法,以便实际启动动画:
public void StartAnimation(int frWidth, int DelayInterval, int
LoopCount) { frameWidth = frWidth; //循环次数 loopCount = LoopCount; //重置循环计数器 loopCounter = 0; //计算 frameCount frameCount = bitmap.Width / frameWidth; frameHeight = bitmap.Height; //调整控件的大小 this.Size(frameWidth, frameHeight); //向计时器指定延迟间隔 fTimer.Interval = DelayInterval; //启动计时器 fTimer.Enabled = true; } |
此方法接受一些非常重要的动画参数:帧宽度、延迟间隔和循环次数。
另外,不要忘记循环逻辑:
private void timer1_Tick(object sender, System.EventArgs e) { if (loopCount == -1) //不停地循环 { this.DrawFrame(); } else { if (loopCount == loopCounter) //停止动画 fTimer.Enabled = false; else this.DrawFrame(); } } private void DrawFrame() { if (currentFrame < frameCount-1) { //移到下一个帧 currentFrame++; } else { //递增 loopCounter loopCounter++; currentFrame = 0; } Draw(currentFrame); } |
在上面代码的 timer1_Tick 事件中,我们检查 loopCount 以跟踪已绘制的循环次数,并将其与调用 StartAnimation
方法时捕获的 loopCounter 相比较。
演出开始!
我们已经完成了 AnimateCtl,现在可以进行测试。第一步,必须将带有“故事板”的图像文件添加到您的项目中。可以通过将此文件变为嵌入的资源或仅通知
Visual Studio .NET 2003 将此文件作为项目的一部分进行复制来完成此任务。在 Solution
Explorer(解决方案资源管理器)中的项目上单击鼠标右键,并在弹出式菜单中选择 Add Existing
Item...(添加现有项...)。浏览到图像文件并确保此文件的 Build Action(生成操作)属性已被设置为 Content(内容)。
现在,在窗体的构造函数中插入以下代码:
public Form1() { // // Windows Form Designer(Windows 窗体设计器)支持所需 // InitializeComponent(); //实例化控件 animCtl = new AnimateCtl(); //从图像文件指定 Bitmap animCtl.Bitmap = new Bitmap(@"\Program Files\AnimateControl\guestbk.gif"); //设置位置 animCtl.Location = new Point(50, 50); //将控件添加到窗体 this.Controls.Add(animCtl); } |
在上面的代码中,我们使用从图像文件中创建的 Bitmap 对象指定动画控件的 Bitmap 属性。
在设计器的窗体上放置两个按钮,并将以下代码添加到它们的 Click 事件中:
private void button1_Click(object sender, System.EventArgs e) { animCtl.StartAnimation(92, 100, 3); } private void button2_Click(object sender, System.EventArgs e) { animCtl.StopAnimation(); } |
运行项目并点击 Start Animation(启动动画)按钮,您就可以看到动画了:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号