⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webimgview.cpp

📁 快速处理基于 Web 的各种图象文件.zip
💻 CPP
📖 第 1 页 / 共 5 页
字号:
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 + -