📄 rasterview.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 + -