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