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

📄 playgif.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 <unistd.h>



#include <minigui/common.h>

#include <minigui/minigui.h>

#include <minigui/gdi.h>

#include <minigui/window.h>

#include <minigui/control.h>



#include "ebcontrol.h"

#include "ctrlmisc.h"

#include "playgif.h"

#include "ebgif.h"



//#define DUG_INFO



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, char * bkfile)

{

	int 	bkcolor;

	RECT	rc;

	DWORD 	dwstyle = GetWindowStyle(hWnd);

	char filename[MAX_PATH+1];

	

	if (dwstyle & GFS_BKTRANSPARENT)

		return;

	else if (dwstyle & GFS_BKTRANSIMAGE)

	{

		if (IsTimerInstalled(hWnd, GetDlgCtrlID(hWnd)))

			PrefixFileName(bkfile,"fs",filename,MAX_PATH);

		else

			PrefixFileName(bkfile,"nm",filename,MAX_PATH);



		FillWithPicture(hWnd, hdc, filename, NULL, BMP_TYPE_ALPHARED, 0);

		return;

	}

	else if (dwstyle & GFS_BKNOTRANSFILE)

	{

		if (IsTimerInstalled(hWnd, GetDlgCtrlID(hWnd)))

			PrefixFileName(bkfile,"fs",filename,MAX_PATH);

		else

			PrefixFileName(bkfile,"nm",filename,MAX_PATH);

		

		FillWithPicture(hWnd, hdc, filename, NULL, BMP_TYPE_ALPHAVALUE, 0);

		return;

	}

	

	bkcolor = GetWindowBkColor(hWnd);



	SetBrushColor(hdc, bkcolor);

	GetWindowRect(hWnd, &rc);

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

	

}



#ifdef DUG_INFO

void printfGIFInfo(PGIFBITMAP gifData)

{	

	FILE * info=NULL;

	PGIFBITMAPELEMENT pitem;

	int i;

	

	if(!gifData)

	{	

		return;

	}

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

	if (info == NULL)

		return;

	

	fprintf(info, "版本=%s\n", gifData->screen.version);

	

	fprintf(info, "逻辑屏幕宽度=%d\n", gifData->screen.Width);

	fprintf(info, "逻辑屏幕高度=%d\n", gifData->screen.Height);

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

	fflush(info);

	

	EbRewindGIF(gifData);

	pitem = gifData->first;

	

	for(i=0; i<gifData->count; i++)

	{	

	//	pitem = GetNextGIFItem(gifData);

		if(pitem == NULL)

		{	

			fprintf(stderr, "the gif error at %d picture!\n", i+1);

			goto err;

		}

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

		fprintf(info, "图像宽度=%d\n", pitem->Bitmap.bmWidth);

		fprintf(info, "图像高度=%d\n", pitem->Bitmap.bmHeight);

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

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

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



		fflush(info);

		pitem = pitem->next;

	}

err:

	fclose(info);

	return;

}

#endif



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

{

	PPLAYGIFCTRLDATA pAddData;

	DWORD dwStyle = GetWindowStyle(hWnd);

	

	pAddData=(PPLAYGIFCTRLDATA)GetWindowAdditionalData2(hWnd);

	

    if (pbmp)

    {

    	RECT	rect;

    	int 	bmoldType = pbmp->bmType;

		

		if(dwStyle & GFS_GIFALPHACHANNEL)

		{

	  		unsigned char r,g,b,a;

	  	

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

			pbmp->bmType |= BMP_TYPE_ALPHACHANNEL;

			pbmp->bmAlpha = a;	

		}

		else if (dwStyle & GFS_GIFALPHA)

			pbmp->bmType = BMP_TYPE_ALPHA;

		else if (dwStyle & GFS_GIFNORMAL)

			pbmp->bmType = BMP_TYPE_NORMAL;

		else if (dwStyle & GFS_GIFALPHAVALUE)

			pbmp->bmType = BMP_TYPE_ALPHAVALUE;



		GetWindowRect(hWnd, &rect);

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

		FillBoxWithBitmap(hdc, offsetx+pAddData->gifx, offsety+pAddData->gify, 0, 0, pbmp);

		pbmp->bmType = bmoldType;

		return TRUE;

    }

    return FALSE;

}



void GifPaintText (HDC hdc, const char * sztext,DWORD dwStyle, RECT* prcText)

{

    if(sztext)

    {

        UINT uFormat;

        uFormat = DT_SINGLELINE|DT_LEFT|DT_TOP;/*默认位置*/



        if (dwStyle & GFS_CENTER)

            uFormat |= DT_CENTER;

        else if (dwStyle & GFS_RIGHT)

            uFormat |= DT_RIGHT;

    

        if (dwStyle &  GFS_VCENTER)

            uFormat |= DT_VCENTER;

        else if (dwStyle & GFS_BOTTOM)

            uFormat |= DT_BOTTOM;		

		

        DrawText (hdc, sztext, -1, prcText, uFormat);

     }

}





int InitPlayGif(PPLAYGIFCTRLDATA pgifctrldata, PPLAYGIFDATA padddate, DWORD dwStyle)

{

	if (pgifctrldata == NULL || padddate == NULL)

		return -1;

	

	pgifctrldata->gifx = padddate->gifx;

	pgifctrldata->gify = padddate->gify;

	

	if (padddate->bkfile)

	{

		pgifctrldata->bkfile = strdup(padddate->bkfile);



		if (dwStyle & GFS_BKSAVEBITMAP)

		{

			char szfile[MAX_PATH];

			

			memset(szfile, 0, MAX_PATH);

			PrefixFileName(pgifctrldata->bkfile, "nm", szfile, MAX_PATH);

			LoadBitmapFromFile(HDC_SCREEN, &(pgifctrldata->nmbmp), szfile);

			memset(szfile, 0, MAX_PATH);

			PrefixFileName(pgifctrldata->bkfile, "fs", szfile, MAX_PATH);

			LoadBitmapFromFile(HDC_SCREEN, &(pgifctrldata->fsbmp), szfile);

		}

	}

		

    if(padddate->giffile)

    {

    	FILE* fp;

		int i=0;



		if ( access (padddate->giffile, F_OK) < 0)

		{

			fprintf(stderr, "Err:PlayGIF file(%s) is not exist \n", padddate->giffile);

		//	return 1;	程序的健壮性,即使文件不存在,也不能影响到程序的运行

		}

		else

		{	

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

			{

				fprintf(stderr, "Err:PlayGifControlProc calloc failed \n");

		        return 1;

			}

			

		    EbInitGIF(pgifctrldata->gifData);

			

			fp = fopen( padddate->giffile, "r" );

			if( fp != NULL )

			{

				fseek(fp, 0, SEEK_SET);

        		if ( EbReadGIF(fp, pgifctrldata->gifData, HDC_SCREEN) < 0)

        		{

        			fclose(fp);

					free((void*)pgifctrldata->gifData);

					fprintf(stderr, "Err: ReadGIF(%s) failed \n", padddate->giffile);

					return -1;

        		}

				fclose(fp);

        	}

			else

			{

				perror("fopen");

				free((void *) pgifctrldata->gifData);

			}

		}

    }	



	#ifdef DUG_INFO

	printfGIFInfo(pgifctrldata->gifData);

	#endif

	

	return 0;

}



void CleanPlayGif(PPLAYGIFCTRLDATA pgifctrldata, DWORD dwStyle)

{

    if(pgifctrldata->gifData)

	{

		EbCleanGIF(pgifctrldata->gifData);

		free ((void*)pgifctrldata->gifData);

	}



	if (dwStyle & GFS_BKSAVEBITMAP)

	{

		UnloadBitmap(&(pgifctrldata->nmbmp));

		UnloadBitmap(&(pgifctrldata->fsbmp));

	}

	if (pgifctrldata->bkfile)

		free((void*)pgifctrldata->bkfile);

}



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

{

    RECT        rcClient;

    HDC         hdc;

    HICON       hIcon;  

    UINT        uFormat;

    DWORD       dwStyle=GetWindowStyle(hWnd);

    PPLAYGIFCTRLDATA pgifctrldata=(PGIFBITMAP)GetWindowAdditionalData2 (hWnd);

    int id = GetDlgCtrlID (hWnd); 



    switch (message) 

	{

        case MSG_CREATE:

        {

        	DWORD 	data;

			int 	delay;

			BOOL 	flags;

			char* 	spCaption;

			PPLAYGIFCTRLDATA pgifctrldata;

			PPLAYGIFDATA padddata = (PPLAYGIFDATA)GetWindowAdditionalData(hWnd);

			

			if (padddata == NULL)

			{

				fprintf(stderr, "____DUG: gif playgifdata is null.\n");

				return 1;

			}

			pgifctrldata = (PGIFBITMAP)calloc(1, sizeof(PLAYGIFCTRLDATA));

			if (pgifctrldata == NULL)

			{

        		fprintf(stderr, "Err:PlayGifControlProc calloc failed \n");

                return 1;				

			}

			InitPlayGif(pgifctrldata, padddata, dwStyle);

			

			SetWindowAdditionalData2 (hWnd, (DWORD)pgifctrldata);

			

⌨️ 快捷键说明

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