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