imageshow.cpp

来自「类似QQ,MSN表情的richedit调用控件,实现gif的显示.」· C++ 代码 · 共 969 行 · 第 1/2 页

CPP
969
字号
		} 
		else    //<code> doesn't exist in the string pcGifTable
		{
			code1		= oldcode;
			WORD code2	= 0;
			while( code1 >= iPrimaryTableSize )
			{
				pcGifTable[code1].nextcode = code2;
				code2	= code1;
				code1	= pcGifTable[code1].previouscode;
				if( code1 >= code2 )
				{
					delete[] pcInfo;
					return 0;
				}
			}
			Output((BYTE)code1);
			while( code2 != 0 )
			{
				Output(pcGifTable[code2].bit);
				code2 = pcGifTable[code2].nextcode;
			}
			Output((BYTE)code1);
			pcGifTable[iTableSize].bit = (BYTE)code1;
			pcGifTable[iTableSize].previouscode = oldcode;
			iTableSize++;
			if( iTableSize == (0x0001<<m_uBitSize) )
				m_uBitSize++;
			if( m_uBitSize > 12 )
				m_uBitSize = 12;
			oldcode = code;
		}
	}

	hBitmap = CreateDIBitmap(m_hDC,bitmapheader,CBM_INIT,m_pcBitmap,(BITMAPINFO*)pcInfo,DIB_RGB_COLORS);		
	m_pcGifTrack++;
	m_iTotalReadByte++;
	delete[] pcInfo;
	return hBitmap;
}

WORD CImageShow::GetCode(void)
{
	UINT	tmp1;
	BYTE	tmp;
	tmp		= 1;
	if( m_uRemain >= m_uBitSize )
	{
		tmp		<<= m_uBitSize;
		tmp--;
		tmp1	= m_cCurentByte&tmp;
		m_cCurentByte >>= m_uBitSize;
		m_uRemain	  -= m_uBitSize;
	}
	else
	{
		tmp		<<= m_uRemain;
		tmp--;
		tmp1	= m_cCurentByte;
		m_cCurentByte = GetByte();
		tmp		= 1;
		if( 8 >= (m_uBitSize-m_uRemain) )
		{
			tmp <<= (m_uBitSize-m_uRemain);
			tmp--;
			tmp1 = (((UINT)(m_cCurentByte&tmp))<<m_uRemain)+tmp1;
			m_cCurentByte >>= (m_uBitSize-m_uRemain);
			m_uRemain =	8-(m_uBitSize-m_uRemain);
		}
		else
		{
			tmp1	= (((UINT)(m_cCurentByte))<<m_uRemain)+tmp1;
			m_cCurentByte = GetByte();
			tmp		<<= m_uBitSize-m_uRemain-8;
			tmp--;
			tmp1	= (((UINT)(m_cCurentByte&tmp))<<(m_uRemain+8))+tmp1;
			m_cCurentByte >>= m_uBitSize-m_uRemain-8;
			m_uRemain = 8-(m_uBitSize-m_uRemain-8);
		}
	}
	return tmp1;
}

void CImageShow::Output(BYTE bit)
{
	int		tmp;
	if( m_cPackedField&0x40 )
	{
		if( m_x == m_iWidth )
		{
			m_x		= 0;
			if( m_iPass == 1 )
				m_iRow += 8;
			if( m_iPass == 2 )
				m_iRow += 8;
			if( m_iPass == 3 )
				m_iRow += 4;
			if( m_iPass == 4 )
				m_iRow += 2;
			if( m_iRow >= m_iHeight )
			{
				m_iPass += 1;
				m_iRow  = 16>>m_iPass;
			}
		}
		tmp = m_iRow*m_iWidth1+m_x;
		m_pcBitmap[tmp] = bit;
		m_x++;
	}
	else
	{
		if( m_x == m_iWidth )
		{
			m_x = 0;
			m_y++;
		}
		tmp = m_y*m_iWidth1+m_x;
		m_x++;
	}
	if( tmp > m_iMaxByte )
		return;
	m_pcBitmap[tmp] = bit;
}

BYTE CImageShow::GetByte(void)
{
	if( m_uReadByte >= m_uBlockSize )
	{
		m_uBlockSize = *m_pcGifTrack++;
		m_uReadByte  = 0;
		m_iTotalReadByte += m_uBlockSize+1;
		if( m_iTotalReadByte > m_iGifSize )
		{
			m_iTotalReadByte -= m_uBlockSize+1;
			return 0xFF;
		}
		if( m_uBlockSize == 0 )
		{
			m_pcGifTrack--;
			m_iTotalReadByte--;
			return 0xFF;
		}
	}
	m_uReadByte++;
	return *m_pcGifTrack++;
}

HRESULT CImageShow::OnDraw(ATL_DRAWINFO& di)
{
#if 0
	RECT& rc = *(RECT*)di.prcBounds;
	// 将剪辑区域设置为 di.prcBounds 指定的矩形
	HRGN hRgnOld = NULL;
	if (GetClipRgn(di.hdcDraw, hRgnOld) != 1)
		hRgnOld = NULL;
	bool bSelectOldRgn = false;

	HRGN hRgnNew = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);

	if (hRgnNew != NULL)
	{
		bSelectOldRgn = (SelectClipRgn(di.hdcDraw, hRgnNew) != ERROR);
	}

	Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
	SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
	LPCTSTR pszText = _T("ATL 8.0 : ImageShow");
#ifndef _WIN32_WCE
	TextOut(di.hdcDraw,
		(rc.left + rc.right) / 2,
		(rc.top + rc.bottom) / 2,
		pszText,
		lstrlen(pszText));
#else
	ExtTextOut(di.hdcDraw,
		(rc.left + rc.right) / 2,
		(rc.top + rc.bottom) / 2,
		ETO_OPAQUE,
		NULL,
		pszText,
		ATL::lstrlen(pszText),
		NULL);
#endif

	if (bSelectOldRgn)
		SelectClipRgn(di.hdcDraw, hRgnOld);

	return S_OK;
#endif

	static int iFirst = 0;
	GetAmbientUserMode(m_bRunMode);
	if( !m_bRunMode )
	{
		RECT&		rc = *(RECT*)di.prcBounds;
		OLE_COLOR	backcolor;
		COLORREF	cl;
		HBRUSH		br;
		HBITMAP		bmp;
		HBITMAP		oldbitmap;

		if( m_bGlass == FALSE )
		{
			HPALETTE pal;
			GetAmbientPalette(pal);
			GetAmbientBackColor(backcolor);
			OleTranslateColor(backcolor,pal,&cl);
			br=CreateSolidBrush(cl);
			FillRect(di.hdcDraw,&rc,br);
			DeleteObject(br);
		}
		m_hDC	= di.hdcDraw;
		bmp		= FirstImage();
		if( bmp != 0 )
		{
			HDC dc;
			dc = CreateCompatibleDC(di.hdcDraw);
			oldbitmap = (HBITMAP)SelectObject(dc,bmp);
			::BitBlt(di.hdcDraw,rc.left+m_iLeft,rc.top+m_iTop,m_iWidth,m_iHeight,dc,0,0,SRCCOPY);
			SelectObject(dc,oldbitmap);
			DeleteObject(bmp);
			DeleteDC(dc);
		}
		else
		{
			DrawText(di.hdcDraw, _T("Gif Control"), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		}
		m_pcGifTrack = m_pcGif;
		m_iTotalReadByte = 0;
	}
	else
	{
		//if( m_hDC == 0 )
		m_hDC	= di.hdcDraw;
		if( ( flag == 0 ) && ( m_bAutoStart != FALSE ) )
		{
			flag	=	1;
			OLE_COLOR	backcolor;
			RECT&		rc = *(RECT*)di.prcBounds;
			HBRUSH		br;
			COLORREF	cl;
			if( m_bGlass == FALSE )
			{
				HPALETTE pal;
				GetAmbientPalette(pal);
				GetAmbientBackColor(backcolor);
				OleTranslateColor(backcolor,pal,&cl);
				br = CreateSolidBrush(cl);
				FillRect(di.hdcDraw,&rc,br);
				DeleteObject(br);
			}
			Play();
			return S_OK;
		}
		if( ( flag == 0 ) && ( m_bAutoStart == FALSE ) )
		{
			OLE_COLOR	backcolor;
			HBRUSH		br;
			COLORREF	cl;
			if( m_bGlass == FALSE )
			{
				RECT& rc = *(RECT*)di.prcBounds;
				HPALETTE pal;
				GetAmbientPalette(pal);
				GetAmbientBackColor(backcolor);
				OleTranslateColor(backcolor,pal,&cl);
				br = CreateSolidBrush(cl);
				FillRect(di.hdcDraw,&rc,br);
				DeleteObject(br);
			}
			return S_OK;
		}

		if( m_hRedrawBitmap != 0 )
		{
			while(m_bLockBitmap);
			m_bLockBitmap=TRUE;
			HBITMAP old;
			HBRUSH br;
			OLE_COLOR backcolor;
			RECT& rc = *(RECT*)di.prcBounds;
			COLORREF cl;
			if( m_bGlass == FALSE )
			{
				HPALETTE pal;
				GetAmbientPalette(pal);
				GetAmbientBackColor(backcolor);
				OleTranslateColor(backcolor,pal,&cl);
				br=CreateSolidBrush(cl);
				FillRect(di.hdcDraw,&rc,br);
				DeleteObject(br);
			}
			HDC dc=::CreateCompatibleDC(di.hdcDraw);
			old=(HBITMAP)::SelectObject(dc,m_hRedrawBitmap);
			::BitBlt(di.hdcDraw,0,0,m_iGifWidth,m_iGifHeight,dc,0,0,SRCCOPY);
			//DrawText(di.hdcDraw, _T("HeKai Gif Control"), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
			::SelectObject(dc,old);
			m_bLockBitmap=FALSE;
			DeleteDC(dc);
		}else
		{
			HBITMAP		oldbitmap;
			HBITMAP		bmp;
			if( iFirst == 0)
			{
				iFirst = 1;
				bmp	= FirstImage();
			}else
			{
				bmp	= NextImage();
			}
			if( bmp != 0 )
			{
				HDC dc;
				RECT& rc = *(RECT*)di.prcBounds;
				dc = CreateCompatibleDC(di.hdcDraw);
				oldbitmap = (HBITMAP)SelectObject(dc,bmp);
				::BitBlt(di.hdcDraw,rc.left+m_iLeft,rc.top+m_iTop,m_iWidth,m_iHeight,dc,0,0,SRCCOPY);
				SelectObject(dc,oldbitmap);
				DeleteObject(bmp);
				DeleteDC(dc);
			}
			else
			{
				RECT& rc = *(RECT*)di.prcBounds;
				TCHAR t[256];
				swprintf(t,L"HK%d,%d-%d",rc.top,rc.left,di.hdcDraw);
				DrawText(di.hdcDraw, /*_T("HK")*/t, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
			}

			
			//Play2();
		}
	}
	return S_OK;
}


BOOL CImageShow::Play2(void)
{
	if( m_hWnd == 0 )
	{
		FireViewChange();
		return TRUE;
	}
	HDC		hDC;
	HDC		hMemDC;
	HDC		hMemDC1;
	HBITMAP hOldBitmap;
	HBITMAP hOldBitmap1;
	HBITMAP hBitmap;
	HBITMAP hPreviousBitmap;
	DWORD   systimer1;
	DWORD   systimer2;
	DWORD   speed;

	m_EndRun = 5;
	if( m_hWnd != 0 ) 
	{
		hDC		= ::GetDC(m_hWnd);
		hMemDC	= ::CreateCompatibleDC(hDC);
		hMemDC1	= ::CreateCompatibleDC(hDC);
		m_hDC	= hDC;
	}else
	{
		hDC		= ::GetDC(m_hWnd);
		hMemDC	= ::CreateCompatibleDC(hDC);
		hMemDC1	= ::CreateCompatibleDC(hDC);
		m_hDC	= hDC;
	}
	
	
	hPreviousBitmap = 0;

	while( m_bLockBitmap );
	m_bLockBitmap = TRUE;

	if( m_hRedrawBitmap != 0 )
		DeleteObject(m_hRedrawBitmap);

	m_hRedrawBitmap = ::CreateCompatibleBitmap(hDC,m_iGifWidth,m_iGifHeight);
	hOldBitmap1     = (HBITMAP)SelectObject(hMemDC1,m_hRedrawBitmap);
	::BitBlt(hMemDC1,0,0,m_iGifWidth,m_iGifHeight,hDC,0,0,SRCCOPY);
	//DrawText(di.hdcDraw, _T("HeKai Gif Control"), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	SelectObject(hMemDC1,hOldBitmap1);
	m_bLockBitmap = FALSE;
	m_iDisposalMethod = DISPOSAL_NOT;
	{
		systimer2 = systimer1 = GetTickCount();
		while( m_bLockBitmap );
		m_bLockBitmap = TRUE;
		hOldBitmap1 = (HBITMAP)SelectObject(hMemDC1,m_hRedrawBitmap);
		//****************************************************
		//Restore Background
		switch( m_iDisposalMethod )
		{
		case DISPOSAL_NO:
			break;
		case DISPOSAL_NOT:
			break;
		case DISPOSAL_RESTBACK:
		case DISPOSAL_RESTORE:
			hOldBitmap = (HBITMAP)SelectObject(hMemDC,hPreviousBitmap);
			::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
			SelectObject(hMemDC,hOldBitmap);
			DeleteObject(hPreviousBitmap);
			hPreviousBitmap = 0;
			break;
		}
		m_iDisposalMethod = DISPOSAL_NO;
		//***************************************************
		//Start Output Image
		hBitmap = NextImage();
		switch(m_iDisposalMethod)
		{
		case DISPOSAL_NO:
			break;
		case DISPOSAL_NOT:
			break;
		case DISPOSAL_RESTBACK:
//			break;
		case DISPOSAL_RESTORE:
			hPreviousBitmap = ::CreateCompatibleBitmap(hDC,m_iWidth,m_iHeight);
			hOldBitmap = (HBITMAP)SelectObject(hMemDC,hPreviousBitmap);
			::BitBlt(hMemDC,0,0,m_iWidth,m_iHeight,hMemDC1,m_iLeft,m_iTop,SRCCOPY);
			SelectObject(hMemDC,hOldBitmap);
			break;
		}
		hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
		if( m_bTransparentIndex )	
		{
			HBITMAP    bmAndBack, bmAndObject;
			HBITMAP    bmBackOld, bmObjectOld;
			HDC        hdcBack, hdcObject;
			COLORREF cColor;
			
			hdcBack		= ::CreateCompatibleDC(hDC);
			hdcObject	= ::CreateCompatibleDC(hDC);
			bmAndBack	= CreateBitmap(m_iWidth,m_iHeight,1,1,NULL);
			bmAndObject	= CreateBitmap(m_iWidth,m_iHeight,1,1,NULL);
			bmBackOld	= (HBITMAP)SelectObject(hdcBack,bmAndBack);
			bmObjectOld	= (HBITMAP)SelectObject(hdcObject,bmAndObject);
			cColor		= SetBkColor(hMemDC,m_TransparentColor);
			::BitBlt(hdcObject,0,0,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
			SetBkColor(hMemDC,cColor);
			::BitBlt(hdcBack,0,0,m_iWidth,m_iHeight,hdcObject,0,0,NOTSRCCOPY);
			::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hdcObject,0,0,SRCAND);
			::BitBlt(hMemDC,0,0,m_iWidth,m_iHeight,hdcBack,0,0,SRCAND);
			::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCPAINT);
			DeleteObject(SelectObject(hdcBack,bmBackOld));
			DeleteObject(SelectObject(hdcObject,bmObjectOld));
			DeleteDC(hdcBack);
			DeleteDC(hdcObject);
		}
		else 
		{
			::BitBlt(hMemDC1,m_iLeft,m_iTop,m_iWidth,m_iHeight,hMemDC,0,0,SRCCOPY);
		}
		SelectObject(hMemDC,hOldBitmap);
		DeleteObject(hBitmap);
		::BitBlt(hDC,0,0,m_iGifWidth,m_iGifHeight,hMemDC1,0,0,SRCCOPY);
		SelectObject(hMemDC1,hOldBitmap1);
		m_bLockBitmap = FALSE;
#if 0
		if( m_iDelayTime != 0 )
			speed = m_iDelayTime*10;
		else speed = m_dwSpeed;
		while( (m_EndRun!=1) && (speed>systimer2-systimer1) )
		{
			Sleep(10);
			systimer2 = GetTickCount();
		}
#endif
	}	
	if( hPreviousBitmap != 0 )
		DeleteObject(hPreviousBitmap);
	DeleteDC(hMemDC);
	DeleteDC(hMemDC1);
	if( m_hWnd != 0 )
		::ReleaseDC(m_hWnd,hDC);
	m_EndRun = 2;
	return TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?