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