|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionThe code provided here will allow animated gif files to be displayed on windows within your projects. It does not rely on any library to do this but rather manually scans the gif to determine its contents, decompresses the image data and displays it on the window of your choice. By doing this manually the code has some degree of portability on win32 systems allowing the same code to work in both desktop and pocket applications. BackgroundOften while coding a project I have had the need to show some kind of animation, either as a status message to the user or to spice up an attribution dialog. After doing this manually several times using timers and and icons to switch images I needed a better more flexible way. The popularity of the GIF image format and it's ability to display animations made it a prime candidate to store the animations for my code. Using the codeThe class that you will interact with
//Calls the load from reader then prepairs bitmaps for display,
//a gif must be loaded before it can be displayed.
BOOL loadGif(CString filePath,
HDC hDCin,
BOOL animate,
HWND hWnd,
int multiplySizeBy,
int Xoffset,
int Yoffset);
BOOL loadGif(unsigned char* bufferIn,
unsigned long lengthIn,
HDC hDCin,
BOOL animate,
HWND hWnd,
int multiplySizeBy,
int Xoffset,
int Yoffset);
//An image must be loaded by calling the load method from the gifReader first.
BOOL displayGif();
//clean up.
void unloadGif();
Multiple objects of this class can be used simultaneously. Multiple animations can be drawn to the same window simultaneously. What is not supported are multiple animations being stacked in the same place. If that is done the tranceparency will be lost. To use the class some static members will need to be set up: #include "stdafx.h"
#include "gifDisplayer.h"
HANDLE gifDisplayer::hAccessMutex=0;
HANDLE gifDisplayer::hTimingThread=0;
int gifDisplayer::countOfObjects=0;
gifDisplayer* gifDisplayer::gifDisplayerObjectArray[MAX_SURFACES];
This is done from the main .cpp file or included in a file from there. You can instanciate objects from the class after that as normally would be done: //The parameter is the starting size for the decompressed gif.
//This can be set small but a small size will make decompression take longer
//because the output will have to be grown many times.
gifDisplayer* gr=new gifDisplayer(100000);
gifDisplayer* gr2=new gifDisplayer(100000);
gifDisplayer* gr3=new gifDisplayer(100000);
It is important to be sure your window has been drawn properly before calling switch (message)
{
case SETUP_MESSAGE:
{
//on a mobile device this can be a bit slow
//so its a good idea to show a wait cursor.
SetCursor(LoadCursor (NULL,IDC_WAIT));
//load and display three gifs.
gr->loadGif(gifPath,//the path of the file
surfaceDC,//the device context of the window
TRUE,//do you want to animate?
hSurfaceWindow,//the handle of the window
1,//scale the gif by a factor of 1 (possible values 1,2,3,4...)
50,//x position
100);//y position
gr->displayGif();
gr2->loadGif(gifPath2,
surfaceDC,
TRUE,
hSurfaceWindow,1,150,200);
gr2->displayGif();
gr3->loadGif(gifPath3,
surfaceDC,
TRUE,
hSurfaceWindow,2,0,0);
gr3->displayGif();
SetCursor(0);
}
break; Remember to call The Points of InterestAll the code in this project is based on the document "LZWand GIF explained" by steve Blackstock and on the compuserve gif standard. Although these documents do not contain any c++ code they are an accurate description of what a gif is. HistorySubmitted 24 March 2008.
|
||||||||||||||||||||||