www.pudn.com > DRAW.rar > drawView.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 
#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; 
	 } 
}