/// /// 仿qq非直线箭头:采用填充多边形的方法 /// /// /// /// /// private void DrawUArrowF(Graphics g, Pen p, Point start, Point end) { int par = 5; par = ((int)p.Width - 1) * 5 + par;//默认为10 double Length = Math.Sqrt(Math.Abs(start.X - end.X) * Math.Abs(start.X - end.X) + Math.Abs(start.Y - end.Y) * Math.Abs(start.Y - end.Y)); if (Length > 5) { g.CompositingQuality = CompositingQuality.HighQuality; double k = Math.Atan2((double)(end.Y - start.Y), (double)(end.X - start.X));//返回的是原点至点(x,y)的方位角,即与 x 轴的夹角 double siny = Math.Sin(k); double cosy = Math.Cos(k); //箭头是一个底边=高=par的等腰三角形 //运用正弦、余弦与边之间的关系;sin30°=cos60°求出坐标 PointF point1 = new PointF(end.X + (float)(-par * cosy - (par / 2.0 * siny)), end.Y + (float)(-par * siny + (par / 2.0 * cosy))); PointF point2 = new PointF(end.X + (float)(-par * cosy + (par / 2.0 * siny)), end.Y - (float)(par / 2.0 * cosy + par * siny)); PointF[] ps = { end, point1, point2 }; //g.DrawPolygon(p, ps);//画三角形会出现偏移量的问题 float offsetX = (float)(par * siny / 3.5); float offsetY = (float)(par * cosy / 3.5); PointF point3 = new PointF(end.X + (float)(-par * cosy - (par / 2.0 * siny)) + offsetX, end.Y + (float)(-par * siny + (par / 2.0 * cosy)) - offsetY); PointF point4 = new PointF(end.X + (float)(-par * cosy + (par / 2.0 * siny) - offsetX), end.Y - (float)(par / 2.0 * cosy + par * siny) + offsetY); PointF[] pj = { start, point3, point4 }; //g.DrawPolygon(p, pj);//画三角形会出现偏移量的问题 FillMode flMode = FillMode.Alternate; SolidBrush brush = new SolidBrush(p.Color); //g.FillPolygon(brush, ps, flMode);//填充三角形箭头部 //g.FillPolygon(brush, pj, flMode);//填充三角形箭身 //两个三角形组合出现缝隙 PointF[] pp = { start, point3, point1, end, point2, point4 };//填充箭头多边形 g.FillPolygon(brush, pp, flMode); Pen px = new Pen(p.Color, 1);//新定义一个pen画一条直线,防止箭尾太细 g.DrawLine(px, start, end); px.Dispose(); } }