[C#] 仿QQ截图中箭头部分的实现 →→→→→进入此内容的聊天室

来自 , 2019-07-01, 写在 C#, 查看 103 次.
URL http://www.code666.cn/view/f1b07759
  1.         /// <summary>
  2.         ///  仿qq非直线箭头:采用填充多边形的方法
  3.         /// </summary>
  4.         /// <param name="g"></param>
  5.         /// <param name="p"></param>
  6.         /// <param name="start"></param>
  7.         /// <param name="end"></param>
  8.         private void DrawUArrowF(Graphics g, Pen p, Point start, Point end)
  9.         {
  10.             int par = 5;
  11.             par = ((int)p.Width - 1) * 5 + par;//默认为10
  12.             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));
  13.             if (Length > 5)
  14.             {
  15.                 g.CompositingQuality = CompositingQuality.HighQuality;
  16.                 double k = Math.Atan2((double)(end.Y - start.Y), (double)(end.X - start.X));//返回的是原点至点(x,y)的方位角,即与 x 轴的夹角
  17.                 double siny = Math.Sin(k);
  18.                 double cosy = Math.Cos(k);
  19.                 //箭头是一个底边=高=par的等腰三角形
  20.                 //运用正弦、余弦与边之间的关系;sin30°=cos60°求出坐标
  21.                 PointF point1 = new PointF(end.X + (float)(-par * cosy - (par / 2.0 * siny)), end.Y + (float)(-par * siny + (par / 2.0 * cosy)));
  22.                 PointF point2 = new PointF(end.X + (float)(-par * cosy + (par / 2.0 * siny)), end.Y - (float)(par / 2.0 * cosy + par * siny));
  23.                 PointF[] ps = { end, point1, point2 };
  24.                 //g.DrawPolygon(p, ps);//画三角形会出现偏移量的问题
  25.  
  26.                 float offsetX = (float)(par * siny / 3.5);
  27.                 float offsetY = (float)(par * cosy / 3.5);
  28.                 PointF point3 = new PointF(end.X + (float)(-par * cosy - (par / 2.0 * siny)) + offsetX, end.Y + (float)(-par * siny + (par / 2.0 * cosy)) - offsetY);
  29.                 PointF point4 = new PointF(end.X + (float)(-par * cosy + (par / 2.0 * siny) - offsetX), end.Y - (float)(par / 2.0 * cosy + par * siny) + offsetY);
  30.                 PointF[] pj = { start, point3, point4 };
  31.                 //g.DrawPolygon(p, pj);//画三角形会出现偏移量的问题            
  32.                 FillMode flMode = FillMode.Alternate;
  33.                 SolidBrush brush = new SolidBrush(p.Color);
  34.                 //g.FillPolygon(brush, ps, flMode);//填充三角形箭头部
  35.                 //g.FillPolygon(brush, pj, flMode);//填充三角形箭身
  36.                 //两个三角形组合出现缝隙
  37.                 PointF[] pp = { start, point3, point1, end, point2, point4 };//填充箭头多边形
  38.                 g.FillPolygon(brush, pp, flMode);
  39.                 Pen px = new Pen(p.Color, 1);//新定义一个pen画一条直线,防止箭尾太细
  40.                 g.DrawLine(px, start, end);
  41.                 px.Dispose();
  42.             }
  43.         }

回复 "仿QQ截图中箭头部分的实现"

这儿你可以回复上面这条便签

captcha