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

📄 drawview.cpp

📁 C++视图的程序
💻 CPP
字号:
// DrawView.cpp : implementation of the CDrawView class
//

#include "stdafx.h"
#include "Draw.h"
#include "math.h"
#include "DrawDoc.h"
#include "DrawView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDrawView
enum {DRAW_VCLINE,DRAW_BEZIER,DRAW_RECTANGLE,DRAW_VCCIRCLE,DRAW_VCELLIPSE,DRAW_POLYGON};

enum {PEN_STYLE_SOLID,PEN_STYLE_DASH,PEN_STYLE_DOT};

IMPLEMENT_DYNCREATE(CDrawView, CScrollView)

BEGIN_MESSAGE_MAP(CDrawView, CScrollView)
	//{{AFX_MSG_MAP(CDrawView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_RBUTTONDOWN()
	//}}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_Num=0;
    m_Drag=0;
	m_HCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);
}

CDrawView::~CDrawView()
{
}

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

	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
	int index;
	index=pDoc->GetShapeNumber();
	for(int i=0;i<index;i++)
		pDoc->GetShape(i)->Drawing(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// 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) 
{
	// TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.DPtoLP(&point);
    CDrawDoc *pDoc=GetDocument();
    if(pDoc->CurrentDraw==DRAW_POLYGON || pDoc->CurrentDraw==DRAW_BEZIER)
    {
		points[m_Num]=point;m_Num++;  //点击鼠标左键来采集坐标点 
    }
	else
	{
		m_pPrev=point;
	    m_pOrigin=point;    //点击鼠标左键作为拖动绘图的第一点 
	    m_Drag=1;
	}

	SetCapture();
	RECT rect;
	GetClientRect(&rect);
	ClientToScreen(&rect);
	ClipCursor(&rect);

	CScrollView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
//    CClientDC dc(this);
	if(m_Drag)
	{
        m_Drag=0;
		ReleaseCapture();
		ClipCursor(NULL);
        CDrawDoc *pDoc=GetDocument();
        CShape *pShape;
		CPoint p1,p2;
		if(pDoc->CurrentDraw==DRAW_VCLINE)
		{
			pShape=new CLine(m_pOrigin,m_pPrev,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
		    pDoc->AddShape(pShape);
		}
		if(pDoc->CurrentDraw==DRAW_RECTANGLE)
		{
			    pShape=new CRectangle(m_pOrigin,m_pPrev,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor,
				    pDoc->m_FFlag,pDoc->m_FColor,pDoc->m_HFlag,pDoc->m_Hatch);
		        pDoc->AddShape(pShape);
		}
		if(	pDoc->CurrentDraw==DRAW_VCCIRCLE)
		{
			pShape=new CCircle(m_pOrigin,m_pPrev,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor,
			    pDoc->m_FFlag,pDoc->m_FColor,pDoc->m_HFlag,pDoc->m_Hatch);
		    pDoc->AddShape(pShape);
		}		
		if(pDoc->CurrentDraw==DRAW_VCELLIPSE)
		{
		    pShape=new CEllipse(m_pOrigin,m_pPrev,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor,
			    pDoc->m_FFlag,pDoc->m_FColor,pDoc->m_HFlag,pDoc->m_Hatch);
		    pDoc->AddShape(pShape);
		}

		pDoc->UpdateAllViews(NULL);
    }
	
	CScrollView::OnLButtonUp(nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.DPtoLP(&point);
	dc.SelectStockObject(NULL_BRUSH);
	SetCursor(m_HCursor);
	if(m_Drag)
	{
        CDrawDoc *pDoc=GetDocument();
		CPen NewPen,*pOldPen;
		NewPen.CreatePen(pDoc->m_pStyle,pDoc->m_pWidth,pDoc->m_pColor);
		pOldPen=dc.SelectObject(&NewPen);

        CBrush NewBrush,*pOldBrush;
		if(pDoc->m_FFlag)
		{
            if(pDoc->m_HFlag==0)
		        NewBrush.CreateSolidBrush(pDoc->m_FColor);
	        else
		        NewBrush.CreateHatchBrush(pDoc->m_Hatch,pDoc->m_FColor);
	        pOldBrush=dc.SelectObject(&NewBrush);
		}

		dc.SetROP2(R2_NOT);

		if(pDoc->CurrentDraw==DRAW_VCLINE)
		{
			dc.MoveTo(m_pOrigin);
		    dc.LineTo(m_pPrev);
		    dc.MoveTo(m_pOrigin);
		    dc.LineTo(point);
        }
		if(pDoc->CurrentDraw==DRAW_RECTANGLE)
		{
			dc.Rectangle(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);
            dc.Rectangle(m_pOrigin.x,m_pOrigin.y,point.x,point.y);
		}
		if(pDoc->CurrentDraw==DRAW_VCCIRCLE)
		{
            dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);
			Squaring(m_pOrigin,point);
            dc.Ellipse(m_pOrigin.x,m_pOrigin.y,point.x,point.y);
		}

		if(pDoc->CurrentDraw==DRAW_VCELLIPSE)
		{
			dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);
	        dc.Ellipse(m_pOrigin.x,m_pOrigin.y,point.x,point.y);
		}

		m_pPrev=point;
	    dc.SelectObject(pOldPen);
 		if(pDoc->m_FFlag) dc.SelectObject(pOldBrush);
	}
	
	CScrollView::OnMouseMove(nFlags, point);
}

void CDrawView::OnInitialUpdate() 
{
	CSize sizeTotal;
	sizeTotal.cx = 640;	sizeTotal.cy = 480;
	SetScrollSizes(MM_TEXT, sizeTotal);
	// TODO: Add your specialized code here and/or call the base class
	
}

void CDrawView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
	dc.SelectStockObject(NULL_BRUSH);
	CDrawDoc *pDoc=GetDocument();
    CShape *pShape;
	ReleaseCapture();
	ClipCursor(NULL);
	CPen NewPen,*pOldPen;
	NewPen.CreatePen(pDoc->m_pStyle,pDoc->m_pWidth,pDoc->m_pColor);
	pOldPen=dc.SelectObject(&NewPen);
	CBrush NewBrush,*pOldBrush;
	if(pDoc->m_FFlag)
	{
        if(pDoc->m_HFlag==0)
	        NewBrush.CreateSolidBrush(pDoc->m_FColor);
        else
	        NewBrush.CreateHatchBrush(pDoc->m_Hatch,pDoc->m_FColor);
        pOldBrush=dc.SelectObject(&NewBrush);
	}

	if(pDoc->CurrentDraw==DRAW_POLYGON && m_Num>2)
	{
        dc.Polygon(points,m_Num);
        pShape=new CPolygon(points,m_Num,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor,
		    pDoc->m_FFlag,pDoc->m_FColor,pDoc->m_HFlag,pDoc->m_Hatch);
        pDoc->AddShape(pShape);
	}

	if(pDoc->CurrentDraw==DRAW_BEZIER && m_Num>=4)
	{
        dc.PolyBezier(points,m_Num);
	    pShape=new CBezier(points,m_Num,pDoc->m_pWidth,pDoc->m_pStyle,pDoc->m_pColor);
	    pDoc->AddShape(pShape);
	}

	m_Num=0;
	dc.SelectObject(pOldPen);
  	if(pDoc->m_FFlag) dc.SelectObject(pOldBrush);
//	pDoc->UpdateAllViews(NULL);

	CScrollView::OnRButtonDown(nFlags, point);
}

void CDrawView::Squaring(CPoint pFirst,CPoint &pSecond)
{
	int tempx,tempy;
    tempx=(pFirst.x<pSecond.x)?(pSecond.x-pFirst.x):(pFirst.x-pSecond.x);
    tempy=(pFirst.y<pSecond.y)?(pSecond.y-pFirst.y):(pFirst.y-pSecond.y);
	if(tempx<tempy)
	   if(pFirst.x<pSecond.x)
		   pSecond.x=pFirst.x+tempy;
	   else
		   pSecond.x=pFirst.x-tempy;
	else
	   if(pFirst.y<pSecond.y)
	       pSecond.y=pFirst.y+tempx;
	   else
		   pSecond.y=pFirst.y-tempx;
}





⌨️ 快捷键说明

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