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 + -
显示快捷键?