📄 2dgraphview.cpp
字号:
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 + -