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

📄 2dgraphview.cpp

📁 098u09ur3人味儿味儿 惹我而为人沃尔沃而人为
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	m_bTrigon = TRUE;//允许画三角形	
	
	m_bEllipse = FALSE;
	m_bCircle = FALSE;
	m_bPolyline = FALSE;
	m_bFillcolor = FALSE;
	m_bLine = FALSE;
	m_bPoint = FALSE;
	m_bRect = FALSE;
	m_bBackColor = FALSE;
	m_bEraser = FALSE;
	m_bPolygon = FALSE;//禁止其他操作		
}

void CMy2DGRAPHView::OnGraphPolyline() 
{
	// TODO: Add your command handler code here
	m_bPolyline = TRUE;//允许画折线	
	
	m_bEllipse = FALSE;
	m_bCircle = FALSE;
	m_bPolygon = FALSE;
	m_bFillcolor = FALSE;
	m_bLine = FALSE;
	m_bPoint = FALSE;
	m_bBackColor = FALSE;
	m_bRect = FALSE;
	m_bEraser = FALSE;
	m_bTrigon = FALSE;//禁止其他操作	
}

void CMy2DGRAPHView::OnUpdateGraphEllipse(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bEllipse);
}

void CMy2DGRAPHView::OnUpdateGraphLine(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bLine);
}

void CMy2DGRAPHView::OnUpdateGraphPoint(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bPoint);	
}

void CMy2DGRAPHView::OnUpdateGraphPolygon(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bPolygon);
}

void CMy2DGRAPHView::OnUpdateGraphPolyline(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bPolyline);
}

void CMy2DGRAPHView::OnUpdateGraphRect(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bRect);
}

void CMy2DGRAPHView::OnUpdateGraphTrigon(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetRadio(m_bTrigon);
}

void CMy2DGRAPHView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//获取设备环境
	CMy2DGRAPHDoc* pDoc = GetDocument();//获取文档指针
	
	CPen NewPen;
	NewPen.CreatePenIndirect(&m_LogPen);
	CPen *pOldPen=dc.SelectObject(&NewPen);
	CBrush NewBrush;
	NewBrush.CreateBrushIndirect(&m_LogBrush);
	CBrush * pOldBrush = dc.SelectObject(&NewBrush);

	if(m_bFillcolor)//如果程序处于填色状态
	{
		int FillColor = dc.GetPixel(point);
		dc.ExtFloodFill(point.x,point.y,FillColor,FLOODFILLSURFACE);
		int i = pDoc->m_nFillNum;
		pDoc->m_Fill[i][0] = point.x;
		pDoc->m_Fill[i][1] = point.y;
		pDoc->m_Fill[i][2] = FillColor;
		pDoc->m_nFillNum ++;

		FillColor = dc.GetPixel(point);
		dc.ExtFloodFill(point.x,point.y,FillColor,FLOODFILLSURFACE);
		i = pDoc->m_nFillNum;
		pDoc->m_Fill[i][0] = point.x;
		pDoc->m_Fill[i][1] = point.y;
		pDoc->m_Fill[i][2] = FillColor;
		pDoc->m_nFillNum ++;
	}

	if(m_bPoint)//如果程序处于画点状态
	{
		dc.Ellipse(point.x-2,point.y-2,point.x+2,point.y+2);

		int i = pDoc->m_nPointNum;
		pDoc->m_Point[i][0] = point.x;
		pDoc->m_Point[i][1] = point.y;
		pDoc->m_nPointNum ++;

		pDoc->SetModifiedFlag();//记录文件“脏”标志
	}

	if(m_bLine)	//如果程序处于画线段状态
	{
		if(m_nStep == 0)//如果是线段起点,则记录起点坐标
		{
			m_nStartX = point.x;
			m_nStartY = point.y;

			m_nStep ++;//操作步数加1,表示起点已确定
			SetCapture();//捕捉鼠标
		}
		else//如果是线段终点,则画出线段
		{
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(point.x,point.y);

			//修改文档中的数据成员
			int i=pDoc->m_nLineNum;
			pDoc->m_Line[i][0] = m_nStartX;
			pDoc->m_Line[i][1] = m_nStartY;
			pDoc->m_Line[i][2] = point.x;
			pDoc->m_Line[i][3] = point.y;
			pDoc->m_Line[i][4] = m_LogPen.lopnStyle;
			pDoc->m_Line[i][5] = m_LogPen.lopnWidth.x;
			pDoc->m_Line[i][6] = m_LogPen.lopnColor;
			pDoc->m_nLineNum ++;

			m_nStep = 0;//操作步数归零
			m_nStartX = m_nStartY = 0;//起点坐标归零
			m_nEndX = m_nEndY = 0;//终点坐标归零
			::ReleaseCapture();//释放鼠标
			pDoc->SetModifiedFlag();//记录文件“脏”标志
		}
	}

	if(m_bPolyline)//如果程序处于画折线状态
	{
		if(m_nStep == 0)//如果是线段起点,则记录起点坐标
		{
			m_nStartX = point.x;
			m_nStartY = point.y;
			m_nStep ++;//操作步数加1,表示起点已确定

			SetCapture();//捕捉鼠标
		}
		else
		{
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(point.x,point.y);

			//修改文档中的数据成员
			int i=pDoc->m_nLineNum;
			pDoc->m_Line[i][0] = m_nStartX;
			pDoc->m_Line[i][1] = m_nStartY;
			pDoc->m_Line[i][2] = point.x;
			pDoc->m_Line[i][3] = point.y;
			pDoc->m_Line[i][4] = m_LogPen.lopnStyle;
			pDoc->m_Line[i][5] = m_LogPen.lopnWidth.x;
			pDoc->m_Line[i][6] = m_LogPen.lopnColor;
			pDoc->m_nLineNum ++;

			m_nStartX = point.x;
			m_nStartY = point.y;
		}
	}

	if(m_bPolygon)//如果程序处于画多边形状态
	{
		m_Polygon[m_nStep].x = point.x;
		m_Polygon[m_nStep].y = point.y;

		int i=pDoc->m_nPolygonNum;
		pDoc->m_Polygon[i][m_nStep].x = point.x;
		pDoc->m_Polygon[i][m_nStep].y = point.y;

		if(m_nStep == 0)//如果是线段起点,则记录起点坐标
		{
			m_nStartX = point.x;
			m_nStartY = point.y;

			SetCapture();//捕捉鼠标
		}
		else
		{
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(point.x,point.y);

			m_nStartX = point.x;
			m_nStartY = point.y;
		}
		m_nStep ++;//操作步数加1
	}
	if(m_bRect)//如果程序处于画矩形状态
	{
		if(m_nStep == 0)
		{
			m_nStartX = point.x;
			m_nStartY = point.y;//记下圆心坐标

			m_nStep ++;//操作步数加1,表示圆心已确定
			SetCapture();//捕捉鼠标
		}
		else
		{
			dc.Rectangle(m_nStartX,m_nStartY,point.x,point.y);

			//修改文档中的数据成员
			int i=pDoc->m_nRectNum;
			pDoc->m_Rect[i][0] = m_nStartX;
			pDoc->m_Rect[i][1] = m_nStartY;
			pDoc->m_Rect[i][2] = point.x;
			pDoc->m_Rect[i][3] = point.y;
			pDoc->m_RLogPen[i] = m_LogPen;
			pDoc->m_RLogBrush[i] = m_LogBrush;
			pDoc->m_nRectNum ++;

			m_nStep = 0;//操作步数归零
			m_nStartX = m_nStartY = 0;//起点坐标归零
			m_nEndX = m_nEndY = 0;//终点坐标归零
			::ReleaseCapture();//释放鼠标
			pDoc->SetModifiedFlag();//记录文件“脏”标志
		}
	}

	if(m_bCircle)//如果程序处于画圆状态
	{
		if(m_nStep == 0)
		{
			m_nStartX = point.x;
			m_nStartY = point.y;

			m_nStep ++;//操作步数加1,表示圆的圆心已确定
			SetCapture();//捕捉鼠标
		}
		else
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(m_nEndX,m_nEndY);
			dc.SetROP2(R2_COPYPEN);
			m_radius=(int)sqrt((point.x-m_nStartX)*(point.x-m_nStartX)+(point.y-m_nStartY)*(point.y-m_nStartY));
			dc.Ellipse(m_nStartX-m_radius,m_nStartY-m_radius,m_nStartX+m_radius,m_nStartY+m_radius);

			//修改文档中的数据成员
			int i=pDoc->m_nCircleNum;
			pDoc->m_Circle[i][0] = m_nStartX-m_radius;
			pDoc->m_Circle[i][1] = m_nStartY-m_radius;
			pDoc->m_Circle[i][2] = m_nStartX+m_radius;
			pDoc->m_Circle[i][3] = m_nStartY+m_radius;
			pDoc->m_CLogPen[i] = m_LogPen;
			pDoc->m_CLogBrush[i] = m_LogBrush;
			pDoc->m_nCircleNum ++;

			m_nStep = 0;//操作步数归零
			m_nStartX = m_nStartY = 0;//圆心坐标归零
			m_nEndX = m_nEndY = 0;//终点坐标归零
			m_radius = 0;//半径归零	
			::ReleaseCapture();//释放鼠标
			pDoc->SetModifiedFlag();//记录文件“脏”标志
		}
	}

	if(m_bEllipse)//如果程序处于画椭圆状态
	{
		if(m_nStep == 0)
		{
			m_nStartX = point.x;
			m_nStartY = point.y;

			m_nStep ++;//操作步数加1,表示椭圆外切矩形第一个顶点已确定
			SetCapture();//捕捉鼠标
		}
		else
		{
			dc.Ellipse(m_nStartX,m_nStartY,point.x,point.y);

			//修改文档中的数据成员
			int i=pDoc->m_nEllipseNum;
			pDoc->m_Ellipse[i][0] = m_nStartX;
			pDoc->m_Ellipse[i][1] = m_nStartY;
			pDoc->m_Ellipse[i][2] = point.x;
			pDoc->m_Ellipse[i][3] = point.y;
			pDoc->m_Ellipse[i][4] = m_LogPen.lopnStyle;
			pDoc->m_Ellipse[i][5] = m_LogPen.lopnWidth.x;
			pDoc->m_Ellipse[i][6] = m_LogPen.lopnColor;
			pDoc->m_ELogBrush[i] = m_LogBrush;
			pDoc->m_nEllipseNum ++;

			m_nStep = 0;//操作步数归零
			m_nStartX = m_nStartY = 0;//起点坐标归零
			m_nEndX = m_nEndY = 0;//终点坐标归零
			::ReleaseCapture();//释放鼠标
			pDoc->SetModifiedFlag();//记录文件“脏”标志
		}
	}

	if(m_bTrigon)//如果程序处于画三角形状态
	{
		if(m_nStep == 0)
		{
			m_nStartX = point.x;
			m_nStartY = point.y;

			m_nStep ++;//操作步数加1,表示三角形第一个顶点已确定
			SetCapture();//捕捉鼠标
		}
		else if(m_nStep == 1)
		{
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(point.x,point.y);

			m_nStartX2 = point.x;
			m_nStartY2 = point.y;
			m_nStep ++;//操作步数加1,表示三角形第二个顶点已确定
		}
		else
		{
			POINT m_Trigon[3]={{m_nStartX,m_nStartY},{m_nStartX2,m_nStartY2},{point.x,point.y}};
			dc.Polygon(m_Trigon,3);;

			//修改文档中的数据成员
			int i=pDoc->m_nTrigonNum;
			pDoc->m_Trigon[i][0] = m_nStartX;
			pDoc->m_Trigon[i][1] = m_nStartY;
			pDoc->m_Trigon[i][2] = m_nStartX2;
			pDoc->m_Trigon[i][3] = m_nStartY2;
			pDoc->m_Trigon[i][4] = point.x;
			pDoc->m_Trigon[i][5] = point.y;
			pDoc->m_TLogPen[i] = m_LogPen;
			pDoc->m_TLogBrush[i] = m_LogBrush;
			pDoc->m_nTrigonNum ++;

			m_nStep = 0;//操作步数归零
			m_nStartX = m_nStartY = 0;
			m_nStartX2 = m_nStartY2 = 0;//起点坐标归零
			m_nEndX = m_nEndY = 0;//终点坐标归零
			::ReleaseCapture();//释放鼠标
			pDoc->SetModifiedFlag();//记录文件“脏”标志
		}
	}

	if(m_bEraser)
	{
		CPen NewPen(PS_SOLID,1,BackColor);
		CPen *pOldPen=dc.SelectObject(&NewPen);
		CBrush NewBrush(BackColor);
		CBrush * pOldBrush = dc.SelectObject(&NewBrush);

		dc.Rectangle(point.x-8,point.y-8,point.x+8,point.y+8);

		//修改文档中的数据成员
		int i=pDoc->m_nEraserNum;
		pDoc->m_Eraser[i][0] = point.x-8;
		pDoc->m_Eraser[i][1] = point.y-8;
		pDoc->m_Eraser[i][2] = point.x+8;
		pDoc->m_Eraser[i][3] = point.y+8;
		pDoc->m_nEraserNum ++;

		m_nStep ++;
		pDoc->SetModifiedFlag();//记录文件“脏”标志
	}

	dc.SelectObject(pOldPen);
	dc.SelectObject(pOldBrush);
	CView::OnLButtonDown(nFlags, point);
}

void CMy2DGRAPHView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//获取设备环境
	CMy2DGRAPHDoc* pDoc = GetDocument();//获取文档指针

	CPen NewPen;
	NewPen.CreatePenIndirect(&m_LogPen);
	CPen *pOldPen=dc.SelectObject(&NewPen);
	CBrush NewBrush;
	NewBrush.CreateBrushIndirect(&m_LogBrush);
	CBrush * pOldBrush = dc.SelectObject(&NewBrush);

	//在状态栏的第二个窗格中显示鼠标当前位置的坐标
	CString str;
	CStatusBar* pStatus;

	pStatus = (CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);//获得状态栏窗口指针
	
	if(pStatus)
	{
		str.Format("x = %3d, y= %3d",point.x,point.y);
		pStatus->SetPaneText(1,str);
	}

	if(m_bEraser && m_nStep == 1)
	{
		CPen NewPen(PS_SOLID,1,BackColor);
		CPen *pOldPen=dc.SelectObject(&NewPen);
		CBrush NewBrush(BackColor);
		CBrush * pOldBrush = dc.SelectObject(&NewBrush);

		dc.Rectangle(point.x-8,point.y-8,point.x+8,point.y+8);

		//修改文档中的数据成员
		int i=pDoc->m_nEraserNum;
		pDoc->m_Eraser[i][0] = point.x-8;
		pDoc->m_Eraser[i][1] = point.y-8;
		pDoc->m_Eraser[i][2] = point.x+8;

⌨️ 快捷键说明

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