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

📄 drawsempleview.cpp

📁 MFC简易绘图
💻 CPP
字号:
// DrawSempleView.cpp : implementation of the CDrawSempleView class
//

#include "stdafx.h"
#include "DrawSemple.h"
#include "math.h"

#include "Line.h"
#include "Ellipse.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Tuyuan.h"
#include "List.h"

#include "DrawSempleDoc.h"
#include "DrawSempleView.h"
#include"DrawSempleDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


CList L;
CTuyuan * xuanding=NULL;

/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView

IMPLEMENT_DYNCREATE(CDrawSempleView, CView)

BEGIN_MESSAGE_MAP(CDrawSempleView, CView)
	//{{AFX_MSG_MAP(CDrawSempleView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_CONTEXTMENU()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView construction/destruction

CDrawSempleView::CDrawSempleView()
{
	// TODO: add construction code here
	m_bDragging=false;  //初始化拖拽标记
	m_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//获得十字光标句柄
}

CDrawSempleView::~CDrawSempleView()
{
}

BOOL CDrawSempleView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView drawing

void CDrawSempleView::OnDraw(CDC* pDC)
{
	CDrawSempleDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CString	strCoins;
	//先获得主窗口指针,再获得状态栏指针
	CStatusBar * pStatus=(CStatusBar *)AfxGetApp()->m_pMainWnd->
		GetDescendantWindow(ID_VIEW_STATUS_BAR);
	if(pStatus)
	{
		strCoins.Format("总图元:%d",CTuyuan::Tcount);  //设置要显示的信息
		pStatus->SetPaneText(1,strCoins);   //显示硬币数量,画板编号从0开始
		strCoins.Format("直线:%d",CLine::Lcount);  //设置要显示的信息
		pStatus->SetPaneText(2,strCoins);   //显示硬币数量,画板编号从0开始
		strCoins.Format("椭圆:%d",CEllipse::Ecount);  //设置要显示的信息
		pStatus->SetPaneText(3,strCoins);   //显示硬币数量,画板编号从0开始
		strCoins.Format("圆:%d",CCircle::Ccount);  //设置要显示的信息
		pStatus->SetPaneText(4,strCoins);   //显示硬币数量,画板编号从0开始
		strCoins.Format("矩形:%d",CRectangle::Rcount);  //设置要显示的信息
		pStatus->SetPaneText(5,strCoins);   //显示硬币数量,画板编号从0开始
	}
	L.DrawAll(pDC);
	if(xuanding!=NULL)
	{
	//	CPen *pOldPen,*pNewPen;
		CPoint pt1,pt2;
		pt1=xuanding->Getpt1();
		pt2=xuanding->Getpt2();
	//	pDC->SetROP2(R2_NOTXORPEN);
	//	pNewPen=new CPen(PS_SOLID,1,RGB(0,0,0));
	//	pOldPen = pDC->SelectObject(pNewPen);
		CBrush aPen2(RGB(255,255,0));
		CBrush *pOldBrush = pDC->SelectObject(&aPen2);
		pDC->Ellipse(pt1.x-4,pt1.y-4,pt1.x+4,pt1.y+4);
		pDC->Ellipse(pt2.x-4,pt2.y-4,pt2.x+4,pt2.y+4);
	}
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView diagnostics

#ifdef _DEBUG
void CDrawSempleView::AssertValid() const
{
	CView::AssertValid();
}

void CDrawSempleView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView message handlers

CPoint ptOrg,ptStart,ptEnd;

void CDrawSempleView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
//	CClientDC  dc(this);
//	OnPrepareDC(&dc);    //调整设备环境的属性
//	dc.DPtoLP(&point);   //将设备坐标转换为逻辑坐标
//	CDC *pDC=GetDC();
//	L.DrawAll(pDC);
	switch(CDrawSempleDoc::flage)
	//if(CDrawSempleDoc::flage!=0 && CDrawSempleDoc::ifxuanding==false)
	{	
	case 1:
	case 2:
	case 3:
	case 4:
		{
			CDC *pDC=GetDC();
			SetCapture();  //捕捉鼠标
			m_hCross=AfxGetApp()->LoadCursor(IDC_SHIZI);
			::SetCursor(m_hCross);//设置十字光标
			m_ptOrigin=point;
			ptOrg=m_ptOrigin;
			m_bDragging=TRUE;     //设置拖拽标记
			break;
		}
	case 11:
		{
			CDC *pDC=GetDC();
			SetCapture();  //捕捉鼠标
			m_hCross=AfxGetApp()->LoadCursor(IDC_HAND);
			::SetCursor(m_hCross);//设置十字光标
			m_ptOrigin=point;
			ptOrg=m_ptOrigin;
			m_bDragging=TRUE;     //设置拖拽标记
			break;
		}
	case 12:
	case 13:
	case 14:
		if(xuanding!=NULL)
		{	
			ptStart=xuanding->Getpt1();
			ptEnd=xuanding->Getpt2();
			if((point.x<=ptStart.x && point.x>=ptEnd.x && 
				point.y<=ptStart.y && point.y>=ptEnd.y)||
				(point.x>=ptStart.x && point.x<=ptEnd.x&& 
				point.y>=ptStart.y && point.y<=ptEnd.y))
			{
				CDC *pDC=GetDC();
				SetCapture();  //捕捉鼠标
				m_hCross=AfxGetApp()->LoadCursor(IDC_HAND);
				::SetCursor(m_hCross);//设置十字光标
				m_ptOrigin=point;
				ptOrg=m_ptOrigin;
				m_bDragging=TRUE;     //设置拖拽标记
			}		
		}
		break;
	default:
		break;
	}
	CView::OnLButtonDown(nFlags, point);
}

void CDrawSempleView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC=GetDC();
	if(m_bDragging)
	{
		m_bDragging=false;   //清拖拽标记
		ReleaseCapture();    //释放鼠标,还原鼠标形状
		CDC *pDC=GetDC();
		int t=CDrawSempleDoc::flageline;
		COLORREF rgb=RGB(CDrawSempleDoc::r,CDrawSempleDoc::g,CDrawSempleDoc::b);
		COLORREF rgbB=RGB(255,255,255);
		switch(CDrawSempleDoc::flage)
		{
		case 1:
			{
				CLine *line=new CLine(m_ptOrigin,point,t,rgb,rgbB);
				L.AddTuyuan(line);
				ptStart=m_ptOrigin;
				ptEnd=point;
				delete line;
				break;
			}
		case 2:
			{
				CEllipse *ellipse=new CEllipse(m_ptOrigin,point,t,rgb,rgbB);
				L.AddTuyuan(ellipse);
				delete ellipse;
				break;
			}
		case 3:
			{
				CCircle *circle=new CCircle(m_ptOrigin,point,t,rgb,rgbB);
				L.AddTuyuan(circle);
				delete circle;
				break;
			}
		case 4:
			{
				CRectangle *rectangle=new CRectangle(m_ptOrigin,point,t,rgb,rgbB);
				L.AddTuyuan(rectangle);
				delete rectangle;
				break;
			}
		case 11:
			{
				xuanding=L.XuanDing(m_ptOrigin,point);
				ptStart=m_ptOrigin;  //保存选定范围起点
				ptEnd=point;        //保存选定范围终点
				break;
			}
		case 12:
			if(xuanding!=NULL)
			{
				xuanding->Setpoint(m_ptOrigin,point);
				xuanding->DrawTuyuan(pDC);
			}
			break;
		case 13:
			if(xuanding!=NULL)
			{	L.DelTuyuan(xuanding);
				xuanding=NULL;
			}
			break;
		case 14:
			if(xuanding!=NULL)
			{	
				xuanding->SetStyBrushRGB(RGB(CDrawSempleDoc::r,CDrawSempleDoc::g,CDrawSempleDoc::b));
			}
			break;
		default:
			break;
		}
		CDrawSempleDoc * pDoc=GetDocument();  //获得文档对象的指针
		ASSERT_VALID(pDoc);		//测试文档对象是否运行有效
		pDoc->UpdateAllViews(NULL);
		L.DrawAll(pDC);
	}
	CView::OnLButtonUp(nFlags, point);
}

void CDrawSempleView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bDragging && CDrawSempleDoc::flage!=0)
	{
//		CDrawSempleDoc * pDoc=GetDocument();  //获得文档对象的指针
//		ASSERT_VALID(pDoc);		//测试文档对象是否运行有效
		CDC *pDC=GetDC();
		pDC->SetROP2(R2_NOTXORPEN);//R2_NOTXORPEN
		CPen *pOldPen,*pNewPen;
		int t=CDrawSempleDoc::flageline;
		pNewPen=new CPen(PS_SOLID,t,RGB(CDrawSempleDoc::r,CDrawSempleDoc::g,CDrawSempleDoc::b));
		pOldPen = pDC->SelectObject(pNewPen);	
		switch(CDrawSempleDoc::flage)
		{
		case 1:	
			pDC->MoveTo(m_ptOrigin);
			pDC->LineTo(ptOrg);//消除原来画的线
			pDC->MoveTo(m_ptOrigin);
			pDC->LineTo(point);
			ptOrg=point;//记录上次这次画线的终点
			pDC->SelectObject(pOldPen);
			delete pNewPen;
			break;
		case 2:
			pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,ptOrg.x,ptOrg.y);
			pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
			ptOrg=point;//记录上次这次画椭圆的终点
			pDC->SelectObject(pOldPen);
			delete pNewPen;
			break;
		case 3:
			int d,x,y;
			d=(int)sqrt((m_ptOrigin.x-ptOrg.x)*(m_ptOrigin.x-ptOrg.x)
				+(m_ptOrigin.y-ptOrg.y)*(m_ptOrigin.y-ptOrg.y))/2;
			x=(int)(m_ptOrigin.x+ptOrg.x)/2;
			y=(int)(m_ptOrigin.y+ptOrg.y)/2;
			pDC->Ellipse(x-d,y-d,x+d,y+d);
			d=(int)sqrt((m_ptOrigin.x-point.x)*(m_ptOrigin.x-point.x)
				+(m_ptOrigin.y-point.y)*(m_ptOrigin.y-point.y))/2;
			x=(int)(m_ptOrigin.x+point.x)/2;
			y=(int)(m_ptOrigin.y+point.y)/2;
			pDC->Ellipse(x-d,y-d,x+d,y+d);	
			ptOrg=point;//记录上次这次画圆的终点
			pDC->SelectObject(pOldPen);
			delete pNewPen;
			break;
		case 4:
			pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,ptOrg.x,ptOrg.y);
			pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
			ptOrg=point;//记录上次这次画矩形的终点
			pDC->SelectObject(pOldPen);
			delete pNewPen;
			break;
		case 11:
			pDC->SelectObject(pOldPen);
			delete pNewPen;
			pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,ptOrg.x,ptOrg.y);
			pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
			ptOrg=point;//记录上次这次画矩形的终点
			break;
		case 12:
			if(xuanding!=NULL)
			{
				pDC->SetROP2(R2_NOTXORPEN);//R2_NOTXORPEN
				CPen *pOldPen,*pNewPen;
				pNewPen=new CPen(PS_SOLID,1,RGB(0,0,0));
				pOldPen = pDC->SelectObject(pNewPen);	
				int dx,dy,ddx,ddy;
				dx=point.x-m_ptOrigin.x;
				dy=point.y-m_ptOrigin.y;
				ddx=ptOrg.x-m_ptOrigin.x;
				ddy=ptOrg.y-m_ptOrigin.y;
				CPoint dpt1,dpt2,ddpt1,ddpt2,pSta,pEnd;
				pSta=xuanding->Getpt1();
				pEnd=xuanding->Getpt2();
				dpt1.x=pSta.x+dx;
				dpt1.y=pSta.y+dy;
				dpt2.x=pEnd.x+dx;
				dpt2.y=pEnd.y+dy;
				ddpt1.x=pSta.x+ddx;
				ddpt1.y=pSta.y+ddy;
				ddpt2.x=pEnd.x+ddx;
				ddpt2.y=pEnd.y+ddy;
				int ft=xuanding->GetTflag();
				switch(ft)
				{
				case 1:	
					pDC->MoveTo(ddpt1);
					pDC->LineTo(ddpt2);//消除原来画的线
					pDC->MoveTo(dpt1);
					pDC->LineTo(dpt2);
					ptOrg=point;//记录上次这次画线的终点
					pDC->SelectObject(pOldPen);
					delete pNewPen;
					break;
				case 2:
					pDC->Ellipse(ddpt1.x,ddpt1.y,ddpt2.x,ddpt2.y);
					pDC->Ellipse(dpt1.x,dpt1.y,dpt2.x,dpt2.y);
					ptOrg=point;//记录上次这次画椭圆的终点
					pDC->SelectObject(pOldPen);
					delete pNewPen;
					break;
				case 3:
					int d,x,y;
					d=(int)sqrt((ddpt1.x-ddpt2.x)*(ddpt1.x-ddpt2.x)+
						(ddpt1.y-ddpt2.y)*(ddpt1.y-ddpt2.y))/2;
					x=(int)(ddpt1.x+ddpt2.x)/2;
					y=(int)(ddpt1.y+ddpt2.y)/2;
					pDC->Ellipse(x-d,y-d,x+d,y+d);
					d=(int)sqrt((dpt1.x-dpt2.x)*(dpt1.x-dpt2.x)+
						(dpt1.y-point.y)*(dpt1.y-dpt2.y))/2;
					x=(int)(dpt1.x+dpt2.x)/2;
					y=(int)(dpt1.y+dpt2.y)/2;
					pDC->Ellipse(x-d,y-d,x+d,y+d);	
					ptOrg=point;//记录上次这次画圆的终点
					pDC->SelectObject(pOldPen);
					delete pNewPen;
					break;
				case 4:
					pDC->Rectangle(ddpt1.x,ddpt1.y,ddpt2.x,ddpt2.y);
					pDC->Rectangle(dpt1.x,dpt1.y,dpt2.x,dpt2.y);
					ptOrg=point;//记录上次这次画矩形的终点
					pDC->SelectObject(pOldPen);
					delete pNewPen;
					break;
				default:
					break;
				}
			//	L.DrawAll(pDC);
			//	movet->DrawTuyuan(pDC);
			//	delete movet;
			}
			break;
		default:
			break;
		}
	}
	CView::OnMouseMove(nFlags, point);
}

void CDrawSempleView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	CMenu	menuPopup;   //声明菜单对象
	if(menuPopup.CreatePopupMenu())  //创建一个弹出式菜单
	{
		//向菜单menuPopup 中添加菜单项
		menuPopup.AppendMenu(MF_STRING,ID_DRAW_LINE,"直线(&L)\tCtrl+L");
		menuPopup.AppendMenu(MF_STRING,ID_DRAW_ELLI,"椭圆(&E)\tCtrl+E");
		menuPopup.AppendMenu(MF_STRING,ID_DRAW_CIRCLE,"圆(&I)\tCtrl+I");
		menuPopup.AppendMenu(MF_STRING,ID_DRAW_RECT,"矩形(&T)\tCtrl+T");
		//显示弹出式菜单,并对用户选择的菜单项作出响应
		menuPopup.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
	}
}

⌨️ 快捷键说明

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