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

📄 drawview.cpp

📁 Visual C++_ 600 编程学习捷径
💻 CPP
字号:
// drawView.cpp : implementation of the CDrawView class
//

#include "stdafx.h"
#include "draw.h"
#include "TsFont.h"
#include "word.h"
#include "drawDoc.h"
#include "drawView.h"

#include<math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDrawView

IMPLEMENT_DYNCREATE(CDrawView, CScrollView)

BEGIN_MESSAGE_MAP(CDrawView, CScrollView)
	//{{AFX_MSG_MAP(CDrawView)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONUP()
	ON_COMMAND(ID_DRAW_FONT, OnDrawFont)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CDrawView construction/destruction

CDrawView::CDrawView()
{
	// TODO: add construction code here
	m_Dragging = 0;
	m_IsRect = FALSE;
	m_hArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	m_hCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
	m_PenDotted.CreatePen(PS_DOT, 1, RGB(0,0,0));
	m_cTextColor = RGB(0,0,0);
	
	m_lf.lfHeight = 30; 
	m_lf.lfWidth = 0; 
	m_lf.lfEscapement = 0; 
	m_lf.lfOrientation = 0; 
	m_lf.lfWeight = FW_NORMAL; 
	m_lf.lfItalic = FALSE; 
	m_lf.lfUnderline = FALSE; 
	m_lf.lfStrikeOut = FALSE; 
	m_lf.lfCharSet = GB2312_CHARSET; 
	m_lf.lfOutPrecision = OUT_STROKE_PRECIS; 
	m_lf.lfClipPrecision = CLIP_STROKE_PRECIS; 
	m_lf.lfQuality = DRAFT_QUALITY; 
	m_lf.lfPitchAndFamily = VARIABLE_PITCH|FF_MODERN; 
	strcpy(m_lf.lfFaceName, "仿宋_GB2312"); 
}

CDrawView::~CDrawView()
{
}

BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	m_ClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, 0,
			(HBRUSH)::GetStockObject(WHITE_BRUSH), 0);
	cs.lpszClass = m_ClassName;

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView drawing

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

	CSize ScrollSize = GetTotalSize();
	pDC->MoveTo(ScrollSize.cx, 0);
	pDC->LineTo(ScrollSize.cx, ScrollSize.cy);
	pDC->LineTo(0, ScrollSize.cy);
	
	CRect ClipRect;
	CRect DimRect;
	CRect IntRect;
	CDrawBase *pDraw;
	pDC->GetClipBox(&ClipRect);
	int NumDraws = pDoc->GetNumDraws();
	for(int Index = 0; Index < NumDraws; ++Index)
	{
		pDraw = pDoc->GetDraw(Index);
		DimRect = pDraw->GetDimRect();
		if(IntRect.IntersectRect(DimRect, ClipRect))
			pDraw->Draw(pDC);
	}
}

void CDrawView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	sizeTotal.cx = 800;
	sizeTotal.cy = 600;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDrawView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDrawView message handlers



void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);
	
	CDrawApp *pApp = (CDrawApp *)AfxGetApp();
	if(m_IsRect)
	{
		CDC *pDC = GetDC();
		CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
		rect.NormalizeRect();
		pDC->DrawFocusRect(rect);
		ReleaseDC(pDC);
		m_IsRect = FALSE;
	}
	if(pApp->m_CurrentTool != ID_DRAW_SELECT && pApp->m_CurrentTool != ID_DRAW_WORD)
		ClientDC.DPtoLP(&point);


	CSize ScrollSize = GetTotalSize();
	CRect ScrollRect(0, 0, ScrollSize.cx, ScrollSize.cy);
	if(!ScrollRect.PtInRect(point))
		return;
	m_PointOrigin = point;
	m_PointOld = point;
	SetCapture();
	m_Dragging = 1;

	ClientDC.LPtoDP(&ScrollRect);
	CRect ViewRect;
	GetClientRect(&ViewRect);
	CRect IntRect;
	IntRect.IntersectRect(&ScrollRect, &ViewRect);
	ClientToScreen(&IntRect);
	::ClipCursor(&IntRect);

	CScrollView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);

	CDrawApp *pApp = (CDrawApp *)AfxGetApp();
	if(pApp->m_CurrentTool != ID_DRAW_SELECT && pApp->m_CurrentTool != ID_DRAW_WORD)
		ClientDC.DPtoLP(&point);

	if(!m_Dragging)
	{
		CSize ScrollSize = GetTotalSize();
		CRect ScrollRect(0,0,ScrollSize.cx, ScrollSize.cy);
		if(ScrollRect.PtInRect(point))
			::SetCursor(m_hCross);
		else
			::SetCursor(m_hArrow);
		return;
	}
	ClientDC.SetROP2(R2_NOT);
	ClientDC.SelectObject(&m_PenDotted);
	ClientDC.SetBkColor(TRANSPARENT);
	ClientDC.SelectStockObject(NULL_BRUSH);
	switch(((CDrawApp *)AfxGetApp())->m_CurrentTool)
	{
	case ID_DRAW_LINE:
		ClientDC.MoveTo(m_PointOrigin);
		ClientDC.LineTo(m_PointOld);
		ClientDC.MoveTo(m_PointOrigin);
		ClientDC.LineTo(point);
		break;
	case ID_DRAW_SELECT:
	case ID_DRAW_WORD:
		{
			CDC *pDC = GetDC();
			CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
			rect.NormalizeRect();
			pDC->DrawFocusRect(rect);
			rect.SetRect(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y);
			rect.NormalizeRect();
			pDC->DrawFocusRect(rect);
			m_IsRect = TRUE;
			ReleaseDC(pDC);
			break;
		}
	case ID_DRAW_RECT:
	case ID_DRAW_RECTFILL:
		ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
							m_PointOld.x, m_PointOld.y);
		ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
							point.x, point.y);
		break;
	case ID_DRAW_RECTROUND:
	case ID_DRAW_RECTROUNDFILL:
		{
			int SizeRound = (abs(m_PointOld.x - m_PointOrigin.x) +
							abs(m_PointOld.y - m_PointOrigin.x))/6;
			ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
							m_PointOld.x, m_PointOld.y,
							SizeRound, SizeRound);
			 SizeRound = (abs(point.x - m_PointOrigin.x) +
							abs(point.y - m_PointOrigin.x))/6;
			ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
							point.x, point.y, SizeRound, SizeRound);
			break;
		}
	case ID_DRAW_CIRCLE:
	case ID_DRAW_CIRCLEFILL:
		{
		int dim = int(sqrt((m_PointOld.x - m_PointOrigin.x) * (m_PointOld.x - m_PointOrigin.x)
				  + (m_PointOld.y - m_PointOrigin.y) * (m_PointOld.y - m_PointOrigin.y)));
		ClientDC.Ellipse(m_PointOrigin.x - dim,m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim);
		dim = int(sqrt((point.x - m_PointOrigin.x) * (point.x - m_PointOrigin.x)
				  + (point.y - m_PointOrigin.y) * (point.y - m_PointOrigin.y)));
		ClientDC.Ellipse(m_PointOrigin.x - dim,m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim);
		break;
		}
	case ID_DRAW_ELLIPSE:
	case ID_DRAW_ELLIPSEFILL:
		ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
						m_PointOld.x, m_PointOld.y);
		ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
						point.x, point.y);
		break;
	}
	m_PointOld = point;
	
	CScrollView::OnMouseMove(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(!m_Dragging) return;
	m_Dragging = 0;
	::ReleaseCapture();
	::ClipCursor(NULL);
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);
	ClientDC.DPtoLP(&point);
	ClientDC.SelectObject(&m_PenDotted);
	ClientDC.SetROP2(R2_NOT);
	ClientDC.SetBkMode(TRANSPARENT);
	ClientDC.SelectStockObject(NULL_BRUSH);
	CDrawApp *pApp = (CDrawApp *)AfxGetApp();
	CDrawBase *pDraw;
	BOOL flag = FALSE;
	switch(pApp->m_CurrentTool)
	{
	case ID_DRAW_LINE:
		ClientDC.MoveTo(m_PointOrigin);
		ClientDC.LineTo(m_PointOld);
		pDraw = new CLine(m_PointOrigin.x, m_PointOrigin.y,
			point.x, point.y, pApp->m_PenColor, pApp->m_CurrentPenThickness);
		break;
	case ID_DRAW_RECT:
		ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
							m_PointOld.x, m_PointOld.y);
		pDraw = new CRectangle(m_PointOrigin.x, m_PointOrigin.y,point.x, point.y,
						pApp->m_PenColor, pApp->m_CurrentPenThickness);
		break;
	case ID_DRAW_RECTFILL:
		ClientDC.Rectangle(m_PointOrigin.x, m_PointOrigin.y,
							m_PointOld.x, m_PointOld.y);
		pDraw = new CRectFill(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
						pApp->m_FillColor);
		break;
	case ID_DRAW_RECTROUND:
		{
		int SizeRound = (abs(m_PointOld.x - m_PointOrigin.x) +
							abs(m_PointOld.y - m_PointOrigin.x))/6;
			ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
							m_PointOld.x, m_PointOld.y,
							SizeRound, SizeRound);
			pDraw = new CRectRound(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
						pApp->m_PenColor, pApp->m_CurrentPenThickness);
		break;
		}
	case ID_DRAW_RECTROUNDFILL:
		{	int SizeRound = (abs(m_PointOld.x - m_PointOrigin.x) +
							abs(m_PointOld.y-m_PointOrigin.x))/6;
			ClientDC.RoundRect(m_PointOrigin.x, m_PointOrigin.y,
							m_PointOld.x, m_PointOld.y,
							SizeRound, SizeRound);
			pDraw = new CRectRoundFill(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
						pApp->m_FillColor);
		break;
		}
	case ID_DRAW_CIRCLE:
		{
		int dim = int(sqrt((m_PointOld.x - m_PointOrigin.x) * (m_PointOld.x - m_PointOrigin.x)
				  + (m_PointOld.y - m_PointOrigin.y) * (m_PointOld.y - m_PointOrigin.y)));
		ClientDC.Ellipse(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim);
		dim = int(sqrt((point.x - m_PointOrigin.x) * (point.x - m_PointOrigin.x)
				  + (point.y - m_PointOrigin.y) * (point.y - m_PointOrigin.y)));
		ClientDC.Ellipse(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim);
		pDraw = new CCircle(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim,
						pApp->m_PenColor, pApp->m_CurrentPenThickness);
		break;
		}
	case ID_DRAW_CIRCLEFILL:
		{
		ClientDC.MoveTo(m_PointOrigin);
		ClientDC.LineTo(m_PointOld);
		int dim = int(sqrt((m_PointOld.x - m_PointOrigin.x) * (m_PointOld.x - m_PointOrigin.x)
				  + (m_PointOld.y - m_PointOrigin.y) * (m_PointOld.y - m_PointOrigin.y)));
		ClientDC.Ellipse(m_PointOrigin.x - dim,m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim);
		dim = int(sqrt((point.x - m_PointOrigin.x) * (point.x - m_PointOrigin.x)
				  + (point.y - m_PointOrigin.y) * (point.y - m_PointOrigin.y)));
		ClientDC.Ellipse(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim);
		pDraw = new CCircleFill(m_PointOrigin.x - dim, m_PointOrigin.y - dim,
						m_PointOrigin.x + dim, m_PointOrigin.y + dim,
						pApp->m_FillColor);
		break;
		}
	case ID_DRAW_ELLIPSE:
		{
		ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
						m_PointOld.x, m_PointOld.y);
		pDraw = new CCircle(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
						pApp->m_PenColor, pApp->m_CurrentPenThickness);
		break;
		}
	case ID_DRAW_ELLIPSEFILL:
		ClientDC.Ellipse(m_PointOrigin.x, m_PointOrigin.y,
						m_PointOld.x, m_PointOld.y);
		pDraw = new CCircleFill(m_PointOrigin.x, m_PointOrigin.y, point.x, point.y,
						pApp->m_FillColor);
		break;
	case ID_DRAW_WORD:
		{
			CPoint PointOrigin = m_PointOrigin;
			ClientDC.DPtoLP(&PointOrigin);
			CString str;
			CWord WordDlg;
			if(WordDlg.DoModal() == IDOK)
			{
				str = WordDlg.m_Word;
				pDraw = new CText(PointOrigin.x, PointOrigin.y, point.x, point.y, m_cTextColor, m_lf, str);
				flag = TRUE;
			}
			if(m_IsRect)
			{
				CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
				rect.NormalizeRect();
				ClientDC.DrawFocusRect(rect);
				m_IsRect = FALSE;
			}
		}
	}
	if(pApp->m_CurrentTool != ID_DRAW_SELECT && pApp->m_CurrentTool != ID_DRAW_WORD)
	{
		ClientDC.SetROP2(R2_COPYPEN);
		pDraw->Draw(&ClientDC);
		CDrawDoc *pDoc = GetDocument();
		pDoc->AddDraw(pDraw);
		pDoc->UpdateAllViews(this, 0, pDraw);
	}
	else if(pApp->m_CurrentTool == ID_DRAW_WORD&&flag)
	{
		ClientDC.SetROP2(R2_COPYPEN);
		pDraw->Draw(&ClientDC);
		CDrawDoc *pDoc = GetDocument();
		pDoc->AddDraw(pDraw);
		pDoc->UpdateAllViews(this, 0, pDraw);
	}

	CScrollView::OnLButtonUp(nFlags, point);
}

void CDrawView::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_IsRect)
	{
		CDC *pDC = GetDC();
		CRect rect(m_PointOrigin.x, m_PointOrigin.y, m_PointOld.x, m_PointOld.y);
		rect.NormalizeRect();
		pDC->DrawFocusRect(rect);
		ReleaseDC(pDC);
		m_IsRect = FALSE;
	}
	CScrollView::OnRButtonUp(nFlags, point);
}
void CDrawView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	 if(pHint != 0)
	 {
		 CRect InvalidRect = ((CLine *)pHint)->GetDimRect();
		 CClientDC ClientDC(this);
		 OnPrepareDC(&ClientDC);
		 ClientDC.LPtoDP(&InvalidRect);
		 InvalidateRect(&InvalidRect);
	 }
	 else
		 CScrollView::OnUpdate(pSender,lHint,pHint);
	
}

void CDrawView::OnDrawFont() 
{
	CTsFont TsFont;
	TsFont.m_lfHeight = m_lf.lfHeight;
	TsFont.m_lfWidth = m_lf.lfWidth;
	TsFont.m_lfEscapement = m_lf.lfEscapement;
	TsFont.m_lfOrientation = m_lf.lfOrientation;
	TsFont.m_lfWeight = m_lf.lfWeight;
	TsFont.m_crColor = m_cTextColor;
	if(TsFont.DoModal() == IDOK)
	{
	   m_lf.lfHeight = TsFont.m_lfHeight; 
	   m_lf.lfWidth = TsFont.m_lfWidth; 
	   m_lf.lfEscapement = TsFont.m_lfEscapement; 
	   m_lf.lfOrientation = TsFont.m_lfOrientation; 
	   m_lf.lfWeight = TsFont.m_lfWeight; 
	   m_cTextColor = TsFont.m_crColor;
	 }
}

⌨️ 快捷键说明

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