⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playgif.cpp

📁 基于minigui开发的一套图形控件系统
💻 CPP
字号:
// Create date: 2004/01/01

//

// Modify records:

//

//  Who             When        Where       For What                Status

//-----------------------------------------------------------------------------

//  GAO Laihong    2004/01/06   tcl    	   	create            create





#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#include <minigui/common.h>

#include <minigui/minigui.h>

#include <minigui/gdi.h>

#include <minigui/window.h>

#include <minigui/control.h>

#include "ctrlmisc.h"

#include "playgif.h"

#include "ebgif.h"

#include "gif89a.h"



#define GIF_TIME_ID 101

static int idtimer=20000;



static int PlayGifControlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam);



BOOL RegisterPlayGifControl (void)

{

    WNDCLASS WndClass;



    WndClass.spClassName = CTRL_PLAYGIF;

    WndClass.dwStyle     = WS_NONE;

    WndClass.dwExStyle   = WS_EX_NONE;

    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);

    WndClass.iBkColor    = PIXEL_transparent;

    WndClass.WinProc     = PlayGifControlProc;



    return RegisterWindowClass (&WndClass);;

}



void PlayGifControlCleanup (void)

{

    // do nothing.

    UnregisterWindowClass (CTRL_PLAYGIF);

}



//当图片有透明部分时,不能擦除上一张图片在屏幕上的残留

void erasurebk(HWND hWnd, HDC hdc)

{

	int 	bkcolor;

	RECT	rc;

	

	bkcolor = GetWindowBkColor(hWnd);

	if (bkcolor != PIXEL_transparent)

	{

		SetBrushColor(hdc, bkcolor);

		GetWindowRect(hWnd, &rc);

		FillBox(hdc, 0, 0, RECTW(rc), RECTH(rc));

	}

}



void testgif89a(char * filename)

{	

	LPCGLOBAL_INFO gi;

	LPCFRAME fm;

	FILE * info=NULL;

	

	CGif89a gif(filename,FALSE);

	if(!gif)

	{	cout<<"gif89a init failed !"<<endl;

		return;

	}

	info = fopen("test.txt", "w");

	if (info == NULL)

		return;

	

	fprintf(info, "GIF文件信息提取器 版本1.0 作者:陈鹏\n");

	fprintf(info, "版本=%s\n", gif.getVer());

	

	gi = gif.getGlobalInfo();

	fprintf(info, "逻辑屏幕宽度=%d\n", gi->scrWidth);

	fprintf(info, "逻辑屏幕高度=%d\n", gi->scrHeight);

	fprintf(info, "图象帧数=%d\n", gi->frames);

	if(gi->gFlag)

	{

		fprintf(info, "全局调色板=有\n");

		fprintf(info, "全局调色板入口数=%d\n", gi->gSize);

		if(gi->gSort)

			fprintf(info, "全局调色板是否按优先排序=是\n");

		else

			fprintf(info, "全局调色板是否按优先排序=否\n");

	}

	else

		fprintf(info, "全局调色板=无\n");

	

	for(UINT i=0;i<gi->frames;i++)

	{	

		fm = gif.getNextFrame();

		if(fm == NULL)

		{	

			cout<<"the gif error at %d 帧!"<< i+1 <<endl;

			return;

		}

		fprintf(info, "第%d帧\n", i+1);

		fprintf(info, "图像宽度=%d\n", fm->imageWidth);

		fprintf(info, "图像高度=%d\n", fm->imageHeight);

		fprintf(info, "图象左上角X坐标=%d\n", fm->imageLPos);

		fprintf(info, "图象左上角Y坐标=%d\n", fm->imageTPos);

		

		if(fm->interlaceFlag)

			fprintf(info, "数据是否交错=是\n");

		else

			fprintf(info, "数据是否交错=否\n");

		if(fm->lFlag)

		{	

			fprintf(info, "是否有局部调色板=有\n");

			fprintf(info, "局部调色板入口数=%d\n",fm->lSize);

			if(fm->sortFlag)

				fprintf(info, "局部调色板是否按优先排序=是\n");

			else

				fprintf(info, "局部调色板是否按优先排序=否\n");

		}

		else

			fprintf(info, "是否有局部调色板=无\n");

		if(fm->ctrlExt.active)

		{	fprintf(info, "处理方式=%d\n", fm->ctrlExt.disposalMethod);

			if(fm->ctrlExt.userInputFlag)

				fprintf(info, "是否等待用户输入=是\n");

			else

				fprintf(info, "是否等待用户输入=否\n");

			fprintf(info, "延时(毫秒)=%d\n", fm->ctrlExt.delayTime*10);

			if(fm->ctrlExt.trsFlag)

				fprintf(info, "是否有透明色=是\n");

			else

				fprintf(info, "是否有透明色=否\n");

		}

	}

}



BOOL DrawGIF(HWND hwnd,HDC hdc,BITMAP * pbmp,BOOL alpha, int offsetx, int offsety)

{

    if (pbmp)

    {

    	RECT	rect;

    	int 	bmType = pbmp->bmType;

		

		if(alpha)

		{

	  		unsigned char r,g,b,a;

	  	

			Pixel2RGBA(HDC_SCREEN,GetWindowBkColor (hwnd),&r,&g,&b,&a);

			pbmp->bmType |= BMP_TYPE_ALPHACHANNEL;

			pbmp->bmAlpha = a;	

		}



		GetWindowRect(hwnd, &rect);

	//	FillBoxWithBitmap(hdc, 0, 0, RECTW(rect), RECTH(rect), pbmp);

		FillBoxWithBitmap(hdc, offsetx, offsety, 0, 0, pbmp);

		pbmp->bmType = bmType;

		return TRUE;

    }

    return FALSE;

}





static int PlayGifControlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)

{

    RECT        rcClient;

    HDC         hdc;

    HICON       hIcon;

    const char* spCaption;

    UINT        uFormat;

    DWORD       dwStyle;

    PGIFBITMAP gifData =(PGIFBITMAP)GetWindowAdditionalData2 (hwnd);

    int id = GetDlgCtrlID (hwnd);    

	

    switch (message) 

	{

        case MSG_CREATE:

        {

        	DWORD data;

			int delay;

			BOOL flags;

			

        	if ((gifData = (PGIFBITMAP) calloc (1, sizeof (GIFBITMAP))) == NULL)

                	return 1;

                	

                InitGIF(gifData);

                spCaption = GetWindowCaption (hwnd);

                if(spCaption)

                {

                	FILE* fp;

					int i=0;

					

					testgif89a((char *)spCaption);

					

					fp = fopen( spCaption, "r" );

					if( fp != NULL )

					{						

						fseek(fp,0,SEEK_SET);

                		ReadGIF(fp,gifData,HDC_SCREEN);

                		fclose( fp );

                		SetWindowAdditionalData2 (hwnd, (DWORD)gifData);



						delay = gifData->first->ctrl.delayTime;



						if (delay <= 0)

							delay = 10;

						

						flags = SetTimer(hwnd, idtimer, delay);

						/*while((flags == FALSE) && (i < 16));

						{

							idtimer++;

							flags = SetTimer(hwnd, idtimer, delay);

							i++;

						}*/

				

                		//SetTimer(hwnd,GIF_TIME_ID,1);//gifData->delaytime);

                		fprintf(stderr,"Init timer id =%d \n", idtimer);

						

                		return 0;

                	}

                }

				

                free((void*)gifData); 	

             	return 1;

        }

        break;  

        case MSG_GETDLGCODE:                  

                return DLGC_PUSHBUTTON;

             break;

        case MSG_SIZECHANGING:

        {

             const RECT* rcExpect = (const RECT*)wParam;

             RECT* rcResult = (RECT*)lParam;

             fprintf(stderr,"\n rcExpect:%d,%d,%d,%d ",rcExpect->left,rcExpect->top,

             		rcExpect->right,rcExpect->bottom);

             if((rcExpect->right-rcExpect->left) == 0)

             {

             	if(gifData)

             	{

             		PBITMAP pbmp = GetCurrentGIFBmp(gifData);

             		if(pbmp)

             		{

             			rcResult->top = rcExpect->top;

             			rcResult->left = rcExpect->left;

             			rcResult->right = rcResult->left + gifData->first->left + pbmp->bmWidth;

             			rcResult->bottom = rcResult->top + gifData->first->top + pbmp->bmHeight;

             			fprintf(stderr,"\n rcResult:%d,%d,%d,%d ",rcResult->left,rcResult->top,rcResult->right,rcResult->bottom);

             		}

             	}

             }

        }

        break;

        case MSG_DESTROY:

		{

			BOOL flags;

			flags = KillTimer(hwnd, idtimer);

			if (flags == FALSE)

				fprintf(stderr,"\n___KillTimer destroy failed  \n");

        	if(gifData)

        	{

        		CleanGIF(gifData);

        		free ((void*)gifData);

        		SetWindowAdditionalData2(hwnd,0);

        	}

			

			fprintf(stderr,"\n___PlayGif destroy \n");

        	break;                     

        }

        case MSG_NCPAINT:

        case MSG_ERASEBKGND:

        {

        	return 0;

        }

        break;			

        case GFM_GETTIMES:

        {

        	if(gifData)

        		return gifData->delaytime;

        	return 0;

        }

        break;

		case MSG_TIMER:

        /*case GFM_NEXTIMAGE:*/

        {

        	if(gifData)

        	{

        		PGIFBITMAPELEMENT pitem=NULL;

        		PBITMAP pgif;

				int delay, olddelay;



				//获得原来的延时

				pitem = GetCurrentGIFItem(gifData);

				olddelay = pitem->ctrl.delayTime;

				pitem=NULL;

			

				pitem = GetNextGIFItem(gifData);

        		if(!pitem)

        		{

        			RewindGIF(gifData);

					pitem = GetCurrentGIFItem(gifData);

				}	

				pgif = &(pitem->Bitmap);

				

				hdc = GetClientDC(hwnd);

        		if(pgif)

        		{

        			erasurebk(hwnd, hdc);

        	    //	fprintf(stderr, "___offsetx=%d, offsety=%d\n",pitem->left, pitem->top);

				//	fprintf(stderr, "___bmp width=%d, height=%d\n", pgif->bmWidth, pgif->bmHeight);

        	    	DrawGIF(hwnd, hdc, pgif, 0, pitem->left, pitem->top);

        		}

				ReleaseDC(hdc);

				

				//重设定时器

				delay = pitem->ctrl.delayTime;

				if(delay <= 0)

					delay  = 10;

				

				if (delay != olddelay) 

				{

					SetTimerSpeed(hwnd, idtimer, delay);

				}

        	}

        }

        return 0;

        case MSG_PAINT:

        {

            if(gifData)

            {   

            	PGIFBITMAPELEMENT pitem;

				PBITMAP pbmp;

				

				pitem = GetCurrentGIFItem(gifData);

	            pbmp = &(pitem->Bitmap);

				

	            hdc = BeginPaint(hwnd);

	            if(pbmp)

	            {

	            	erasurebk(hwnd, hdc);

	       //     	FillWithBitmapAlpha(hwnd,hdc,pbmp,0);

	       //		fprintf(stderr, "___offsetx=%d, offsety=%d\n",pitem->left, pitem->top);

	       			DrawGIF(hwnd, hdc, pbmp, 0, pitem->left, pitem->top);

	            }

	            EndPaint (hwnd, hdc);

            }

        }

        break;

        case MSG_VSCROLL:

        case MSG_HSCROLL:

        	return 0;

            break;  

        default:

            break;

    }

    return DefaultControlProc (hwnd, message, wParam, lParam);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -