📄 playgif.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 + -