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