WPF 截图控件之绘制箭头(五)「仿微信」

打印 上一主题 下一主题

主题 942|帖子 942|积分 2836

前言

接着上周写的截图控件继续更新 绘制箭头
1.WPF实现截屏「仿微信」
2.WPF 实现截屏控件之移动(二)「仿微信」
3.WPF 截图控件之伸缩(三) 「仿微信」
4.WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
正文

一、首先接着ScreenCut继续发电。
1)绘制箭头因为需要只修改箭头的尾部顶部不修改大小所以需要两个Path
需要定义Grid容器分为两列第一列 尾部 宽度设置***** 第二列设置固定宽度15
  1. <ControlTemplate x:Key="PART_DrawArrow" TargetType="{x:Type Control}">
  2.      <Grid>
  3.          <Grid.ColumnDefinitions>
  4.              <ColumnDefinition Width="*"/>
  5.              <ColumnDefinition Width="15"/>
  6.          </Grid.ColumnDefinitions>
  7.          <Path Data="{StaticResource PathArrowBranches}"
  8.                Fill="{TemplateBinding Background}" Height="8"
  9.                Stretch="Fill"
  10.                HorizontalAlignment="Left"
  11.                VerticalAlignment="Center"
  12.                Margin="0,0,-7,0"/>
  13.          <Path Data="{StaticResource PathArrow}"
  14.                Fill="{TemplateBinding Background}"
  15.                Width="15" Height="15"
  16.                Stretch="Fill"
  17.                Grid.Column="1"/>
  18.      </Grid>
  19. </ControlTemplate>
复制代码
2)依据鼠标起点PART_DrawArrow设置LeftTop的位置,
接着设置转换RenderTransformOrigin中心点为new Point(0, .5) 鼠标移动的角度赋值给RotateTransform.Angle就可以让箭头部跟着鼠标旋转

同时还需去修改controlArrow的宽度在修改宽度的时候这里当你绘制的是斜线或者角度就需要求平方根给宽。

  1.   void DrawArrowControl(Point current)
  2.         {
  3.             CheckPoint(current);
  4.             if (screenCutMouseType != ScreenCutMouseType.DrawArrow)
  5.                 return;
  6.             var drawArrow = new Rect(pointStart, current);
  7.             if (controlArrow == null)
  8.             {
  9.                 controlArrow = new Control();
  10.                 controlArrow.Background = _currentBrush == null ? Brushes.Red : _currentBrush;
  11.                 controlArrow.Template = controlTemplate;
  12.                 _canvas.Children.Add(controlArrow);
  13.                 Canvas.SetLeft(controlArrow, drawArrow.Left);
  14.                 Canvas.SetTop(controlArrow, drawArrow.Top - 7.5);
  15.             }
  16.             var rotate = new RotateTransform();
  17.             var renderOrigin = new Point(0, .5);
  18.             controlArrow.RenderTransformOrigin = renderOrigin;
  19.             controlArrow.RenderTransform = rotate;
  20.             rotate.Angle = ControlsHelper.CalculeAngle(pointStart, current);
  21.             var x = current.X - pointStart.X;
  22.             var y = current.Y - pointStart.Y;
  23.    
  24.             var width = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
  25.          
  26.             controlArrow.Width = width;
  27.         }
复制代码
3)根据两个点获取角度代码
  1. private double CalculeAngle(Point start, Point arrival)
  2.         {
  3.             var radian = Math.Atan2((arrival.Y - start.Y), (arrival.X - start.X));
  4.             var angle = (radian * (180 / Math.PI) + 360) % 360;
  5.             return angle;
  6.         }
复制代码
完整代码如下

项目地址


  • 框架名:WPFDevelopers
  • 作者:WPFDevelopers
  • 参与者:吴锋、闫佳慧
  • GitHub
  • Gitee

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表