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

📄 playgif.c

📁 基于minigui开发的一套图形控件系统
💻 C
字号:
// 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"



#define GIF_TIME_ID 101



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));

	}

}



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;

			static int idtimer=1000;

			int i=0;

			

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

                	return 1;

                	

                InitGIF(gifData);

                spCaption = GetWindowCaption (hwnd);

                if(spCaption)

                {

                	FILE* fp;

					fp = fopen( spCaption, "r" );

					if( fp != NULL )

					{

						fseek(fp,0,SEEK_SET);

                		ReadGIF(fp,gifData,HDC_SCREEN);

                		fclose( fp );

                		SetWindowAdditionalData2 (hwnd, (DWORD)gifData);



						if (gifData->delaytime <= 0)

							delay = 5;

						else

							delay = gifData->delaytime;

						do 

						{

							flags = SetTimer(hwnd, idtimer, delay);

							i++;

							idtimer++;

							fprintf(stderr, "\n______playgif hwnd=%d, flags=%d \n",hwnd, flags);

						}

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

				

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

                		fprintf(stderr,"\n ReadGIF:%s,timer:%d,count;%d",

                			spCaption,gifData->delaytime,gifData->count);

                		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:

        	if(gifData)

        	{

        		CleanGIF(gifData);

        		free ((void*)gifData);

        		SetWindowAdditionalData2(hwnd,0);

        	}

			KillTimer(hwnd, 1000);

        	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;



				pitem = GetNextGIFItem(gifData);

        		if(!pitem)

        			RewindGIF(gifData);

        			

        		pitem = GetCurrentGIFItem(gifData);

				pgif = &(pitem->Bitmap);

				

				hdc = GetClientDC(hwnd);

        		if(pgif)

        		{

        			erasurebk(hwnd, hdc);

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

        	    //	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->top,  pitem->left);

        		}

        		//fprintf(stderr,"\n GFM_NEXTIMAGE");

        		ReleaseDC(hdc);

        		//InvalidateRect (hwnd, NULL, TRUE);

        	}

        }

        return 0;

        case MSG_PAINT:

        {

            if(gifData)

            {   

            	PGIFBITMAPELEMENT pitem;

				PBITMAP pbmp;

				

				pitem = GetCurrentGIFItem(gifData);

	            pbmp = &(pitem->Bitmap);

				

			//	fprintf(stderr,"\n GetCurrentGIFBmp:%08x",pbmp);

	            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);

	       //     	fprintf(stderr,"\n FillWithBitmapAlpha");

	            }

	            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 + -