www.gusucode.com > VC++窗口背景图透明度渐变示例-源码程序 > VC++窗口背景图透明度渐变示例-源码程序/code/GradualChangeView.cpp

    // GradualChangeView.cpp : implementation of the CGradualChangeView class
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "GradualChange.h"

#include "GradualChangeDoc.h"
#include "GradualChangeView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGradualChangeView

IMPLEMENT_DYNCREATE(CGradualChangeView, CView)

BEGIN_MESSAGE_MAP(CGradualChangeView, CView)
	//{{AFX_MSG_MAP(CGradualChangeView)
	ON_COMMAND(ID_MYPLAY, OnMyplay)
	ON_WM_TIMER()
	ON_COMMAND(ID_MYSTOP, OnMystop)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGradualChangeView construction/destruction

CGradualChangeView::CGradualChangeView()
{
	// TODO: add construction code here
	m_pb1 = NULL;
	m_pb2 = NULL;
	m_pb3 = NULL;
}

CGradualChangeView::~CGradualChangeView()
{
	//如果没有正常释放堆空间则在程序退出前释放之
	if(m_pb1 != NULL)
	{
		free(m_pb1);
	}
	if(m_pb2 != NULL)
	{
		free(m_pb2);
	}
	if(m_pb3 != NULL)
	{
		free(m_pb3);
	}
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGradualChangeView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CGradualChangeView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGradualChangeView message handlers

void CGradualChangeView::OnMyplay() 
{
	// TODO: Add your command handler code here
	if(m_pb1 == NULL)
	{
		//初始化工作,m_nCase为1表示当前要演示第一幅图片的淡入
		m_nCount = 0;
		m_nCase = 1;

		//读取bmp文件头信息
		CFile f1, f2;
		f1.Open("bmp1.bmp", CFile::modeRead, NULL);
		f1.Seek(14, CFile::begin);
		f1.Read(&m_header, 40);
		f2.Open("bmp2.bmp", CFile::modeRead, NULL);
		f2.Seek(14, CFile::begin);
		f2.Read(&m_header, 40);

		//动态分配空间,定义宏#define BMP_SIZE 1440000
		m_pb1 = (BYTE *)malloc(BMP_SIZE);
		m_pb2 = (BYTE *)malloc(BMP_SIZE);
		m_pb3 = (BYTE *)malloc(BMP_SIZE);
	
		//读取bmp文件的数据区数据
		f1.ReadHuge(m_pb1, BMP_SIZE);
		f1.Close();
		f2.ReadHuge(m_pb2, BMP_SIZE);
		f2.Close();

		//开启计时器,命名为1,每100毫秒中断一次
		SetTimer(1, 100, NULL);
	}
}

void CGradualChangeView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	//还没有显示第二幅图片则显示第二幅图片
	if(m_nCount >= 64 && m_nCase == 1)
	{
		m_nCase = 2;
		m_nCount = 0;
	}
	//两幅图片都显示过了
	else if( m_nCount >= 64 && m_nCase == 3)
	{
		OnMystop();
		MessageBox("演示完毕", "完毕", MB_OK);
	}
	else
	{
		//显示第一幅图片
		if(m_nCase == 1)
		{
			m_nCount++;
			for(int i = 0; i < BMP_SIZE; i++)
				m_pb3[i] = m_nCount * m_pb1[i]/64;

			StretchDIBits(GetDC()->m_hDC, 0, 0, 800, 600, 0, 0, 800, 600, m_pb3, 
							((BITMAPINFO*)(&m_header)), DIB_RGB_COLORS, SRCCOPY);
		
		}
	
		else if(m_nCase == 2)
		{
			//显示第二幅图片,并消隐第一幅图片
			m_nCount++;
			for(int i = 0; i < BMP_SIZE; i++)
				m_pb3[i] = ((64 - m_nCount) * m_pb1[i] + m_nCount * m_pb2[i]) / 64;

			StretchDIBits(GetDC()->m_hDC, 0, 0, 800, 600, 0, 0, 800, 600, m_pb3, 
							((BITMAPINFO*)(&m_header)), DIB_RGB_COLORS, SRCCOPY);

			//如果完全消隐了,m_nCase值变为3
			if(m_nCount >= 64)
				m_nCase = 3;
		}
	}
}

void CGradualChangeView::OnMystop() 
{
	// TODO: Add your command handler code here

	//释放堆空间
	if(m_pb1 != NULL)
	{
		free(m_pb1);
		m_pb1 = NULL;
	}
	if(m_pb2 != NULL)
	{
		free(m_pb2);
		m_pb2 = NULL;
	}
	if(m_pb3 != NULL)
	{
		free(m_pb3);
		m_pb3 = NULL;
	}

	//关闭计时器
	KillTimer(1);
}