亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pictureex.cpp

?? 網絡游戲建模書的源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
	if (m_hDispMemDC)
	{
		SelectObject(m_hDispMemDC,m_hDispOldBM);
		::DeleteDC(m_hDispMemDC);
		::DeleteObject(m_hDispMemBM);
		m_hDispMemDC  = NULL;
		m_hDispMemBM = NULL;
	};

	SetRect(&m_PaintRect,0,0,0,0);
	m_pGIFLSDescriptor = NULL;
	m_pGIFHeader	   = NULL;
	m_pRawData		   = NULL;
	m_hThread		   = NULL;
	m_bIsInitialized   = FALSE;
	m_bExitThread	   = FALSE;
	m_bIsGIF		   = FALSE;
	m_clrBackground    = RGB(255,255,255); // white by default
	m_nGlobalCTSize	   = 0;
	m_nCurrOffset	   = 0;
	m_nCurrFrame	   = 0;
	m_nDataSize		   = 0;
}

BOOL CPictureEx::Draw()
{
	if (!m_bIsInitialized)
	{
		TRACE(_T("Call one of the CPictureEx::Load() member functions before calling Draw()\n"));
		return FALSE;
	};

	if (IsAnimatedGIF())
	{
	// the picture needs animation
	// we'll start the thread that will handle it for us
	
		unsigned int nDummy;
		m_hThread = (HANDLE) _beginthreadex(NULL,0,_ThreadAnimation,this,
			CREATE_SUSPENDED,&nDummy);
		if (!m_hThread)
		{
			TRACE(_T("Draw: Couldn't start a GIF animation thread\n"));
			return FALSE;
		} 
		else 
			ResumeThread(m_hThread);
	} 
	else
	{
		if (m_pPicture)
		{
			long hmWidth;
			long hmHeight;
			m_pPicture->get_Width(&hmWidth);
			m_pPicture->get_Height(&hmHeight);
			if (m_pPicture->Render(m_hMemDC, 0, 0, m_PictureSize.cx, m_PictureSize.cy, 
				0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)
			{
				Invalidate(FALSE);
				return TRUE;
			};
		};
	};

	return FALSE;	
}

SIZE CPictureEx::GetSize() const
{
	return m_PictureSize;
}

BOOL CPictureEx::Load(LPCTSTR szFileName)
{
	ASSERT(szFileName);
	
	CFile file;
	HGLOBAL hGlobal;
	DWORD dwSize;

	if (!file.Open(szFileName,
				CFile::modeRead | 
				CFile::shareDenyWrite) )
	{
		TRACE(_T("Load (file): Error opening file %s\n"),szFileName);
		return FALSE;
	};

	dwSize = file.GetLength();
	hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwSize);
	if (!hGlobal)
	{
		TRACE(_T("Load (file): Error allocating memory\n"));
		return FALSE;
	};
	
	char *pData = reinterpret_cast<char*>(GlobalLock(hGlobal));
	if (!pData)
	{
		TRACE(_T("Load (file): Error locking memory\n"));
		GlobalFree(hGlobal);
		return FALSE;
	};

	TRY
	{
		file.Read(pData,dwSize);
	}
	CATCH(CFileException, e);                                          
	{
		TRACE(_T("Load (file): An exception occured while reading the file %s\n"),
			szFileName);
		GlobalFree(hGlobal);
		e->Delete();
		file.Close();
		return FALSE;
	}
	END_CATCH
	GlobalUnlock(hGlobal);
	file.Close();

	BOOL bRetValue = Load(hGlobal,dwSize);
	GlobalFree(hGlobal);
	return bRetValue;
}

BOOL CPictureEx::Load(LPCTSTR szResourceName, LPCTSTR szResourceType)
{
	ASSERT(szResourceName);
	ASSERT(szResourceType);

	HRSRC hPicture = FindResource(AfxGetResourceHandle(),szResourceName,szResourceType);
	HGLOBAL hResData;
	if (!hPicture || !(hResData = LoadResource(AfxGetResourceHandle(),hPicture)))
	{
		TRACE(_T("Load (resource): Error loading resource %s\n"),szResourceName);
		return FALSE;
	};
	DWORD dwSize = SizeofResource(AfxGetResourceHandle(),hPicture);

	// hResData is not the real HGLOBAL (we can't lock it)
	// let's make it real

	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwSize);
	if (!hGlobal)
	{
		TRACE(_T("Load (resource): Error allocating memory\n"));
		FreeResource(hResData);
		return FALSE;
	};
	
	char *pDest = reinterpret_cast<char *> (GlobalLock(hGlobal));
	char *pSrc = reinterpret_cast<char *> (LockResource(hResData));
	if (!pSrc || !pDest)
	{
		TRACE(_T("Load (resource): Error locking memory\n"));
		GlobalFree(hGlobal);
		FreeResource(hResData);
		return FALSE;
	};
	CopyMemory(pDest,pSrc,dwSize);
	FreeResource(hResData);
	GlobalUnlock(hGlobal);

	BOOL bRetValue = Load(hGlobal,dwSize);
	GlobalFree(hGlobal);
	return bRetValue;
}

void CPictureEx::ResetDataPointer()
{
	// skip header and logical screen descriptor
	m_nCurrOffset = 
		sizeof(TGIFHeader)+sizeof(TGIFLSDescriptor)+m_nGlobalCTSize;
}

BOOL CPictureEx::SkipNextGraphicBlock()
{
	if (!m_pRawData) return FALSE;

	// GIF header + LSDescriptor [+ GCT] [+ Control block] + Data

	enum GIFBlockTypes nBlock;

	nBlock = GetNextBlock();

	while ((nBlock != BLOCK_CONTROLEXT) &&
		   (nBlock != BLOCK_IMAGE) &&
		   (nBlock != BLOCK_PLAINTEXT) &&
		   (nBlock != BLOCK_UNKNOWN) &&
		   (nBlock != BLOCK_TRAILER) )
	{
		if (!SkipNextBlock()) return NULL;
		nBlock = GetNextBlock();
	};

	if ((nBlock == BLOCK_UNKNOWN) ||
		(nBlock == BLOCK_TRAILER))
		return FALSE;

	// it's either a control ext.block, an image or a plain text

	if (GetNextBlockLen() <= 0) return FALSE;

	if (nBlock == BLOCK_CONTROLEXT)
	{
		if (!SkipNextBlock()) return FALSE;
		nBlock = GetNextBlock();

		// skip everything until we meet an image block or a plain-text block
		while ((nBlock != BLOCK_IMAGE) &&
			   (nBlock != BLOCK_PLAINTEXT) &&
			   (nBlock != BLOCK_UNKNOWN) &&
			   (nBlock != BLOCK_TRAILER) )
		{
			if (!SkipNextBlock()) return NULL;
			nBlock = GetNextBlock();
		};

		if ((nBlock == BLOCK_UNKNOWN) ||
			(nBlock == BLOCK_TRAILER))
			return FALSE;
	};

	// skip the found data block (image or plain-text)
	if (!SkipNextBlock()) return FALSE;

	return TRUE;
}

UINT CPictureEx::GetSubBlocksLen(UINT nStartingOffset) const
{
	UINT nRet = 0;
	UINT nCurOffset = nStartingOffset;
	
	while (m_pRawData[nCurOffset] != 0)
	{
		nRet += m_pRawData[nCurOffset]+1;
		nCurOffset += m_pRawData[nCurOffset]+1;
	};

	return nRet+1;
}

enum CPictureEx::GIFBlockTypes CPictureEx::GetNextBlock() const
{
	switch(m_pRawData[m_nCurrOffset])
	{
	case 0x21:
	// extension block
		switch(m_pRawData[m_nCurrOffset+1])
		{
		case 0x01:
		// plain text extension
			return BLOCK_PLAINTEXT;
			break;

		case 0xF9:
		// graphic control extension
			return BLOCK_CONTROLEXT;
			break;

		case 0xFE:
		// comment extension
			return BLOCK_COMMEXT;
			break;

		case 0xFF:
		// application extension
			return BLOCK_APPEXT;
			break;
		};
		break;
	
	case 0x3B:
	// trailer
		return BLOCK_TRAILER;
		break;

	case 0x2C:
	// image data
		return BLOCK_IMAGE;
		break;
	};

	return BLOCK_UNKNOWN;
}

BOOL CPictureEx::SkipNextBlock()
{
	if (!m_pRawData) return FALSE;

	int nLen = GetNextBlockLen();
	if ((nLen <= 0) || ((m_nCurrOffset+nLen) > m_nDataSize))
		return FALSE;

	m_nCurrOffset += nLen;
	return TRUE;
}

int CPictureEx::GetNextBlockLen() const
{
	GIFBlockTypes nBlock = GetNextBlock();

	int nTmp;

	switch(nBlock)
	{
	case BLOCK_UNKNOWN:
		return -1;
		break;

	case BLOCK_TRAILER:
		return 1;
		break;

	case BLOCK_APPEXT:
		nTmp = GetSubBlocksLen(m_nCurrOffset+sizeof(TGIFAppExtension));
		if (nTmp > 0)
			return sizeof(TGIFAppExtension)+nTmp;
		break;

	case BLOCK_COMMEXT:
		nTmp = GetSubBlocksLen(m_nCurrOffset+sizeof(TGIFCommentExt));
		if (nTmp > 0)
			return sizeof(TGIFCommentExt)+nTmp;
		break;

	case BLOCK_CONTROLEXT:
		return sizeof(TGIFControlExt);
		break;

	case BLOCK_PLAINTEXT:
		nTmp = GetSubBlocksLen(m_nCurrOffset+sizeof(TGIFPlainTextExt));
		if (nTmp > 0)
			return sizeof(TGIFPlainTextExt)+nTmp;
		break;

	case BLOCK_IMAGE:
		TGIFImageDescriptor *pIDescr = 
			reinterpret_cast<TGIFImageDescriptor *> (&m_pRawData[m_nCurrOffset]);
		int nLCTSize = (int)
			(pIDescr->GetPackedValue(ID_PACKED_LOCALCT)*3*
			(1 << (pIDescr->GetPackedValue(ID_PACKED_LOCALCTSIZE)+1)));

		int nTmp = GetSubBlocksLen(m_nCurrOffset+
			sizeof(TGIFImageDescriptor) + nLCTSize + 1);
		if (nTmp > 0)
			return sizeof(TGIFImageDescriptor) + nLCTSize + 1 + nTmp;
		break;
	};

	return 0;
}

UINT WINAPI CPictureEx::_ThreadAnimation(LPVOID pParam)
{
	ASSERT(pParam);
	CPictureEx *pPic = reinterpret_cast<CPictureEx *> (pParam);

	pPic->m_bIsPlaying = TRUE;
	pPic->ThreadAnimation();
	pPic->m_bIsPlaying = FALSE;

	// this thread has finished its work so we close the handle
	CloseHandle(pPic->m_hThread); 
	// and init the handle to zero (so that Stop() doesn't Wait on it)
	pPic->m_hThread = 0;
	return 0;
}

void CPictureEx::ThreadAnimation()
{
	// first, restore background (for stop/draw support)
	// disposal method #2
	if (m_arrFrames[m_nCurrFrame].m_nDisposal == 2)
	{
		HBRUSH hBrush = CreateSolidBrush(m_clrBackground);
		if (hBrush)
		{
			RECT rect = {
				m_arrFrames[m_nCurrFrame].m_frameOffset.cx,
				m_arrFrames[m_nCurrFrame].m_frameOffset.cy,
				m_arrFrames[m_nCurrFrame].m_frameOffset.cx + m_arrFrames[m_nCurrFrame].m_frameSize.cx,
				m_arrFrames[m_nCurrFrame].m_frameOffset.cy + m_arrFrames[m_nCurrFrame].m_frameSize.cy };
			FillRect(m_hMemDC,&rect,hBrush);
			DeleteObject(hBrush);
		};
	} 
	else
		// disposal method #3
		if (m_hDispMemDC && (m_arrFrames[m_nCurrFrame].m_nDisposal == 3) )
		{
			// put it back
			BitBlt(m_hMemDC,
				m_arrFrames[m_nCurrFrame].m_frameOffset.cx,
				m_arrFrames[m_nCurrFrame].m_frameOffset.cy,
				m_arrFrames[m_nCurrFrame].m_frameSize.cx,
				m_arrFrames[m_nCurrFrame].m_frameSize.cy,
				m_hDispMemDC,0,0, SRCCOPY);
			// init variables
			SelectObject(m_hDispMemDC,m_hDispOldBM);
			DeleteDC(m_hDispMemDC); m_hDispMemDC = NULL;
			DeleteObject(m_hDispMemBM); m_hDispMemBM = NULL;
		};

	while (!m_bExitThread)
	{
		if (m_arrFrames[m_nCurrFrame].m_pPicture)
		{
		///////////////////////////////////////////////////////
		// Before rendering a frame we should take care of what's 
		// behind that frame. TFrame::m_nDisposal will be our guide:
		//   0 - no disposal specified (do nothing)
		//   1 - do not dispose (again, do nothing)
		//   2 - restore to background color (m_clrBackground)
		//   3 - restore to previous

			//////// disposal method #3
			if (m_arrFrames[m_nCurrFrame].m_nDisposal == 3)
			{
				// prepare a memory DC and store the background in it
				m_hDispMemDC = CreateCompatibleDC(m_hMemDC);
				m_hDispMemBM = CreateCompatibleBitmap(m_hMemDC,
							m_arrFrames[m_nCurrFrame].m_frameSize.cx,
							m_arrFrames[m_nCurrFrame].m_frameSize.cy);
				
				if (m_hDispMemDC && m_hDispMemBM)
				{
					m_hDispOldBM = reinterpret_cast<HBITMAP> (SelectObject(m_hDispMemDC,m_hDispMemBM));
					BitBlt(m_hDispMemDC,0,0,
						m_arrFrames[m_nCurrFrame].m_frameSize.cx,
						m_arrFrames[m_nCurrFrame].m_frameSize.cy,
						m_hMemDC,
						m_arrFrames[m_nCurrFrame].m_frameOffset.cx,
						m_arrFrames[m_nCurrFrame].m_frameOffset.cy,
						SRCCOPY);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 中文字幕成人av| 亚洲精品视频在线| 国产一区二区三区久久久 | 亚洲影视在线播放| 国产高清精品在线| 欧美一区二区性放荡片| 尤物视频一区二区| 国产91富婆露脸刺激对白| 欧美一区二区三区在线观看| 亚洲免费观看高清完整版在线观看 | 蜜臀精品久久久久久蜜臀| 91美女在线观看| 国产日韩影视精品| 毛片基地黄久久久久久天堂| 欧美亚洲一区二区在线观看| 亚洲女女做受ⅹxx高潮| 国产成人日日夜夜| 精品国产成人在线影院 | 欧美日韩国产免费| 亚洲欧美日韩人成在线播放| 国产成+人+日韩+欧美+亚洲| 精品少妇一区二区三区视频免付费| 一区二区成人在线| 99精品国产99久久久久久白柏 | 日韩欧美国产一二三区| 五月婷婷久久丁香| 欧美精品一二三四| 日韩中文字幕一区二区三区| 欧美日韩国产天堂| 日本中文一区二区三区| 日韩一区二区三区四区| 青青草97国产精品免费观看| 日韩丝袜情趣美女图片| 激情欧美一区二区三区在线观看| 欧美一区三区二区| 国产呦萝稀缺另类资源| 久久精品视频一区| 福利一区在线观看| 亚洲精品视频在线看| 欧美亚洲国产怡红院影院| 亚洲在线观看免费视频| 这里只有精品99re| 欧美bbbbb| 国产日韩欧美电影| 日本国产一区二区| 婷婷综合另类小说色区| 日韩一区二区免费视频| 国产精品99久久不卡二区| 中文字幕在线观看一区| 欧美综合一区二区| 日韩精品欧美成人高清一区二区| 欧美不卡123| youjizz国产精品| 亚洲国产日韩在线一区模特| 9191久久久久久久久久久| 国产一区二区精品久久99| 国产精品盗摄一区二区三区| 欧美视频在线一区| 国产在线视频不卡二| 成人免费在线播放视频| 欧美四级电影在线观看| 精品午夜久久福利影院| 亚洲欧美日韩国产手机在线| 欧美日韩免费一区二区三区视频| 久久狠狠亚洲综合| 最新热久久免费视频| 欧美老人xxxx18| 波多野结衣在线一区| 三级精品在线观看| 国产精品乱码一区二三区小蝌蚪| 欧美性猛交xxxx黑人交| 国产精品一区久久久久| 亚洲成人精品影院| 久久久国际精品| 欧美一三区三区四区免费在线看| 国产成人精品影视| 美女免费视频一区| 一区二区三区.www| 国产精品国产自产拍高清av| 91精品国产综合久久久久久| 色综合色综合色综合色综合色综合| 蜜芽一区二区三区| 亚洲电影在线免费观看| 国产精品的网站| 国产亚洲欧美日韩俺去了| 91.麻豆视频| 欧美在线免费观看视频| 99久久婷婷国产精品综合| 国产精品538一区二区在线| 亚洲电影你懂得| 亚洲欧美日韩综合aⅴ视频| 国产午夜精品一区二区三区嫩草 | 亚洲欧洲制服丝袜| 国产亚洲女人久久久久毛片| 日韩一级二级三级精品视频| 99久久免费国产| 成人美女视频在线看| 激情综合色播激情啊| 免费欧美日韩国产三级电影| 一区二区三区久久| 亚洲欧美激情视频在线观看一区二区三区| 欧美www视频| 欧美一区二区三区日韩| 欧美日韩精品一区二区三区蜜桃| 91福利区一区二区三区| 91在线观看下载| 99久久久久久99| 91网站黄www| 色狠狠av一区二区三区| 99精品视频在线观看| 成年人国产精品| av资源站一区| 色悠悠亚洲一区二区| av在线不卡电影| 91小视频在线免费看| 成人av免费在线观看| 91亚洲精品久久久蜜桃网站| 99久久综合精品| 日本高清免费不卡视频| 在线观看免费成人| 欧美日韩三级一区| 日韩欧美亚洲国产另类| 日韩免费一区二区三区在线播放| 欧美一区二区不卡视频| 日韩欧美精品在线视频| 久久精品亚洲精品国产欧美 | 久久久国产一区二区三区四区小说 | 日韩二区在线观看| 精品综合免费视频观看| 国产成人在线看| 97久久精品人人做人人爽50路| 99精品国产91久久久久久| 欧美色老头old∨ideo| 在线播放国产精品二区一二区四区 | 亚洲久草在线视频| 日韩主播视频在线| 国产伦精品一区二区三区免费| heyzo一本久久综合| 欧美色爱综合网| 日韩亚洲欧美一区二区三区| 久久色.com| 亚洲理论在线观看| 免费人成在线不卡| 9i看片成人免费高清| 欧美日韩另类一区| 久久精品男人天堂av| 亚洲国产美女搞黄色| 裸体一区二区三区| proumb性欧美在线观看| 欧美精品乱码久久久久久按摩| 久久综合狠狠综合久久综合88| 亚洲色图都市小说| 狠狠色伊人亚洲综合成人| www.日韩精品| 欧美成人aa大片| 亚洲午夜精品17c| 国产成人av一区二区三区在线 | 中文字幕一区av| 麻豆91在线观看| 欧美伊人精品成人久久综合97| 久久免费看少妇高潮| 亚洲成av人综合在线观看| 成人精品鲁一区一区二区| 欧美理论电影在线| 亚洲欧美激情视频在线观看一区二区三区 | 在线观看91精品国产入口| 精品国产91九色蝌蚪| 亚洲国产精品一区二区久久 | 亚洲乱码国产乱码精品精可以看| 久久成人精品无人区| 欧美三级三级三级| 中文字幕一区二区三区在线观看| 免费欧美日韩国产三级电影| 欧美调教femdomvk| 国产精品毛片大码女人| 国产精品一级在线| 精品久久久久久无| 日日夜夜免费精品| 欧美体内she精视频| 成人欧美一区二区三区| 国产成人一区在线| 欧美岛国在线观看| 日本最新不卡在线| 欧美日韩一级黄| 亚洲电影一区二区三区| 一本久道久久综合中文字幕| 国产女主播视频一区二区| 国产一区 二区| 久久中文字幕电影| 国产最新精品免费| 久久久精品黄色| 国产精品91一区二区| 久久精品网站免费观看| 国产精品一区专区| 欧美国产精品中文字幕| 国产91精品入口| 亚洲欧洲日韩在线| 91麻豆国产在线观看| 亚洲精品va在线观看|