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

📄 imagefadeoneview.cpp

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

#include "stdafx.h"
#include "ImageFadeOne.h"

#include "ImageFadeOneDoc.h"
#include "ImageFadeOneView.h"

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

#include "BorderRect.h"
#include "BrightnessProcess.h"

/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView

IMPLEMENT_DYNCREATE(CImageFadeOneView,  CView)

BEGIN_MESSAGE_MAP(CImageFadeOneView,  CView)
	//{{AFX_MSG_MAP(CImageFadeOneView)
	ON_WM_CREATE()
	ON_COMMAND(IDM_FADE_IN,  OnFadeIn)
	ON_UPDATE_COMMAND_UI(IDM_FADE_IN,  OnUpdateFadeIn)
	ON_COMMAND(IDM_FADE_OUT,  OnFadeOut)
	ON_UPDATE_COMMAND_UI(IDM_FADE_OUT,  OnUpdateFadeOut)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView construction/destruction

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

CImageFadeOneView::~CImageFadeOneView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView drawing

void CImageFadeOneView::OnDraw(CDC* pDC)
{
	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);

}

/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageFadeOneView message handlers

int CImageFadeOneView::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 CImageFadeOneView::Delay(DWORD ms)
{
	DWORD time = GetTickCount();
	do{;}while((GetTickCount() - time) < ms);
}

void CImageFadeOneView::FadeInOut(CDC *pDC)
{
	CImageFadeOneDoc* 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);

	////////////////////////////
	// 32位颜色数据
	DWORD dwSize = nWidth * nHeight * 4;

	//分配全局内存 32位源数据
	BYTE* pbyBitsSrc =  new BYTE[dwSize];
	if(pbyBitsSrc == NULL) return;
	memset(pbyBitsSrc, 0, dwSize);
	

	pDib->GetDdbData32(pbyBitsSrc);

	//保存暂时结果
	BYTE* pbyBitsTemp =  new BYTE[dwSize];
	if(pbyBitsTemp == NULL) return;
	
	::CopyMemory(pbyBitsTemp, pbyBitsSrc, dwSize);


	//亮度处理器
	CBrightnessProcess* bp = new CBrightnessProcess();
	bp->SetOperation(IMAGE_BRIGHTNESS_PERCENTAGE);


	//淡入(m_nWay = 0)
	if(m_nWay == 0)
	{
		for(int i = 10;i <= 100; i += 2)
		{
			bp->SetParam(i, 0, 255);
			//获取数据后, 其基本参考点变为(0, 0).
			bp->ChangeBrightness(pbyBitsTemp, 0, 0, nWidth, nHeight, nWidth, nHeight);

			CDC memDC;
			memDC.CreateCompatibleDC(pDC);
			HBITMAP hBitmap = bp->CreateDdb(pDC->m_hDC, nWidth, nHeight, pbyBitsTemp);
			HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
			pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
			::DeleteObject(hBitmap);
			memDC.SelectObject(hOldBitmap);
			Delay(5);
			::CopyMemory(pbyBitsTemp, pbyBitsSrc, dwSize);
		}
	}
	//淡出(m_nWay != 0)
	else
	{
		for(int i = 100;i >= 0; i -= 2)
		{
			bp->SetParam(i, 0, 255);
			//获取数据后, 其基本参考点变为(0, 0).
			bp->ChangeBrightness(pbyBitsTemp, 0, 0, nWidth, nHeight, nWidth, nHeight);

			CDC memDC;
			memDC.CreateCompatibleDC(pDC);
			HBITMAP hBitmap = bp->CreateDdb(pDC->m_hDC, nWidth, nHeight, pbyBitsTemp);
			HBITMAP hOldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);
			pDC->BitBlt(cx, cy, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
			::DeleteObject(hBitmap);
			memDC.SelectObject(hOldBitmap);
			::CopyMemory(pbyBitsTemp, pbyBitsSrc, dwSize);
			Delay(5);
		}
	}

	delete bp;

	delete[] pbyBitsSrc; 
	delete[] pbyBitsTemp;
}



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

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

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

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

⌨️ 快捷键说明

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