用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c#代码库

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

2018-04-12 作者: hiroot举报

[c#]代码库

/// <summary>
///  仿qq非直线箭头:采用填充多边形的方法
/// </summary>
/// <param name="g"></param>
/// <param name="p"></param>
/// <param name="start"></param>
/// <param name="end"></param>
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();
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...