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

📄 2dgraphview.cpp

📁 098u09ur3人味儿味儿 惹我而为人沃尔沃而人为
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		pDoc->m_Eraser[i][3] = point.y+8;
		pDoc->m_nEraserNum ++;
	}

	if(m_bLine||m_bPolyline||m_bPolygon)//程序处于画线段或折线或画多边形状态时,拉出橡皮线
	{
		if(m_nStep != 0)//只有在起点已定而终点未定时,才拉出橡皮线
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nEndX != 0)
			{
				dc.MoveTo(m_nStartX,m_nStartY);
				dc.LineTo(m_nEndX,m_nEndY);
			}

			m_nEndX = point.x;
			m_nEndY = point.y;//更新终点坐标

			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(m_nEndX,m_nEndY);//画出新的线段
		}
	}

	if(m_bRect)//程序处于画矩形状态
	{
		if(m_nStep != 0)//此时矩形第一个顶点已定而第二个顶点未定
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nEndX != 0)
				dc.Rectangle(m_nStartX,m_nStartY,m_nEndX,m_nEndY);
			
			m_nEndX = point.x;
			m_nEndY = point.y;//更新第二个顶点坐标
			
			dc.Rectangle(m_nStartX,m_nStartY,m_nEndX,m_nEndY);//画出新的矩形
		}
	}

	if(m_bCircle)//程序处于画圆状态
	{
		if(m_nStep != 0)//此时圆的圆心已定而半径未定
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nEndX != 0)
			{
				dc.MoveTo(m_nStartX,m_nStartY);
				dc.LineTo(m_nEndX,m_nEndY);//画出半径
				m_radius=(int)sqrt((m_nEndX-m_nStartX)*(m_nEndX-m_nStartX)+(m_nEndY-m_nStartY)*(m_nEndY-m_nStartY));
				dc.Ellipse(m_nStartX-m_radius,m_nStartY-m_radius,m_nStartX+m_radius,m_nStartY+m_radius);
			}
			m_nEndX = point.x;
			m_nEndY = point.y;//更新第二个顶点坐标,从而更新半径
			
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(m_nEndX,m_nEndY);//画出新的半径
			m_radius=(int)sqrt((m_nEndX-m_nStartX)*(m_nEndX-m_nStartX)+(m_nEndY-m_nStartY)*(m_nEndY-m_nStartY));
			dc.Ellipse(m_nStartX-m_radius,m_nStartY-m_radius,m_nStartX+m_radius,m_nStartY+m_radius);
		}
	}
	if(m_bEllipse)//程序处于画椭圆状态
	{
		if(m_nStep != 0)//此时椭圆外切矩形第一个顶点已定而第二个顶点未定
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nEndX != 0)
				dc.Ellipse(m_nStartX,m_nStartY,m_nEndX,m_nEndY);
			
			m_nEndX = point.x;
			m_nEndY = point.y;//更新第二个顶点坐标
			
			dc.Ellipse(m_nStartX,m_nStartY,m_nEndX,m_nEndY);//画出新的椭圆
		}
	}

	if(m_bTrigon)//程序处于画三角形状态
	{
		if(m_nStep == 1)//三角形第一个顶点已定
		{
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nStartX2 != 0)
			{
				dc.MoveTo(m_nStartX,m_nStartY);
				dc.LineTo(m_nStartX2,m_nStartY2);
			}

			m_nStartX2 = point.x;
			m_nStartY2 = point.y;//更新终点坐标

			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(m_nStartX2,m_nStartY2);//画出新的线段
		}
		else if(m_nStep == 2)//此时三角形已确定了两个顶点而第三个顶点未定
		{
			dc.MoveTo(m_nStartX,m_nStartY);
			dc.LineTo(m_nStartX2,m_nStartY2);
			dc.SetROP2(R2_NOTXORPEN);//设置线条模式
			if(m_nEndX != 0)
			{
				POINT m_Trigon[3]={{m_nStartX,m_nStartY},{m_nStartX2,m_nStartY2},{m_nEndX,m_nEndY}};
				dc.Polygon(m_Trigon,3);;
			}

			m_nEndX = point.x;
			m_nEndY = point.y;//更新终点坐标

			POINT m_Trigon[3]={{m_nStartX,m_nStartY},{m_nStartX2,m_nStartY2},{m_nEndX,m_nEndY}};
			dc.Polygon(m_Trigon,3);;//画出新的线段
		}
	}


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

void CMy2DGRAPHView::OnGraphCircle() 
{
	// TODO: Add your command handler code here
	m_bCircle = TRUE;//允许画点	

	m_bLine = FALSE;
	m_bFillcolor = FALSE;
	m_bPoint = FALSE;
	m_bPolyline = FALSE;
	m_bPolygon = FALSE;
	m_bEllipse = FALSE;
	m_bBackColor = FALSE;
	m_bRect = FALSE;
	m_bEraser = FALSE;
	m_bTrigon = FALSE;//禁止其他操作	
}

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

void CMy2DGRAPHView::OnLButtonDblClk(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);
	
	POINT (*pm_Polygon)[100]=&m_Polygon;
	if(m_bPolyline)
	{
		m_nStep = 0;//操作步数归零
		m_nStartX = m_nStartY = 0;//起点坐标归零
		m_nEndX = m_nEndY = 0;//终点坐标归零
		::ReleaseCapture();//释放鼠标
		pDoc->SetModifiedFlag();//记录文件“脏”标志
	}
	if(m_bPolygon)
	{
		m_Polygon[m_nStep].x = point.x;
		m_Polygon[m_nStep].y = point.y;
		dc.Polygon(m_Polygon,m_nStep+1);

		int i = pDoc->m_nPolygonNum;
		pDoc->m_Polygon[i][m_nStep].x = point.x;
		pDoc->m_Polygon[i][m_nStep].y = point.y;
		pDoc->m_nSideNum[i] = m_nStep+1;
		pDoc->m_PLogPen[i] = m_LogPen;
		pDoc->m_PLogBrush[i] = m_LogBrush;
		pDoc->m_nPolygonNum ++;

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

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

void CMy2DGRAPHView::OnSetLinewidth() 
{
	// TODO: Add your command handler code here
	CLineWidthDlg	dlg;
	dlg.m_nLineWidth = m_LogPen.lopnWidth.x;

	if(dlg.DoModal() == IDOK)
		m_LogPen.lopnWidth.x = dlg.m_nLineWidth;
}

void CMy2DGRAPHView::OnSetLineColor() 
{
	// TODO: Add your command handler code here
	CColorDialog	dlg;

	if(dlg.DoModal() == IDOK)
		m_LogPen.lopnColor = dlg.GetColor();
}

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

void CMy2DGRAPHView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//获取设备环境

	if(m_bEraser)
		m_nStep = 0;
	CView::OnLButtonUp(nFlags, point);
}

void CMy2DGRAPHView::OnSetBrushColor() 
{
	// TODO: Add your command handler code here
	CColorDialog	dlg;

	if(dlg.DoModal() == IDOK)
	{
		m_LogBrush.lbColor = dlg.GetColor();
		m_LogBrush.lbStyle = BS_SOLID;
		m_bBNull = FALSE;
	}
}

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

void CMy2DGRAPHView::OnSetLinestyle() 
{
	// TODO: Add your command handler code here
	CLineStyleDlg	dlg;
	dlg.m_nLineStyle = m_LogPen.lopnStyle;	//弹出设置线型对话框

	if(dlg.DoModal() == IDOK)	//弹出设置线型对话框
		m_LogPen.lopnStyle = dlg.m_nLineStyle;
}

BOOL CMy2DGRAPHView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bLine||m_bCircle||m_bEllipse||m_bPolyline||m_bPolygon||m_bRect||m_bTrigon)
	{
		HCURSOR hCursor;

		hCursor = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
		SetCursor(hCursor);

		return TRUE;
	}
	else if(m_bEraser)
	{
		HCURSOR hCursor;

		hCursor = AfxGetApp()->LoadCursor(IDC_EraserCURSOR);
		SetCursor(hCursor);

		return TRUE;
	}
	else if(m_bFillcolor)
	{
		HCURSOR hCursor;

		hCursor = AfxGetApp()->LoadCursor(IDC_FillCURSOR);
		SetCursor(hCursor);

		return TRUE;
	}
	return CView::OnSetCursor(pWnd, nHitTest, message);
}

void CMy2DGRAPHView::OnCleanscreen() 
{
	// TODO: Add your command handler code here
	CClientDC dc(this);//获取设备环境
	CMy2DGRAPHDoc* pDoc = GetDocument();//获取文档指针

	m_bPolygon = FALSE;		
	m_bEllipse = FALSE;
	m_bPolyline = FALSE;
	m_bLine = FALSE;
	m_bPoint = FALSE;
	m_bRect = FALSE;
	m_bTrigon = FALSE;
	m_bCircle = FALSE;
	m_bEraser = FALSE;
	m_bFillcolor = FALSE;
	m_bBackColor = FALSE;

	CBrush NewBrush(BackColor);
	CBrush * pOldBrush = dc.SelectObject(&NewBrush);

	RECT Rect;
	GetClientRect(&Rect);
	dc.Rectangle(&Rect);

	pDoc->m_nPointNum = 0;
	pDoc->m_nLineNum = 0;
	pDoc->m_nEllipseNum = 0;
	pDoc->m_nRectNum = 0;
	pDoc->m_nCircleNum = 0;
	pDoc->m_nTrigonNum = 0;
	pDoc->m_nPolygonNum = 0;
	pDoc->SetModifiedFlag();//记录文件“脏”标志
}

void CMy2DGRAPHView::OnSetBrushNull() 
{
	// TODO: Add your command handler code here
	m_LogBrush.lbStyle = BS_NULL;
	m_bBNull = TRUE;
}

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

void CMy2DGRAPHView::OnSetBackcolor() 
{
	// TODO: Add your command handler code here
	CClientDC dc(this);//获取设备环境
	CMy2DGRAPHDoc* pDoc = GetDocument();//获取文档指针

	m_bBackColor = TRUE;	
	
	m_bEllipse = FALSE;
	m_bEraser = FALSE;
	m_bFillcolor = FALSE;
	m_bCircle = FALSE;
	m_bPolyline = FALSE;
	m_bPolygon = FALSE;
	m_bPoint = FALSE;
	m_bLine = FALSE;
	m_bRect = FALSE;
	m_bTrigon = FALSE;
	m_bEraser = FALSE;//禁止其他操作

	CColorDialog	dlg;
	if(dlg.DoModal() == IDOK)
	{
		BackColor = dlg.GetColor();
		pDoc->m_BackColor = dlg.GetColor();
	}
	CPen NewPen(PS_SOLID,1,BackColor);
	CPen *pOldPen=dc.SelectObject(&NewPen);	
	CBrush NewBrush(BackColor);
	CBrush * pOldBrush = dc.SelectObject(&NewBrush);
	RECT Rect;
	GetClientRect(&Rect);
	dc.Rectangle(&Rect);

	CDC* pDC;
	pDC = GetDC();
	OnDraw(pDC);

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

void CMy2DGRAPHView::OnFillcolor() 
{
	// TODO: Add your command handler code here
	m_bFillcolor = TRUE;//允许填色
	CColorDialog	dlg;
	if(dlg.DoModal() == IDOK)
	{
		m_LogBrush.lbColor = dlg.GetColor();
		m_LogBrush.lbStyle = BS_SOLID;
		m_bBNull = FALSE;
	}

	m_bLine = FALSE;
	m_bPoint = FALSE;
	m_bCircle = FALSE;
	m_bBackColor = FALSE;
	m_bPolyline = FALSE;
	m_bPolygon = FALSE;
	m_bEllipse = FALSE;
	m_bRect = FALSE;
	m_bEraser = FALSE;
	m_bTrigon = FALSE;//禁止其他操作	
}

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

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

⌨️ 快捷键说明

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