📄 webimgview.cpp
字号:
BOOL CWebImgView::StretchDIB(HDC hDC,
HANDLE hsDIB,
HPALETTE hPal,
int nX,
int nY,
UINT uWidth,
UINT uHeight)
{
LPBITMAPINFOHEADER lpBI;
LPBITMAPINFO lpBMI;
BYTE *lpBits;
UINT uDIBWidth;
UINT uDIBHeight;
HPALETTE hOldPal;
if (ExitingApp) return false;
if (!hsDIB) return false;
lpBMI = (LPBITMAPINFO) GlobalLock(hsDIB);
lpBI = (LPBITMAPINFOHEADER) lpBMI;
if (!lpBI) { GlobalUnlock(hsDIB); return false;}
lpBits = GetDIBBits(lpBI);
uDIBWidth = (UINT) lpBI->biWidth;
uDIBHeight = (UINT) lpBI->biHeight;
if (hPal)
{
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}
SetStretchBltMode(hDC, COLORONCOLOR);
StretchDIBits(hDC,
nX,
nY,
uWidth,
uHeight,
0,
0,
uDIBWidth,
uDIBHeight,
lpBits,
lpBMI,
DIB_RGB_COLORS,
SRCCOPY);
if (hOldPal)
SelectPalette(hDC, hOldPal, FALSE);
GlobalUnlock(hsDIB);
return true;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//END IMAGELIB STUFF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/********************************************************************/
/*** StretchDIB: Draws the dib STRETCHED to a Device HDC ***/
//*******************************************************************/
BOOL CWebImgView::StretchDIBMode(HDC hDC,
HANDLE hsDIB,
HPALETTE hPal,
int nX,
int nY,
UINT uWidth,
UINT uHeight,
const Mode)
{
LPBITMAPINFOHEADER lpBI;
LPBITMAPINFO lpBMI;
BYTE *lpBits;
UINT uDIBWidth;
UINT uDIBHeight;
HPALETTE hOldPal;
if (ExitingApp) return false;
if (!hsDIB) return false;
lpBMI = (LPBITMAPINFO) GlobalLock(hsDIB);
lpBI = (LPBITMAPINFOHEADER) lpBMI;
if (!lpBI) { GlobalUnlock(hsDIB); return false;}
lpBits = GetDIBBits(lpBI);
uDIBWidth = (UINT) lpBI->biWidth;
uDIBHeight = (UINT) lpBI->biHeight;
if (hPal)
{
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}
SetStretchBltMode(hDC, COLORONCOLOR);
StretchDIBits(hDC,
nX,
nY,
uWidth,
uHeight,
0,
0,
uDIBWidth,
uDIBHeight,
lpBits,
lpBMI,
DIB_RGB_COLORS,
Mode);
if (hOldPal)
SelectPalette(hDC, hOldPal, FALSE);
GlobalUnlock(hsDIB);
return true;
}
/////////////////////////////////////////////////////////////////////////////
// CWebImgView
IMPLEMENT_DYNCREATE(CWebImgView, CView)
BEGIN_MESSAGE_MAP(CWebImgView, CView)
//{{AFX_MSG_MAP(CWebImgView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_WM_TIMER()
ON_COMMAND(IDSTARTANIMATION, OnStartanimation)
ON_COMMAND(IDSTOPANIMATION, OnStopanimation)
ON_WM_DESTROY()
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_OPENPNG, OnFileOpenpng)
ON_COMMAND(ID_FILE_SAVEPNG, OnFileSavepng)
ON_COMMAND(ID_FILE_SAVEASJPG, OnFileSaveasjpg)
ON_COMMAND(ID_FILE_SAVEASBMP, OnFileSaveasbmp)
ON_COMMAND(ID_ARHIV_PACKFILE, OnArhivPackfile)
ON_COMMAND(ID_ARHIV_UNPACKFILE, OnArhivUnpackfile)
// ON_COMMAND(ID_ARHIV_UNPACKBUFFER, OnArhivUnpackbuffer)
ON_COMMAND(ID_ARHIV_PACKBUFFER, OnArhivPackbuffer)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
BOOL CWebImgView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CWebImgView diagnostics
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void CWebImgView::AssertValid() const
{
CView::AssertValid();
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CWebImgView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
#endif //_DEBUG
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CWebImgView::OnDestroy()
{
OnStopanimation();
CView::OnDestroy();
// TODO: Add your message handler code here
}
/////////////////////////////////////////////////////////////////////////////
// CWebImgView construction
/////////////////////////////////////////////////////////////////////////////
//UNCOMMENT THIS WHEN NOT USING THE TRIAL VERSION
#define TRIAL
CWebImgView::CWebImgView()
{
//Set a global variable to this class
ThisCWebImgView = (long) this;
ExitingApp=false;
InTimer = false;
LoadingImage = false;
CanAnimate = true;
TimerAnimate = false;
FirstDib = false;
SaveCurrentFrame = false;
CurrentFrameItem = 0;
IsFileSaving = false;
//Load DLL
#ifdef TRIAL
hDLLInst=LoadLibrary("ILHUN10T.DLL");
#else
hDLLInst=LoadLibrary("ILHUN10.DLL");
#endif
if (hDLLInst == NULL) return;
//Get procedure address of function.
My_an_wtgiffiledib = (an_wtgiffiledib) GetProcAddress(hDLLInst,"an_wtgiffiledib");
//Get procedure address of function.
My_an_rdgiffiledib = (an_rdgiffiledib) GetProcAddress(hDLLInst,"an_rdgiffiledib");
//Get procedure address of function.
My_rdpngfiledibprog = (rdpngfiledibprog) GetProcAddress(hDLLInst,"rdpngfiledibprog");
//Get procedure address of function.
My_wrpngfiledib = (wrpngfiledib) GetProcAddress(hDLLInst,"wrpngfiledib");
//Get procedure address of function.
My_rdjpgfiledibprog = (rdjpgfiledibprog) GetProcAddress(hDLLInst,"rdjpgfiledibprog");
//Get procedure address of function.
My_wrjpgfiledib = (wrjpgfiledib) GetProcAddress(hDLLInst,"wrjpgfiledib");
//Get procedure address of function.
My_rdbmpfiledib = (rdbmpfiledib) GetProcAddress(hDLLInst,"rdbmpfiledib");
//Get procedure address of function.
My_wrbmpfiledib = (wrbmpfiledib) GetProcAddress(hDLLInst,"wrbmpfiledib");
//Get procedure address of function.
My_ilcompressfile = (ilcompressfile) GetProcAddress(hDLLInst,"ilcompressfile");
//Get procedure address of function.
My_ildecompressfile = (ildecompressfile) GetProcAddress(hDLLInst,"ildecompressfile");
//Get procedure address of function.
My_ilcompressbuf = (ilcompressbuf) GetProcAddress(hDLLInst,"ilcompressbuf");
//Get procedure address of function.
My_ildecompressbuf = (ildecompressbuf) GetProcAddress(hDLLInst,"ildecompressbuf");
//Get procedure address of function.
My_InitDll=(InitDll) GetProcAddress(hDLLInst,"InitDll");
//Get procedure address of function.
My_DdbtoDib=(DdbtoDib) GetProcAddress(hDLLInst,"DdbtoDib");
//Get procedure address of function.
My_ReduceDib=(ReduceDib) GetProcAddress(hDLLInst,"ReduceDib");
//initialization of DLL's.
#ifdef TRIAL
if (My_InitDll) My_InitDll(NULL,"donky");
#else
if (My_InitDll) My_InitDll(NULL,"closter");
#endif
//Load the background bitmap
LoadBackGroundBitMap();
}
/////////////////////////////////////////////////////////////////////////////
// CWebImgView destruction
/////////////////////////////////////////////////////////////////////////////
CWebImgView::~CWebImgView()
{
//Stop animation
CanAnimate = false;
//Free the memory of all items in the list
ClearList();
//Unload the library
if (hDLLInst)
FreeLibrary(hDLLInst);
DeleteDC (BufferDC);
}
/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////
void CWebImgView::LoadBackGroundBitMap()
{
CBitmap Bmp;
Bmp.LoadBitmap (IDB_BITMAP2);
BackGroundDib = IDDBtoDIB((HBITMAP)Bmp,
NULL,
8);
BackGroundDibPalette=CreateDIBPalette(BackGroundDib );
}
/////////////////////////////////////////////////////////////////////////////
//Free mem of all structures and clear linked list
/////////////////////////////////////////////////////////////////////////////
void CWebImgView::ClearList()
{
int i;
for (i=GifList.Size(); i>0; i--)
{
ClearListItem(i);
}
for (i=GifList.Size(); i>0; i--)
{
GifList.Pop();
}
}
/////////////////////////////////////////////////////////////////////////////
//Free mem of structure "Item"
/////////////////////////////////////////////////////////////////////////////
void CWebImgView::ClearListItem(int Item)
{
if ((Item <=GifList.Size()) && (Item >0))
{
TMyGifAnimation *PMyGif = (TMyGifAnimation*) GifList[Item];
if (PMyGif)
{
if (PMyGif->HDib) GlobalFree(PMyGif->HDib);
if (PMyGif->hPAL) DeleteObject(PMyGif->hPAL);
delete PMyGif;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CWebImgView drawing
/////////////////////////////////////////////////////////////////////////////
void CWebImgView::OnDraw(CDC* pDC)
{
//This is None MFC
HDC hdc = pDC->m_hDC;
RECT Rect;
DeleteDC (BufferDC);
if (ExitingApp) return;
HBITMAP hbm;
::GetClientRect(m_hWnd, &Rect);
//Draw a background image
if (BackGroundDib)
StretchDIB(hdc,BackGroundDib,BackGroundDibPalette,0,0,Rect.right,Rect.bottom);
//Create compatible DC
BufferDC = CreateCompatibleDC(hdc);
hbm = CreateCompatibleBitmap(pDC->m_hDC, Rect.right,Rect.bottom);
SelectObject(BufferDC, hbm);
//Copy BackGround to BufferDC
BitBlt(BufferDC,0,0,Rect.right,Rect.bottom, pDC->m_hDC, 0 ,0,SRCCOPY);
DrawFrame(CurrentFrameItem);
DeleteObject(hbm);
DeleteDC(hdc);
}
/////////////////////////////////////////////////////////////////////////////
//Process all messages
/////////////////////////////////////////////////////////////////////////////
void CWebImgView::PumpMessages()
{
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
/////////////////////////////////////////////////////////////////////////////
//This event is called when loading an animated gif
/////////////////////////////////////////////////////////////////////////////
short CWebImgView::CallEvent(HANDLE hdib, // Handle for Dib
void *GifHeader, // Pointer to GIF Header (Structure)
void *ImgDesc, // Pointer to Image Descriptor (Structure)
void *GraphCtrl, // Pointer to Graphical Control Ext.(Strucure)
long NetLoop, // Number of Netscape loops
char *pComment, // Pointer to comment block
short p) // Progressive showing
{
short result = 1;
if (ExitingApp) return 0;
switch (p)
{
case -20://p = -20 Dll is passing the first empty dib
if (hdib)
{
PMyGifAnimation = new TMyGifAnimation;
PMyGifAnimation->HDib = hdib;
PMyGifAnimation->hPAL = CreateDIBPalette(hdib);
if (GifHeader)
{
PMyGifAnimation->ScreenWidth = ((MYHEADER*)(GifHeader))->ScreenWidth;
PMyGifAnimation->ScreenHeight = ((MYHEADER*)(GifHeader))->ScreenHeight;
PMyGifAnimation->GlobalColorTableSize = ((MYHEADER*)(GifHeader))->GlobalColorTableSize;
PMyGifAnimation->GlobalColorTableFlag = ((MYHEADER*)(GifHeader))->GlobalColorTableFlag;
PMyGifAnimation->BackGroundColor = ((MYHEADER*)(GifHeader))->BackGroundColor;
//BYTE SortFlag;
//BYTE ColorResolution;
}
if (ImgDesc)
{
PMyGifAnimation->Left = ((MYIMAGEDESC*)(ImgDesc))->Left;
PMyGifAnimation->Top = ((MYIMAGEDESC*)(ImgDesc))->Top;
PMyGifAnimation->Width = ((MYIMAGEDESC*)(ImgDesc))->Width;
PMyGifAnimation->Height = ((MYIMAGEDESC*)(ImgDesc))->Height;
PMyGifAnimation->InterlaceFlag = ((MYIMAGEDESC*)(ImgDesc))->InterlaceFlag;
PMyGifAnimation->LocalColorTableFlag = ((MYIMAGEDESC*)(ImgDesc))->LocalColorTableFlag;
PMyGifAnimation->LocalColorTableSize = ((MYIMAGEDESC*)(ImgDesc))->LocalColorTableSize;
//BYTE SortFlag;
}
if (GraphCtrl)
{
PMyGifAnimation->DisposalMethod = ((MYGRAPHICALCONTROL*)(GraphCtrl))->DisposalMethod;
PMyGifAnimation->TransparentColorFlag = ((MYGRAPHICALCONTROL*)(GraphCtrl))->TransparentColorFlag;
PMyGifAnimation->TransparentColorIndex = ((MYGRAPHICALCONTROL*)(GraphCtrl))->ColorIndex;
PMyGifAnimation->DelayTime = ((MYGRAPHICALCONTROL*)(GraphCtrl))->DelayTime;
PMyGifAnimation->NetLoops = NetLoop;
//BYTE BlockSize;
//BYTE UserInputFlag;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -