public void Draw(BMapControl c, Graphics g) { if (DrawMode != EditMode.None) { Point lastPoint = Point.Empty; if (LstMarkPoint.Count > 0) { lastPoint = c.LatLngToPoint(LstMarkPoint.Last()); } string editModeMsg = string.Empty; switch (DrawMode) { case EditMode.None: break; case EditMode.DrawLine: if (LstMarkPoint.Count == 1) { var p1 = c.LatLngToPoint(LstMarkPoint[0]); DrawDashLine(g, p1, _curMousePoint); } else if (LstMarkPoint.Count == 2) { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var p2 = c.LatLngToPoint(LstMarkPoint[1]); g.DrawLine(DrawPen, p1, p2); _drawCompleteToolTip.ShowPoint = p2; } editModeMsg = "画线模式(测距,测正北角)"; break; case EditMode.DrawLines: if (LstMarkPoint.Count > 0) { var lst = new List <Point>(); //double dist = 0; //var tempLatLng = new PointLatLng(); foreach (var item in LstMarkPoint) { lst.Add(c.LatLngToPoint(item)); } if (lst.Count > 1) { g.DrawLines(DrawPen, lst.ToArray()); } } if (IsCompleted) { _drawCompleteToolTip.ShowPoint = lastPoint; } editModeMsg = "画折线模式(测距)"; break; case EditMode.DrawRect: if (LstMarkPoint.Count == 1) { var p1 = c.LatLngToPoint(LstMarkPoint[0]); DrawDashLine(g, p1, _curMousePoint); DrawPen.DashStyle = DashStyle.Solid; } else if (LstMarkPoint.Count == 2) { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var p2 = c.LatLngToPoint(LstMarkPoint[1]); var rect = DrawHelper.GetRect(p1, p2); g.FillRectangle(FillBrush, rect); g.DrawRectangle(DrawPen, rect); //_drawCompleteToolTip.ShowPoint = p2; } editModeMsg = "画矩形模式"; break; case EditMode.DrawPolyon: if (LstMarkPoint.Count > 1) { List <Point> lstp = new List <Point>(); foreach (var item in LstMarkPoint) { lstp.Add(c.LatLngToPoint(item)); } PolyonPath = new GraphicsPath(); var ps = lstp.ToArray(); if (!IsCompleted) { g.DrawLines(DrawPen, ps); //DrawDashLine(g, lastPoint, _curMousePoint); } else { if (ps.Length > 2) { g.DrawPolygon(DrawPen, ps); } } if (ps.Length > 2) { PolyonPath.AddPolygon(ps); PolyonPath.CloseFigure(); g.FillPolygon(FillBrush, ps); } } editModeMsg = "画多边形模式"; break; case EditMode.DrawCircle: if (LstMarkPoint.Count == 1) { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var rect = DrawHelper.GetEllipseRect(p1, _curMousePoint); DrawPen.DashStyle = DashStyle.DashDot; DrawPen.DashPattern = new float[] { 5, 2 }; g.FillEllipse(FillBrush, rect); g.DrawEllipse(DrawPen, rect); DrawPen.DashStyle = DashStyle.Solid; } else if (LstMarkPoint.Count == 2) { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var p2 = c.LatLngToPoint(LstMarkPoint[1]); var rect = DrawHelper.GetEllipseRect(p1, p2); g.FillEllipse(FillBrush, rect); g.DrawEllipse(DrawPen, rect); //g.FillEllipse(DrawPen.Brush, new Rectangle(p1.GetOffSet(-5, -5), new Size(10, 10)));//画圆心 DrawDashLine(g, p1, p2); _drawCompleteToolTip.ShowPoint = p2; } editModeMsg = "画圆模式"; break; case EditMode.DrawPie: switch (LstMarkPoint.Count) { case 1: { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var curLatLng = c.MouseLatLng; DrawPen.DashStyle = DashStyle.DashDot; DrawPen.DashPattern = new float[] { 5, 2 }; DrawPie(g, p1, _curMousePoint); DrawDashLine(g, p1, _curMousePoint); _curMouseToolTip.Info = string.Format("距离:{0:0.00}米\r\n正北角:{1:0.00}°", MercatorHelper.GetDistance(LstMarkPoint[0], curLatLng), MercatorHelper.GetBearing(LstMarkPoint[0], curLatLng)); } break; case 2: { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var p2 = c.LatLngToPoint(LstMarkPoint[1]); var angle = DrawHelper.GetAngle(p1, p2, _curMousePoint); float angleWidth = 2 * (float)angle; DrawPen.DashStyle = DashStyle.DashDot; DrawPen.DashPattern = new float[] { 5, 2 }; DrawPie(g, p1, p2, angleWidth); DrawDashLine(g, p1, p2); //DrawDashLine(g, p1, _curMousePoint); _curMouseToolTip.Info = string.Format("角度:{0:0.00}°", angleWidth); } break; case 3: { var p1 = c.LatLngToPoint(LstMarkPoint[0]); var p2 = c.LatLngToPoint(LstMarkPoint[1]); var p3 = c.LatLngToPoint(LstMarkPoint[2]); var angle = DrawHelper.GetAngle(p1, p2, p3); float angleWidth = 2 * (float)angle; DrawPen.DashStyle = DashStyle.Solid; DrawPie(g, p1, p2, angleWidth); //g.DrawPie(DrawPen,) _drawCompleteToolTip.ShowPoint = p1; } break; default: break; } editModeMsg = "画扇形模式"; break; default: break; } //画坐标点信息 _curMouseToolTip.Draw(c, g); if (IsCompleted) { //_drawCompleteToolTip.ShowPoint = lastPoint; _drawCompleteToolTip.Draw(c, g);//画完成信息 } else if (!lastPoint.IsEmpty) { switch (DrawMode) { case EditMode.None: break; case EditMode.DrawLine: case EditMode.DrawLines: case EditMode.DrawPolyon: case EditMode.DrawCircle: //case EditMode.DrawPie: //画虚线 DrawDashLine(g, lastPoint, _curMousePoint); break; default: break; } } var pMode = new Point(c.Width / 2 - 50, 10); g.DrawString(editModeMsg, new Font("微软雅黑", 12, FontStyle.Bold), Brushes.White, pMode);//画模式 } }
public void OnMouseClick(BMapControl c, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (IsCompleted) { ReSet(c); } switch (DrawMode) { case EditMode.DrawLine: if (LstMarkPoint.Count < 2) { LstMarkPoint.Add(c.PointToLatLng(e.Location)); } else { LstMarkPoint.Add(c.PointToLatLng(e.Location)); } if (LstMarkPoint.Count == 2) { IsCompleted = true; var p1 = LstMarkPoint[0]; var p2 = LstMarkPoint[1]; //c.Invalidate(DrawHelper.GetLineRegion(c.LatLngToPoint(p1), c.LatLngToPoint(p2))); _drawCompleteToolTip.Info = string.Format("距离:{0:0.00} 米\r\n正北角:{1:0.0} °" , MercatorHelper.GetDistance(p1, p2), MercatorHelper.GetBearing(p1, p2)); } break; case EditMode.DrawLines: PointLatLng lastP = null; if (LstMarkPoint.Count > 0) { lastP = LstMarkPoint.Last(); } var curP = c.PointToLatLng(e.Location); LstMarkPoint.Add(curP); //计算距离 if (lastP != null) { _linesDist += MercatorHelper.GetDistance(lastP, curP); } _drawCompleteToolTip.Info = string.Format("总距离:{0:0.00} 米", _linesDist); break; case EditMode.DrawRect: if (LstMarkPoint.Count < 2) { LstMarkPoint.Add(c.PointToLatLng(e.Location)); } if (LstMarkPoint.Count == 2) { IsCompleted = true; //var p1 = LstMarkPoint[0]; //var p2 = LstMarkPoint[1]; ////c.Invalidate(DrawHelper.GetLineRegion(c.LatLngToPoint(p1), c.LatLngToPoint(p2))); //_drawCompleteToolTip.Info = string.Format("面积:{0:0.00} m²\r\n正北角:{1:0.0} °" // , MercatorHelper.GetDistance(p1, p2)* MercatorHelper.GetBearing(p1, p2)); } break; case EditMode.DrawPolyon: LstMarkPoint.Add(c.PointToLatLng(e.Location)); break; case EditMode.DrawCircle: LstMarkPoint.Add(c.PointToLatLng(e.Location)); if (LstMarkPoint.Count == 2) { IsCompleted = true; var p1 = LstMarkPoint[0]; var p2 = LstMarkPoint[1]; _drawCompleteToolTip.Info = string.Format("半径:{0:0.00}米", MercatorHelper.GetDistance(p1, p2)); } break; case EditMode.DrawPie: LstMarkPoint.Add(c.PointToLatLng(e.Location)); if (LstMarkPoint.Count == 3) { IsCompleted = true; var p1 = c.LatLngToPoint(LstMarkPoint[0]); var p2 = c.LatLngToPoint(LstMarkPoint[1]); var p3 = c.LatLngToPoint(LstMarkPoint[2]); _drawCompleteToolTip.Info = string.Format("坐标:{0}\r\n半径:{1:0.00}米\r\n中线方向:{2:0.00}°\r\n角度宽:{3:0.00}°", LstMarkPoint[0], MercatorHelper.GetDistance(LstMarkPoint[0], LstMarkPoint[1]), MercatorHelper.GetBearing(LstMarkPoint[0], LstMarkPoint[1]), 2 * DrawHelper.GetAngle(p1, p2, p3)); } break; case EditMode.None: default: break; } } else if (e.Button == MouseButtons.Right) { IsCompleted = true; } if (DrawMode != EditMode.None) { c.Refresh(); } if (IsCompleted) { if (DrawComplete != null) { DrawComplete(LstMarkPoint); } } }