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

📄 beexb_gifview.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
// beexb_gifView.cpp : implementation of the CBeexb_gifView class
//

#include "stdafx.h"
#include "beexb_gif.h"

#include "beexb_gifDoc.h"
#include "beexb_gifView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView

IMPLEMENT_DYNCREATE(CBeexb_gifView, CView)

BEGIN_MESSAGE_MAP(CBeexb_gifView, CView)
	//{{AFX_MSG_MAP(CBeexb_gifView)
	ON_COMMAND(ID_SHOW_GIF, OnShowGif)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView construction/destruction

CBeexb_gifView::CBeexb_gifView()
{
	// TODO: add construction code here

}

CBeexb_gifView::~CBeexb_gifView()
{
}

BOOL CBeexb_gifView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView drawing

void CBeexb_gifView::OnDraw(CDC* pDC)
{
	CBeexb_gifDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView printing

BOOL CBeexb_gifView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CBeexb_gifView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CBeexb_gifView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView diagnostics

#ifdef _DEBUG
void CBeexb_gifView::AssertValid() const
{
	CView::AssertValid();
}

void CBeexb_gifView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CBeexb_gifDoc* CBeexb_gifView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBeexb_gifDoc)));
	return (CBeexb_gifDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBeexb_gifView message handlers
typedef struct gifImage{
	WORD lWidth;
	WORD lHeight;
	WORD width;
	WORD height;
	struct flag{
		BYTE d:3;
		BYTE c:1;
		BYTE b:3;
        BYTE a:1;
	}Flag;
}GifImage,*PGifImage;
#include <math.h>

static UINT GifThread(LPVOID gifDC)
{
	CDC* pdc = (CDC*)gifDC;
	HINSTANCE handle = ::AfxGetResourceHandle();
	HRSRC hrsrc = ::FindResource(handle,MAKEINTRESOURCE(IDR_IMAGE2),"IMAGE");
    DWORD word = ::SizeofResource(handle,hrsrc);
    BYTE* lpBy = (BYTE*)LoadResource(handle,hrsrc);
	BYTE* pByte[20];
	DWORD nu[20];
	int num = 0;
	DWORD firstLocation = 0;
	for(DWORD j=0;j<word;j++)
	{
		if(lpBy[j]==0x2c)
		{
			if(lpBy[j-1]==0x00)
			{
				
				if(num==0)
				{
                    firstLocation = j;
				}
                PGifImage nowImage = (PGifImage)&lpBy[j+1];
				if(nowImage->Flag.a==0)
				{
					DWORD number = 1+sizeof(GifImage);
					while(lpBy[j+number]!=0)
					{
					    number = number+(DWORD)lpBy[j+number]+1;
					}
					number++;
					pByte[num] = new BYTE[number];
					for(DWORD n=0;n<number;n++)
					{
						*(BYTE*)(pByte[num]+n) = lpBy[j+n];
					}
					nu[num] = number;
					j = j+number-1;
					num++;
				}
				else
				{
					int number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2,nowImage->Flag.d));
					while(lpBy[j+number]!=0)
					{
					    number = number+lpBy[j+number];
					}
					pByte[num] = new BYTE[number];
					for(int n=0;n<number;n++)
					{
						*(BYTE*)(pByte[num]+n) = lpBy[j+n];
					}
					nu[num] = number;
					j = j+number-1;
					num++;
				}
			}
		}
	}
	int i = 1;
	while(i)
	{
		for(int m=0;m<num;m++)
		{
			CBrush brush(RGB(255,255,255));
			pdc->FillRect(CRect(0,0,500,500),&brush);
			DWORD DDD;
			VirtualProtect(lpBy,word,PAGE_READWRITE,&DDD);
            for(DWORD n=0;n<nu[m];n++)
			{
				lpBy[firstLocation+n] = *(BYTE*)(pByte[m]+n);
			}
			VirtualProtect(lpBy,word,DDD,NULL);



	        CMemFile file(lpBy,word);
            CArchive ar(&file,CArchive::load|CArchive::bNoFlushOnDelete);
            CArchiveStream arcstream(&ar);
            CComQIPtr<IPicture> m_picture;
			HRESULT hr = OleLoadPicture((LPSTREAM)&arcstream,0,false,IID_IPicture,(void**)&m_picture);
			long a,b;
			m_picture->get_Width(&a);
			m_picture->get_Height(&b);
			CSize sz(a,b);
			pdc->HIMETRICtoDP(&sz);
			CRect rect;
			m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
			Sleep(100);
		}
	}
	return 1;
}

void CBeexb_gifView::OnShowGif() 
{
	static BOOL bIsRunning = FALSE;
	if(!bIsRunning)
	{
		CDC* pdc = GetDC();
		m_gifDC = new CDC;
		m_gifDC->Attach(pdc->GetSafeHdc());
		AfxBeginThread(GifThread,(LPVOID)m_gifDC);
		bIsRunning = TRUE;
	}
}

⌨️ 快捷键说明

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