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

📄 imagespreadview.cpp

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

#include "stdafx.h"
#include "ImageSpread.h"

#include "ImageSpreadDoc.h"
#include "ImageSpreadView.h"

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

#include "BorderRect.h"
#include "ImageSpreadDialog.h"

/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView

IMPLEMENT_DYNCREATE(CImageSpreadView,  CView)

BEGIN_MESSAGE_MAP(CImageSpreadView,  CView)
	//{{AFX_MSG_MAP(CImageSpreadView)
	ON_WM_CREATE()
	ON_COMMAND(IDM_SPREAD_WAY,  OnSpreadWay)
	ON_UPDATE_COMMAND_UI(IDM_SPREAD_WAY,  OnUpdateSpreadWay)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView construction/destruction

CImageSpreadView::CImageSpreadView()
{
	// TODO: add construction code here
	m_nWay = left_right;
}

CImageSpreadView::~CImageSpreadView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView drawing

void CImageSpreadView::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();

	SpreadInto(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageSpreadView message handlers

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

void CImageSpreadView::SpreadInto(CDC *pDC)
{
	CImageSpreadDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

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

	if(!pDib)return;

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

	//第二步, 将位图绘制到内存设备
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);
	CBitmap ddb;
	ddb.CreateCompatibleBitmap(pDC, nWidth, nHeight);
	CBitmap* pOldBitmap = memDC.SelectObject(&ddb);

	//把整个位图绘制到内存, 
	//更快的办法是将图像直接绘制到pDC
	pDib->Draw(memDC.m_hDC, 0, 0, nWidth, nHeight, 
				0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCCOPY);

	//第三步, 从内存设备中读出位图

	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.Draw(pDC, FALSE);


	//创建剪切区域
//	CRgn rgn;
//	rgn.CreateRectRgn(cx, cy, cx + nWidth, cy + nHeight);
//	pDC->SelectClipRgn(&rgn, RGN_COPY);

	//绘制坐标步长, 
	int nStepX, nStepY;

	//求出宽度和高度的最大者
	if(nWidth >= nHeight)
	{
		nStepX = 10;
		nStepY = (int)(10.0f * ((float)nHeight / (float)nWidth) + 0.5f);
	}
	else
	{
		nStepY = 10;
		nStepX = (int)(10.0f * ((float)nWidth / (float)nHeight) + 0.5f);
	}

	switch(m_nWay)
	{
		//从左渐铺至右
		//
		case left_right:
		{
			for(int x = cx; x < (cx + nWidth + 10);x += 10)
			{
				pDC->BitBlt(x, cy, 10, nHeight, &memDC, (x - cx), 0, SRCCOPY);
				Delay(20);
			}
			break;
		}
		//从右渐铺至左
		case right_left:
		{
			for(int x = (cx + nWidth + 10); x > (cx - 10); x -= 10)
			{
				pDC->BitBlt(x, cy, 10, nHeight, &memDC, (x - cx), 0, SRCCOPY);
				Delay(20);
			}

			break;
		}

		//从上渐铺至下
		case top_bottom:
		{
			for(int y = cy; y < (cy + nHeight + 10);y += 10)
			{
				pDC->BitBlt(cx, y, nWidth, 10, &memDC, 0, (y - cy), SRCCOPY);
				Delay(20);
			}
			break;
		}
		//从下渐铺至上
		case bottom_top:
		{
			for(int y = (cy + nHeight + 10); y > (cy - 10); y -= 10)
			{
				pDC->BitBlt(cx, y, nWidth, 10, &memDC, 0, (y - cy), SRCCOPY);
				Delay(20);
			}

			break;
		}
		//从左上渐铺至右下
		case topLeft_bottomRight:
		{
			for(int w = nStepX,  h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
			{
				pDC->BitBlt(cx, cy, w, h, &memDC, 0, 0, SRCCOPY);
				Delay(20);
			}

			break;
		}
		//从右下渐铺至左上
		case bottomRight_topLeft:
		{
			for(int w = nStepX,  h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
			{
				pDC->BitBlt((cx + nWidth - w), (cy + nHeight - h), w, h, &memDC, (nWidth - w), (nHeight - h), SRCCOPY);
				Delay(20);
			}
			break;
		}
		//从右上渐铺至左下
		case topRight_bottomLeft:
		{
			for(int w = nStepX,  h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
			{
				pDC->BitBlt((cx + nWidth - w), cy, w, h, &memDC, (nWidth - w), 0, SRCCOPY);
				Delay(20);
			}

			break;
		}
		//从左下渐铺至右上
		case bottomLeft_topRight:
		{
			for(int w = nStepX,  h = nStepY;w < (nWidth + nStepX); w += nStepX, h += nStepY)
			{
				pDC->BitBlt(cx, (cy + nHeight - h), w, h, &memDC, 0, (nHeight - h), SRCCOPY);
				Delay(20);
			}
			break;
		}
	}

	ddb.DeleteObject();
	memDC.SelectObject(pOldBitmap);

//	rgn.DeleteObject();
//	pDC->SelectClipRgn(NULL, RGN_COPY);
}


void CImageSpreadView::OnSpreadWay() 
{
	// TODO: Add your command handler code here
	CImageSpreadDialog dlg;
	dlg.m_nWay = m_nWay;

	int responeDlg = dlg.DoModal();
	if(responeDlg == IDOK)
	{
		m_nWay = dlg.m_nWay;
		Invalidate();
	}		
}

void CImageSpreadView::OnUpdateSpreadWay(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

⌨️ 快捷键说明

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