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

📄 imagefadetwoview.cpp

📁 visual c++数字图像与图形处理中的光盘内容
💻 CPP
字号:
// ImageFadeTwoView.cpp : implementation of the CImageFadeTwoView class
//

#include "stdafx.h"
#include "ImageFadeTwo.h"

#include "ImageFadeTwoDoc.h"
#include "ImageFadeTwoView.h"

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

#include "BorderRect.h"
#include "ImageProcess.h"

/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView

IMPLEMENT_DYNCREATE(CImageFadeTwoView,  CView)

BEGIN_MESSAGE_MAP(CImageFadeTwoView,  CView)
	//{{AFX_MSG_MAP(CImageFadeTwoView)
	ON_WM_CREATE()
	ON_COMMAND(IDM_BRUSH_FADE_IN,  OnBrushFadeIn)
	ON_UPDATE_COMMAND_UI(IDM_BRUSH_FADE_IN,  OnUpdateBrushFadeIn)
	ON_COMMAND(IDM_BRUSH_FADE_OUT,  OnBrushFadeOut)
	ON_UPDATE_COMMAND_UI(IDM_BRUSH_FADE_OUT,  OnUpdateBrushFadeOut)
	ON_COMMAND(IDM_BITMAP_FADE_IN,  OnBitmapFadeIn)
	ON_UPDATE_COMMAND_UI(IDM_BITMAP_FADE_IN,  OnUpdateBitmapFadeIn)
	ON_COMMAND(IDM_BITMAP_FADE_OUT,  OnBitmapFadeOut)
	ON_UPDATE_COMMAND_UI(IDM_BITMAP_FADE_OUT,  OnUpdateBitmapFadeOut)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView construction/destruction

CImageFadeTwoView::CImageFadeTwoView()
{
	// TODO: add construction code here
	m_nWay = 0;

}

CImageFadeTwoView::~CImageFadeTwoView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView drawing

void CImageFadeTwoView::OnDraw(CDC* pDC)
{
	CImageFadeTwoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	BeginWaitCursor();
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
	
	CRect clientRect;
	GetClientRect(&clientRect);

	int cx = clientRect.Width();
	int cy = clientRect.Height();

	pDC->BitBlt(0, 0, cx, cy, &memDC, 0, 0, SRCCOPY);	
	memDC.SelectObject(pOldBitmap);
	EndWaitCursor();

	FadeInOut(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageFadeTwoView message handlers

int CImageFadeTwoView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	//打开文件
	CDib* pBackDib = new CDib("back.bmp");

	if (!pBackDib->IsValid())
		MessageBox("文件打开出错", "文件 \"back.bmp\"", 
			MB_OK | MB_ICONEXCLAMATION);

	//
	CClientDC dc(this);

	m_bitmap.CreateCompatibleBitmap(&dc, 800, 600);

	CDC memDC;
	memDC.CreateCompatibleDC(&dc);

	CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);
	CBrush* pBrush = new CBrush(RGB(255, 255, 255));
	CRect rect(0, 0, 800, 600);
	memDC.FillRect(rect, pBrush);

	//绘制背景位图
	if (pBackDib)
	{
		BYTE* pBackDibData = pBackDib->GetDibData();
		LPBITMAPINFO pBackBmpInfo = pBackDib->GetBmpInfo();
		int nWidth = (int)pBackDib->GetWidth();
		int nHeight = (int)pBackDib->GetHeight();
		StretchDIBits(memDC.m_hDC,  0,  0,  nWidth,  nHeight, 
			0,  0,  nWidth,  nHeight,  pBackDibData,  pBackBmpInfo, 
			DIB_RGB_COLORS,  SRCCOPY);
	}
	memDC.SelectObject(pOldBitmap);
	delete pBrush;	
	ReleaseDC(&dc);

	if (pBackDib)
	{
		delete pBackDib;
		pBackDib = NULL;
	}
	
	return 0;
}

void CImageFadeTwoView::Delay(DWORD ms)
{
	DWORD time = GetTickCount();
	do{;}while((GetTickCount() - time) < ms);
}


void CImageFadeTwoView::FadeInOut(CDC *pDC)
{
	CImageFadeTwoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	//第一步, 获取在文档中已经打开的位图
	//获取外部DIB信息
	CDib* pDib = pDoc->m_pDib;
	if(!pDib)return;


	int nWidth = (int)pDib->GetWidth();
	int nHeight = (int)pDib->GetHeight();

	CRect clientRect;
	GetClientRect(&clientRect);

	//左上角点
	int cx = clientRect.Width();
	int cy = clientRect.Height();

	cx = (cx - nWidth) / 2;
	cy = (cy - nHeight) / 2;

	//绘制一个内嵌框
	CBorderRect br(cx - 2, cy - 2, nWidth + 4, nHeight + 4);
	br.SetBkColor(RGB(0, 0, 0));
	br.Draw(pDC, FALSE);


	//位图刷子淡入
	if(m_nWay == 0)
	{
		HBRUSH ahBrush[16];
		CreateBitmapBrush(pDC, ahBrush);
		for(int i = 0;i < 16;i++)
		{
			CBrush* pBrush = new CBrush();
			CBrush* pOldBrush = pDC->SelectObject(pBrush->FromHandle(ahBrush[i]));
			pDib->Draw(pDC->m_hDC, cx, cy, nWidth, nHeight, 
						0, 0, nWidth, nHeight, DIB_RGB_COLORS, MERGECOPY);
			pDC->SelectObject(pOldBrush);
			delete pBrush;
			Delay(30);
		}
	}
	//位图刷子淡出
	else if(m_nWay == 1)
	{
		HBRUSH ahBrush[16];
		CreateBitmapBrush(pDC, ahBrush);
		for(int i = 0;i < 16;i++)
		{
			CBrush* pBrush = new CBrush();
			CBrush* pOldBrush = pDC->SelectObject(pBrush->FromHandle(ahBrush[(15 - i)]));
			pDib->Draw(pDC->m_hDC, cx, cy, nWidth, nHeight, 
						0, 0, nWidth, nHeight, DIB_RGB_COLORS, MERGECOPY);
			pDC->SelectObject(pOldBrush);
			delete pBrush;
			Delay(30);
		}
		CRect rect(cx, cy, (cx + nWidth - 1), (cy + nHeight - 1));
		pDC->FillRect(rect, new CBrush(RGB(0, 0, 0)));

	}

	else if(m_nWay == 2)
	{
		HBITMAP ahBitmap[16];
		CreateRandBitmap(pDC, ahBitmap);
		 
		for(int i = 0;i < 16;i++)
		{
			//申明内存设备
			CBitmap bitmap;
			bitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
			CDC memDC;
			memDC.CreateCompatibleDC(pDC);
			CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
			
			//将图像绘制于内存设备
			pDib->Draw(memDC.m_hDC, 0, 0, nWidth, nHeight, 
						0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCCOPY);

			//将位图与结合起来
			AndBitmap(&memDC, nWidth, nHeight,  ahBitmap[i]);
			pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
			bitmap.DeleteObject();
			memDC.SelectObject(pOldBitmap);
			Delay(30);
		}
	}
	else 
	{
		HBITMAP ahBitmap[16];
		CreateRandBitmap(pDC, ahBitmap);
		 
		for(int i = 0;i < 16;i++)
		{
			//申明内存设备
			CBitmap bitmap;
			bitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
			CDC memDC;
			memDC.CreateCompatibleDC(pDC);
			CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
			
			//将图像绘制于内存设备
			pDib->Draw(memDC.m_hDC, 0, 0, nWidth, nHeight, 
						0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCCOPY);

			//将位图与结合起来
			AndBitmap(&memDC, nWidth, nHeight,  ahBitmap[(15 - i)]);
			pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
			bitmap.DeleteObject();
			memDC.SelectObject(pOldBitmap);

			Delay(30);
		}
		CRect rect(cx, cy, (cx + nWidth - 1), (cy + nHeight - 1));
		pDC->FillRect(rect, new CBrush(RGB(0, 0, 0)));

	}

}

//创建灰阶位图刷子, 
//刷子大小为8 * 8像素
//一共16个刷子, 
//这些具体的数据都是程序固定的, 因为刷子的大小总是固定的
void CImageFadeTwoView::CreateBitmapBrush(CDC* pDC, HBRUSH* phBrush)
{
	int anIndex[64];
	CreateRandSequence(anIndex, 64);

	CImageProcess* ig = new CImageProcess();
	BYTE* pbyBrush = new BYTE[256];
	memset(pbyBrush, 0, 256);
	
	for(int i = 0;i < 16;i++)
	{
		int nBase = 4 * i;
		for(int j = 0;j < 4; j++)
		{
			BYTE* pbyTemp = pbyBrush;
			int n = nBase + j;
			pbyTemp += (4 * anIndex[n]);

			*pbyTemp++ = 255;
			*pbyTemp++ = 255;
			*pbyTemp++ = 255;
		}

		HBITMAP hBitmap = ig->CreateDdb(pDC->m_hDC, 8, 8, pbyBrush);
		phBrush[i] = CreatePatternBrush(hBitmap);

	}//end i
	delete ig;
	delete[] pbyBrush;
}

//创建随机序列
//目前能产生的最大序列长度为32767
void CImageFadeTwoView::CreateRandSequence(int *pnArray,  int nSize)
{
	srand((unsigned)time(NULL));
	int* pnRand = new int[nSize];
	int i;
	for(i = 0;i < nSize;i++) pnRand[i] = rand();

	//最大随机数为RAND_MAX (now = 32767);
	int nMaxRand = RAND_MAX + 1;

	for(i = 0;i < nSize;i++)
	{
		int nIndex = 0;
		int nMin = RAND_MAX;
		for(int j = 0;j < nSize;j++)
		{
			if(pnRand[j] < nMin)
			{
				nIndex = j;
				nMin = pnRand[j];
			}
		}
		pnRand[nIndex] = nMaxRand;
		pnArray[i] = nIndex;
	}
	delete[] pnRand;
}


//位图大小为 16 * 16
//位图
//共16幅
void CImageFadeTwoView::CreateRandBitmap(CDC *pDC,  HBITMAP *phBitmap)
{

	int anIndex[256];
	CreateRandSequence(anIndex, 256);

	CImageProcess* ig = new CImageProcess();
	BYTE* pbyBitmap = new BYTE[1024];
	memset(pbyBitmap, 0, 1024);
	
	for(int i = 0;i < 16;i++)
	{
		int nBase = 16 * i;
		for(int j = 0;j < 16; j++)
		{
			BYTE* pbyTemp = pbyBitmap;
			int n = nBase + j;
			pbyTemp += (4 * anIndex[n]);

			*pbyTemp++ = 255;
			*pbyTemp++ = 255;
			*pbyTemp++ = 255;
		}

		phBitmap[i] = ig->CreateDdb(pDC->m_hDC, 16, 16, pbyBitmap);

	}//end i
	delete ig;
	delete[] pbyBitmap;
}

//进行逻辑与运算
//pMemDC----内存设备
//nWidth, nHeight ----- 与内存设备绑定的设备相关位图的大小
//hBitmap总为一个16 * 16 大小的32位位图

void CImageFadeTwoView::AndBitmap(CDC *pMemDC, int nWidth,  int nHeight,  HBITMAP hBitmap)
{
	//申明内存设备
	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap(pMemDC, 16, 16);
	CDC memDC;
	memDC.CreateCompatibleDC(pMemDC);
	HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);

	int nBlockWidth = (nWidth + 15) / 16;
	int nBlockHeight = (nHeight + 15) / 16;

	int y = 0;
	for(int i = 0;i < nBlockHeight;i++)
	{
		int x = 0;
		for(int j = 0;j < nBlockWidth;j++)
		{
			pMemDC->BitBlt(x, y, 16, 16, &memDC, 0, 0, SRCAND);
			x += 16;
		}
		y += 16;
	}
	bitmap.DeleteObject();
	memDC.SelectObject(hOldBitmap);
}


void CImageFadeTwoView::OnBrushFadeIn() 
{
	// TODO: Add your command handler code here
	m_nWay = 0;
	Invalidate();
}

void CImageFadeTwoView::OnUpdateBrushFadeIn(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_nWay == 0)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

void CImageFadeTwoView::OnBrushFadeOut() 
{
	// TODO: Add your command handler code here
	m_nWay = 1;
	Invalidate();
	
}

void CImageFadeTwoView::OnUpdateBrushFadeOut(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_nWay == 1)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

void CImageFadeTwoView::OnBitmapFadeIn() 
{
	// TODO: Add your command handler code here
	m_nWay = 2;
	Invalidate();
	
}

void CImageFadeTwoView::OnUpdateBitmapFadeIn(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_nWay == 2)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);	
}

void CImageFadeTwoView::OnBitmapFadeOut() 
{
	// TODO: Add your command handler code here
	m_nWay = 3;
	Invalidate();
}

void CImageFadeTwoView::OnUpdateBitmapFadeOut(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_nWay == 3)
		pCmdUI ->SetCheck(TRUE);
	else
		pCmdUI ->SetCheck(FALSE);
}

⌨️ 快捷键说明

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