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

📄 imageview.cpp

📁 一个跟Cppunit一样好用的单元测试工具
💻 CPP
字号:
// imageView.cpp : implementation of the CImageView class
//

#include "stdafx.h"
#include "image.h"

#include "imageDoc.h"
#include "imageView.h"
#include "bitmapfile.h"
#include "drawshape.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CImageView

IMPLEMENT_DYNCREATE(CImageView, CScrollView)

BEGIN_MESSAGE_MAP(CImageView, CScrollView)
	//{{AFX_MSG_MAP(CImageView)
	ON_COMMAND(ID_DRAW_CIRCLE, OnDrawCircle)
	ON_UPDATE_COMMAND_UI(ID_DRAW_CIRCLE, OnUpdateDrawCircle)
	ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
	ON_UPDATE_COMMAND_UI(ID_DRAW_LINE, OnUpdateDrawLine)
	ON_COMMAND(ID_DRAW_RECTANCLE, OnDrawRectancle)
	ON_UPDATE_COMMAND_UI(ID_DRAW_RECTANCLE, OnUpdateDrawRectancle)
	ON_COMMAND(ID_DRAW_TEXT, OnDrawText)
	ON_UPDATE_COMMAND_UI(ID_DRAW_TEXT, OnUpdateDrawText)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_ZOOM_IN2, OnZoomIn2)
	ON_COMMAND(ID_ZOOM_IN4, OnZoomIn4)
	ON_COMMAND(ID_ZOOM_NORMAL, OnZoomNormal)
	ON_COMMAND(ID_ZOOM_OUT2, OnZoomOut2)
	ON_COMMAND(ID_ZOOM_OUT4, OnZoomOut4)
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageView construction/destruction

CImageView::CImageView()
{
	// TODO: add construction code here
	m_pEdit = NULL;
	m_pPreText = NULL;
	m_fScale = 1;
}

CImageView::~CImageView()
{
	delete m_pEdit;
}

BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageView drawing

void CImageView::OnDraw(CDC* pDC)
{
	CImageDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CDC memDC;
	memDC.CreateCompatibleDC( pDC );	
	CGdiObject* oldGdi = memDC.SelectObject(pDoc->m_pBitmap);	

	CGdiObject* pOldBrush = memDC.SelectStockObject(NULL_BRUSH);
	CTypedPtrList<CObList, CShape*>& shapeList=pDoc->m_ShapeList;
	POSITION pos=shapeList.GetHeadPosition();
	while(pos)
	{
		CShape *pShape=shapeList.GetNext(pos);
		pShape->Draw(&memDC);
	}
	memDC.SelectObject(pOldBrush);
	int w=pDoc->m_pBitmap->GetWidth();
	int h=pDoc->m_pBitmap->GetHeight();
	//render the bmp file
	pDC->StretchBlt(0, 0, (int)(w*m_fScale), (int)(h*m_fScale), &memDC, 0, 0, w, h, SRCCOPY);
	memDC.SelectObject(oldGdi);
	// TODO: add draw code for native data here
}

void CImageView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	
	CImageDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: calculate the total size of this view
	CSize sizeTotal;
	sizeTotal.cx = (long)(pDoc->m_pBitmap->GetWidth()*m_fScale);
	sizeTotal.cy = (long)(pDoc->m_pBitmap->GetHeight()*m_fScale);
	CSize sizePage = (sizeTotal.cx/2, sizeTotal.cy/2);
	CSize sizeLine = (sizeTotal.cx/50, sizeTotal.cy/50);
	SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);	
}

/////////////////////////////////////////////////////////////////////////////
// CImageView printing

BOOL CImageView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CImageView diagnostics

#ifdef _DEBUG
void CImageView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CImageView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CImageView message handlers

void CImageView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class	

}

void CImageView::OnDrawCircle() 
{
	// TODO: Add your command handler code here
	type=CIRCLE;
}

void CImageView::OnUpdateDrawCircle(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	InvalidateDrawMenu(pCmdUI);
	pCmdUI->SetCheck(type==CIRCLE);
}

void CImageView::OnDrawLine() 
{
	// TODO: Add your command handler code here
	type=LINE;	
}

void CImageView::OnUpdateDrawLine(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	InvalidateDrawMenu(pCmdUI);
	pCmdUI->SetCheck(type==LINE);
}

void CImageView::OnDrawRectancle() 
{
	// TODO: Add your command handler code here
	type=RECTANCLE;	
}

void CImageView::OnUpdateDrawRectancle(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	InvalidateDrawMenu(pCmdUI);
	pCmdUI->SetCheck(type==RECTANCLE);
}

void CImageView::OnDrawText() 
{
	// TODO: Add your command handler code here
	type=TEXT;
}

void CImageView::OnUpdateDrawText(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	InvalidateDrawMenu(pCmdUI);
	pCmdUI->SetCheck(type==TEXT);
}

void CImageView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if ( m_pEdit )
	{
		if( m_pPreText )
		{
			//get the last text value
			m_pEdit->GetWindowText( m_pPreText->m_strText );
		}
		delete m_pEdit;
		m_pEdit = NULL;
	}		
	switch(type)
	{
	case LINE:
		m_pShapeCur=new CLine();
		break;
	case CIRCLE:
		m_pShapeCur=new CCircle();
		break;
	case RECTANCLE:
		m_pShapeCur=new CRectangle();
		break;
	case TEXT:
		m_pPreText=new CText();
		m_pShapeCur=m_pPreText ;
		m_pEdit = new CEdit;
		m_pEdit->Create( WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
      CRect(point.x, point.y, point.x+200, point.y+50), this, 1);
		break;
	default:
//		 AfxMessageBox("Unkown type!");
		 return ;
	}
	GetDocument()->SetModifiedFlag();
//	GetDocument()->m_ShapeList.AddTail(m_pShapeCur);
	SetCapture();
	m_pDC = new CClientDC(this);
	OnPrepareDC(m_pDC);
	m_pDC->DPtoLP(&point);
	m_ptCurrent = point;
	m_ptPrev = m_ptCurrent;
	m_pShapeCur->SetStart(point);
	m_pShapeCur->SetWidth(GetDocument()->GetCurPenWidth());
	m_pShapeCur->SetColor(GetDocument()->GetCurColor());
		
//	pDC = new CDC();
//	pDC->CreateCompatibleDC(NULL);
//	pDC->SelectObject(GetDocument()->pBitmap);	

	m_pDC->SelectObject(GetDocument()->GetPen());
	m_pDC->SelectStockObject(NULL_BRUSH);
	m_pDC->MoveTo(m_ptCurrent);
	CScrollView::OnLButtonDown(nFlags, point);
}

void CImageView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(GetCapture()!=this)
		return;
	m_pDC->DPtoLP(&point);
	m_pShapeCur->SetEnd(point);
	GetDocument()->m_ShapeList.AddTail(m_pShapeCur);
	m_pShapeCur->Draw(m_pDC);
	InvalidateRect(&CRect(m_ptCurrent, m_ptPrev));
	delete m_pDC;
	ReleaseCapture();
	CScrollView::OnLButtonUp(nFlags, point);
}

void CImageView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CString str;
	CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
	CStatusBar *pStatus = &(pFrame->m_wndStatusBar);
	//set mouse coordinate as the second statusbar text 
	if(pStatus)
	{
		str.Format("(%d , %d)", point.x, point.y);
		pStatus->SetPaneText(1, str);
	}

	if(GetCapture()!=this)
		return;
	m_pDC->DPtoLP(&point);
	int oldMod = m_pDC->SetROP2( R2_NOTXORPEN );
	m_pShapeCur->SetEnd(m_ptPrev);
	m_pShapeCur->Draw(m_pDC);
	m_pDC->SetROP2(oldMod);
	m_pShapeCur->SetEnd(point);
	m_pShapeCur->Draw(m_pDC);
//	InvalidateRect(&CRect(m_ptCurrent, m_ptPrev));
	m_ptPrev = point;
	CView::OnMouseMove(nFlags, point);
}

void CImageView::OnZoomIn2() 
{
	// TODO: Add your command handler code here
	m_fScale = 2;
	type=DISENABLE;
	OnInitialUpdate();
	InvalidateRect(NULL);
}

void CImageView::OnZoomIn4() 
{
	// TODO: Add your command handler code here
	m_fScale = 4;
	type=DISENABLE;
	OnInitialUpdate();
	InvalidateRect(NULL);
}

void CImageView::OnZoomNormal() 
{
	// TODO: Add your command handler code here
	m_fScale = 1;
	OnInitialUpdate();
	InvalidateRect(NULL);
}

void CImageView::OnZoomOut2() 
{
	// TODO: Add your command handler code here
	m_fScale = 0.5;
	type=DISENABLE;
	OnInitialUpdate();
	InvalidateRect(NULL);
}

void CImageView::OnZoomOut4() 
{
	// TODO: Add your command handler code here
	m_fScale = 0.25;
	type=DISENABLE;
	OnInitialUpdate();
	InvalidateRect(NULL);
}

void CImageView::SetScale(float scale)
{
	m_fScale = scale;
}

void CImageView::InvalidateDrawMenu(CCmdUI* pCmdUI)
{
	pCmdUI->Enable(m_fScale==1);
}

BOOL CImageView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
//	CRect rcClip;
//	pDC->GetClipBox(&rcClip);
//	pDC->PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY );
	return CScrollView::OnEraseBkgnd(pDC);
//	OnDraw(pDC);
//	return true;
}

⌨️ 快捷键说明

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