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

📄 rasterview.cpp

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

#include "stdafx.h"
#include "Raster.h"

#include "RasterDoc.h"
#include "RasterView.h"

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

#include "EllipseFilterDialog.h"

/////////////////////////////////////////////////////////////////////////////
// CRasterView

IMPLEMENT_DYNCREATE(CRasterView,  CView)

BEGIN_MESSAGE_MAP(CRasterView,  CView)
	//{{AFX_MSG_MAP(CRasterView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_COMMAND(IDM_ELLIPSE_FILTER,  OnEllipseFilter)
	ON_UPDATE_COMMAND_UI(IDM_ELLIPSE_FILTER,  OnUpdateEllipseFilter)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRasterView construction/destruction

CRasterView::CRasterView()
{
	// TODO: add construction code here
	m_pBackDib = NULL;
	m_nDstX = m_nDstY = 0;
	m_nSrcX = m_nSrcY = 0;
	m_nSrcHeight = m_nSrcWidth = 100;
}

CRasterView::~CRasterView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CRasterView drawing

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

	if (m_pBackDib)
	{
		BYTE* pBackDibData = m_pBackDib->GetDibData();
		LPBITMAPINFO pBackBmpInfo = m_pBackDib->GetBmpInfo();
		int nWidth = (int)m_pBackDib->GetWidth();
		int nHeight = (int)m_pBackDib->GetHeight();
		StretchDIBits(pDC->m_hDC,  0,  0,  nWidth,  nHeight, 
			0,  0,  nWidth,  nHeight,  pBackDibData,  pBackBmpInfo, 
			DIB_RGB_COLORS,  SRCCOPY);
	}
	FilterEllipseBmp();
	
}

/////////////////////////////////////////////////////////////////////////////
// CRasterView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CRasterView message handlers

int CRasterView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_pBackDib = new CDib("back.bmp");

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

void CRasterView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	if (m_pBackDib)
	{
		delete m_pBackDib;
		m_pBackDib = NULL;
	}
	
}

void CRasterView::FilterEllipseBmp()
{
	//第一步, 获取在文档中已经打开的位图
	CRasterDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//获取外部DIB信息
	CDib* pForeDib = pDoc->m_pDib;
	if(!pForeDib)return;
	//尺寸
	int nWidth = (int)pForeDib->GetWidth();
	int nHeight = (int)pForeDib->GetHeight();

	//客户区DC
	CClientDC dc(this);

	//第二步----背景与掩膜图像进行逻辑与运算

	//在memDCBack上将完----掩码位图与背景位图的组合.
	CDC memDCBack;
	memDCBack.CreateCompatibleDC(&dc);

	
	CBitmap bmMaskBack;
	bmMaskBack.CreateCompatibleBitmap(&dc, nWidth, nHeight);


	CBitmap* pOldBmpBack = memDCBack.SelectObject(&bmMaskBack);

	//白色画刷
	CBrush* pBrushBack = new CBrush(RGB(255, 255, 255));
	CRect rectWhite(0, 0, nWidth, nHeight);
	
	//白色矩形
	memDCBack.FillRect(rectWhite, pBrushBack);
	pBrushBack->DeleteObject();

	//黑色椭圆
	CRgn rgnBlack;
	rgnBlack.CreateEllipticRgn(m_nSrcX,  m_nSrcY,  (m_nSrcX + m_nSrcWidth),  (m_nSrcY + m_nSrcHeight));
	pBrushBack = new CBrush(RGB(0, 0, 0));
	memDCBack.FillRgn(&rgnBlack, pBrushBack);

	//背景与掩膜图像进行逻辑与运算
	dc.BitBlt((m_nDstX - m_nSrcX),  (m_nDstY - m_nSrcY), nWidth, nHeight, &memDCBack, 0, 0, SRCAND);
	memDCBack.SelectObject(pOldBmpBack);
	memDCBack.DeleteDC();
	delete pBrushBack;	

	//第三步, -------输入图像与原掩膜取反之结果(白底黑椭圆)进行逻辑与运算

	//在memDCFore上将完成----掩码位图与输入位图(即源入源)的组合.
	CDC memDCFore;
	memDCFore.CreateCompatibleDC(&dc);
	CBitmap bmMaskFore;
	bmMaskFore.CreateCompatibleBitmap(&dc, nWidth, nHeight);

	CBitmap* pOldBmpFore = memDCFore.SelectObject(&bmMaskFore);
	CBrush* pBrushFore = new CBrush(RGB(0, 0, 0));
	CRect rectBlack(0, 0, nWidth, nHeight);
	memDCFore.FillRect(rectBlack, pBrushFore);
	pBrushFore->DeleteObject();
	
	//白色椭圆
	CRgn rgnWhite;
	rgnWhite.CreateEllipticRgn(m_nSrcX,  m_nSrcY,  (m_nSrcX + m_nSrcWidth),  (m_nSrcY + m_nSrcHeight));

	pBrushFore = new CBrush(RGB(255, 255, 255));
	memDCFore.FillRgn(&rgnWhite, pBrushFore);

	pForeDib->Draw(memDCFore.m_hDC, 0, 0, nWidth, nHeight, 
				0, 0, nWidth, nHeight, DIB_RGB_COLORS, SRCAND);
	
	dc.BitBlt((m_nDstX - m_nSrcX),  (m_nDstY - m_nSrcY), nWidth, nHeight, &memDCFore, 0, 0, SRCPAINT);
	memDCFore.SelectObject(pOldBmpFore);
	memDCFore.DeleteDC();
	delete pBrushFore;
	ReleaseDC(&dc);
	
}

void CRasterView::OnEllipseFilter() 
{
	// TODO: Add your command handler code here
	CEllipseFilterDialog dlg;
	dlg.m_nSrcX = m_nSrcX;
	dlg.m_nSrcY = m_nSrcY;
	dlg.m_nSrcWidth = m_nSrcWidth;
	dlg.m_nSrcHeight = m_nSrcHeight;
	dlg.m_nDstX = m_nDstX;
	dlg.m_nDstY = m_nDstY;

	int responeDlg = dlg.DoModal();
	if(responeDlg == IDOK)
	{
		m_nSrcX = dlg.m_nSrcX;
		m_nSrcY = dlg.m_nSrcY;
		m_nSrcWidth = dlg.m_nSrcWidth;
		m_nSrcHeight = dlg.m_nSrcHeight;
		m_nDstX = dlg.m_nDstX;
		m_nDstY = dlg.m_nDstY;
		Invalidate();
	}
}

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

⌨️ 快捷键说明

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