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

📄 ninegif.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 "ebcontrol.h"

#include "NineGIF.h"



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



BOOL RegisterNineGifControl (void)

{

    WNDCLASS WndClass;



    WndClass.spClassName = CTRL_NINEGIF;

    WndClass.dwStyle     = WS_NONE;

    WndClass.dwExStyle   = WS_EX_NONE;

    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);

    WndClass.iBkColor    = PIXEL_transparent;

    WndClass.WinProc     = NineGifControlProc;



    return RegisterWindowClass (&WndClass);;

}



void NineGifControlCleanup (void)

{

    // do nothing.

    UnregisterWindowClass (CTRL_NINEGIF);

}



/*

void DrawFocusPic(HWND hWnd, HDC hdc, PGIFBITMAP pgif, BOOL flags)

{

	HDC mem_dc;

	BITMAP bmp;

	PGIFBITMAPELEMENT pitem;

	

	mem_dc = CreateCompatibleDC(hdc);

	if (flags)//获得焦点

	{

		if (LoadBitmap(mem_dc, &bmp, "res/fstrans.gif") < 0)

			goto err;

	}

	else

	{

		if (LoadBitmap(mem_dc, &bmp, "res/nmtrans.gif") < 0)

			goto err;		

	}



	FillBoxWithBitmap(mem_dc, 0, 0, 0, 0, &bmp);

	pitem = pgif->first;

	NineGIFDrawGIF(hWnd, mem_dc, &(pitem->Bitmap), 0, pitem->left, pitem->top);

	BitBlt(mem_dc, 0, 0, 0, 0, hdc, 0, 0, 0);

	

err:

	ReleaseDC(mem_dc);

	return;

}

*/



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

void NineGIFErasureBK(HWND hWnd, HDC hdc, PRECT rc)

{

	int 	bkcolor;

	DWORD 	dwstyle = GetWindowStyle(hWnd);

	

	if (dwstyle & GFS_BKTRANSPARENT)

		return;

	

	bkcolor = GetWindowBkColor(hWnd);



	SetBrushColor(hdc, bkcolor);

	FillBox(hdc, rc->left, rc->top, (rc->right-rc->left), (rc->bottom- rc->top));

	

}



BOOL FillWithBmpfileAtPos(HWND hwnd,HDC hdc,char * bmpfile,BOOL alpha, int x, int y)

{

   BITMAP 	bmp;

   RECT		rect;

   

   memset(&bmp,0,sizeof(BITMAP));

   

   if(bmpfile)

   {

		if(!LoadBitmap( HDC_SCREEN, &bmp, bmpfile))

		{

			if(alpha)

			{

				unsigned char r,g,b,a;

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

				bmp.bmType |= BMP_TYPE_ALPHACHANNEL;

				bmp.bmAlpha = a;

		    }

			GetWindowRect(hwnd, &rect);

			

			FillBoxWithBitmap(hdc, x, y, RECTW(rect), RECTH(rect), &bmp);

			UnloadBitmap(&bmp);

			return TRUE;

		}

    }

    return FALSE;

}



BOOL NineGIFDrawGIF(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 NineGifControlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

{

    RECT        rcClient;

    HDC         hdc;

    HICON       hIcon;

    

    UINT        uFormat;

    DWORD       dwStyle;

    PNINEGIFITEM ninegif = (PNINEGIFITEM)GetWindowAdditionalData2 (hWnd);

//    int id = GetDlgCtrlID(hWnd);    

	

    switch (message) 

	{

        case MSG_CREATE:

        {

        	DWORD data;

			int delay;

			BOOL flags;

			FILE* fp;

			int i=0;

			PNINEGIFDATA ninegifdata = (PNINEGIFDATA) GetWindowAdditionalData(hWnd);



			if (ninegifdata == NULL)

				return -1;

			if (ninegifdata->giffile == NULL)

				return -1;

			

        	if ((ninegif = (PNINEGIFITEM) calloc(1, sizeof(NINEGIFITEM))) == NULL)

                	return 1;

                	

            InitGIF(&(ninegif->gif));



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

			if( fp != NULL )

			{						

				fseek(fp,0,SEEK_SET);

        		ReadGIF(fp, &(ninegif->gif), HDC_SCREEN);

        		fclose( fp );

			}	

			ninegif->bkfile = ninegifdata->bkfile;

			ninegif->numfile = ninegifdata->numfile;

			CopyRect(&(ninegif->gif_rc), &(ninegifdata->gif_rc));

			ninegif->num_pos.x = ninegifdata->num_left;

			ninegif->num_pos.y = ninegifdata->num_top;

			

        	SetWindowAdditionalData2 (hWnd, (DWORD)ninegif);

        	return 0;

        }

        break;  

        case MSG_GETDLGCODE:                  

             return DLGC_PUSHBUTTON;

	

     /*   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_SETFOCUS:

		{

			ninegif->status |= NGST_FOCUS;

			if (GetCapture() != hWnd)

			{

				SetCapture (hWnd);

				InvalidateRect(hWnd, NULL, TRUE);

			}

			break;

		}

		case MSG_KILLFOCUS:

		{

			ninegif->status &= ~NGST_FOCUS;

			if (GetCapture() == hWnd)

			{

				ReleaseCapture ();

				InvalidateRect(hWnd, NULL, TRUE);

			}

			break;

		}

        case MSG_MOUSEMOVE:

		{

			int x, y;

			

			x = LOSWORD(lParam);

            y = HISWORD(lParam);

			ScreenToWindow(GetParent(hWnd), &x, &y);

            GetWindowRect(hWnd, &rcClient);

            

            if (PtInRect(&rcClient, x, y))

            {

                if (GetCapture() == hWnd)

               		return 0;

             	SetCapture (hWnd);

                ninegif->status |= NGST_FOCUS;                 

                InvalidateRect(hWnd, NULL, TRUE);

            }

			else

			{

				if(ninegif->status & NGST_FOCUS)

				{

	            	ninegif->status &= ~NGST_FOCUS;

	            	if (GetCapture() == hWnd)

	            		ReleaseCapture (); 

               	

            		InvalidateRect (hWnd, NULL, TRUE);  

				}

            }



			break;

		}

			

        case MSG_DESTROY:

		{

			KillTimer(hWnd, GetDlgCtrlID(hWnd));

        	if(ninegif)

        	{

        		CleanGIF(&(ninegif->gif));

        		free ((void*)ninegif);

        		SetWindowAdditionalData2(hWnd,0);

        	}

        	break;                     

        }

        case MSG_NCPAINT:

        case MSG_ERASEBKGND:

        {

        	return 0;

        }

        break;			

        case GFM_GETTIMES:

        {

        	return ninegif->gif.delaytime;

        }

        break;

		

		case GFM_SETTIMER:

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

			{

				PGIFBITMAPELEMENT pitem=NULL;

				pitem = GetCurrentGIFItem(&(ninegif->gif));

				SetTimer(hWnd, GetDlgCtrlID(hWnd), pitem->ctrl.delayTime);

			}

			break;

			

		case GFM_KILLTIMER:

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

				KillTimer(hWnd, GetDlgCtrlID(hWnd));

			SendMessage(hWnd, MSG_PAINT, 0, 0);

			break;

		

		case MSG_TIMER:

        /*case GFM_NEXTIMAGE:*/

        {

        	if(ninegif)

        	{

        		PGIFBITMAPELEMENT pitem=NULL;

        		PBITMAP pgif;

				int delay, olddelay;

				

				//获得原来的延时

				pitem = GetCurrentGIFItem(&(ninegif->gif));

				olddelay = pitem->ctrl.delayTime;

				

				hdc = GetClientDC(hWnd);



				pitem=NULL;	

				pitem = GetNextGIFItem(&(ninegif->gif));

				pgif = &(pitem->Bitmap);

				

        		if(pgif)

        		{

        			NineGIFErasureBK(hWnd, hdc, &(ninegif->gif_rc));

        	    	NineGIFDrawGIF(hWnd, hdc, pgif, 0, pitem->left + ninegif->gif_rc.left, 

						pitem->top + ninegif->gif_rc.top);

        		}

				ReleaseDC(hdc);

				

				//重设定时器

				delay = pitem->ctrl.delayTime;

				if(delay <= 0)

					delay  = 10;

				

				if (delay != olddelay) 

				{

					KillTimer(hWnd, GetDlgCtrlID(hWnd));

					SetTimer(hWnd, GetDlgCtrlID(hWnd), delay);

				}

        	}

        }

        return 0;

        case MSG_PAINT:

        {

            if(ninegif)

            {   

            	PGIFBITMAPELEMENT pitem;

				PBITMAP pbmp;

				HDC mem_dc;

				char * szcaption = GetWindowCaption(hWnd);

				RECT rc;

				

				GetWindowRect(hWnd, &rc);

				

				hdc = BeginPaint(hWnd);

				mem_dc = CreateCompatibleDC(hdc);



				if (ninegif->bkfile)

					FillWithBmpfile(hWnd, mem_dc, ninegif->bkfile, 0);

				

				if (szcaption)

				{

					;

				}

				

				if (ninegif->numfile)

				{

					FillWithBmpfileAtPos(hWnd, mem_dc, ninegif->numfile, 0, 

						ninegif->num_pos.x, ninegif->num_pos.y);

				}

				pitem = GetCurrentGIFItem(&(ninegif->gif));

	            pbmp = &(pitem->Bitmap);

				

	            

	            if(pbmp)

	            {

	            	NineGIFErasureBK(hWnd, hdc, &(ninegif->gif_rc));

	       			NineGIFDrawGIF(hWnd, hdc, pbmp, 0, pitem->left + ninegif->gif_rc.left, 

						pitem->top + ninegif->gif_rc.top);

	            }

				

				BitBlt(mem_dc, 0, 0, RECTW(rc), RECTH(rc), hdc, 0, 0, 0);

				

				ReleaseDC(mem_dc);

	            EndPaint (hWnd, hdc);

            }

        }

        break;

        case MSG_VSCROLL:

        case MSG_HSCROLL:

        	return 0;

        default:

            break;

    }

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

}



⌨️ 快捷键说明

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