|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
This article has been provided courtesy of MSDN. ContentsIntroductionDuring a recent project, one of the requirements was to show an animated GIF on a Microsoft® .NET Compact Framework Windows® Form. Version 1.0 of the .NET Compact Framework does not include the capability to display animated GIF files nor does it incorporate the Even though it is possible to write C# code to read the animated GIF in GIF86a format, I have chosen a more simplistic and straightforward way to display animation in my program. Creating a StorylineIf you open an animated GIF in the GIF editor of your choice, you will see that this file consists of a few images (frames) that follow each other:
Figure 1. Animation frames These images are stored in a compressed format with information on the size, quantity and delay time between the frames. This information is read by the program that displays the animation. Many of the GIF editors allow you to extract the image frames into a sequential "storyboard" of the frames:
Figure 2. Storyboard I saved this into a single bitmap file, which I later converted into GIF format as it uses less memory within the .NET Compact Framework. Now I am going to show you how to use this image to create a .NET Compact Framework-based Animation control. Let's animateThe way in which we're going to animate the bitmap is rather simple. It relies on the fact that when you're using an image in the .NET Compact Framework, you don't necessarily have to display the entire image you've loaded into memory. One of the overloaded methods of the We add a new class using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
public class AnimateCtl : System.Windows.Forms.Control
{
// Add class implementation here
}
Let's add a private Bitmap bitmap;
public Bitmap Bitmap
{
get
{
return bitmap;
}
set
{
bitmap = value;
{
{
The control we create will draw the frames by using the private void Draw(int iframe)
{
//Calculate the left location of the drawing frame
int XLocation = iframe * frameWidth;
Rectangle rect = new Rectangle(XLocation, 0, frameWidth, frameHeight);
//Draw image
graphics.DrawImage(bitmap, 0, 0, rect, GraphicsUnit.Pixel);
}
This method accepts the current frame number that needs to be drawn. We then create the drawing rectangle by calculating its left position. In order to implement the looping logic of the control, I've chosen to utilize the Although quite a few other options exist to provide the same functionality such as public AnimateCtl()
{
//Cache the Graphics object
graphics = this.CreateGraphics();
//Instantiate the Timer
fTimer = new System.Windows.Forms.Timer();
//Hook up to the Timer's Tick event
fTimer.Tick += new System.EventHandler(this.timer1_Tick);
}
In the constructor, we cache the public void StartAnimation(int frWidth, int DelayInterval, int LoopCount)
{
frameWidth = frWidth;
//How many times to loop
loopCount = LoopCount;
//Reset loop counter
loopCounter = 0;
//Calculate the frameCount
frameCount = bitmap.Width / frameWidth;
frameHeight = bitmap.Height;
//Resize the control
this.Size(frameWidth, frameHeight);
//Assign delay interval to the timer
fTimer.Interval = DelayInterval;
//Start the timer
fTimer.Enabled = true;
}
This method accepts a few parameters that are very important for animation: frame width, delay interval and loop count. And don't forget the looping logic: private void timer1_Tick(object sender, System.EventArgs e)
{
if (loopCount == -1) //loop continuously
{
this.DrawFrame();
}
else
{
if (loopCount == loopCounter) //stop the animation
fTimer.Enabled = false;
else
this.DrawFrame();
}
}
private void DrawFrame()
{
if (currentFrame < frameCount-1)
{
//move to the next frame
currentFrame++;
}
else
{
//increment the loopCounter
loopCounter++;
currentFrame = 0;
}
Draw(currentFrame);
}
In the code above, in the Movie Time!We are done with the Now let's insert the following into your public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//Instantiate control
animCtl = new AnimateCtl();
//Assign the Bitmap from the image file
animCtl.Bitmap = new Bitmap(@"\Program Files\AnimateControl\guestbk.gif");
//Set the location
animCtl.Location = new Point(50, 50);
//Add to control to the Form
this.Controls.Add(animCtl);
}
In the code above, we assign the Place two buttons on your form in the designer and add the code to their click events: 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();
}
When running the project and tapping on the "Start Animation" button, you should see the animation:
Figure 3. The final product The amount of frames incorporated into the pseudo-animated GIF files could vary as well as the delay time between the frames. You would certainly need to adjust the In no way is this code considered in its final version. The Please keep in mind that displaying a high-resolution graphics animation could impose a heavy load on the system resources. Be aware of the memory and resource constraints of some of the devices you could be running this code on. Don't forget to test it thoroughly and make sure that your application is not hogging up all the memory or taking up all the processor time. ConclusionAlthough the .NET Compact Framework is a subset of the full .NET Framework, developers still have the power to create compelling user interfaces which are more attractive to end users. By utilizing available GIF editor tools and the drawing capabilities of the .NET Compact Framework, we are able to display the animation in their Smart Device projects. Links
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||