WPF 截圖控件之繪製箭頭(五)「仿微信」

前言

接着上週寫的截圖控件繼續更新 繪製箭頭

1.WPF實現截屏「仿微信」
2.WPF 實現截屏控件之移動(二)「仿微信」
3.WPF 截圖控件之伸縮(三) 「仿微信」
4.WPF 截圖控件之繪製方框與橢圓(四) 「仿微信」

正文

一、首先接着ScreenCut繼續發電。
1)繪製箭頭因爲需要只修改箭頭的尾部頂部不修改大小所以需要兩個Path
需要定義Grid容器分爲兩列第一列 尾部 寬度設置***** 第二列設置固定寬度15

<ControlTemplate x:Key="PART_DrawArrow" TargetType="{x:Type Control}">
     <Grid>
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*"/>
             <ColumnDefinition Width="15"/>
         </Grid.ColumnDefinitions>
         <Path Data="{StaticResource PathArrowBranches}" 
               Fill="{TemplateBinding Background}" Height="8"
               Stretch="Fill" 
               HorizontalAlignment="Left"
               VerticalAlignment="Center"
               Margin="0,0,-7,0"/>
         <Path Data="{StaticResource PathArrow}" 
               Fill="{TemplateBinding Background}" 
               Width="15" Height="15"
               Stretch="Fill"
               Grid.Column="1"/>
     </Grid>
 </ControlTemplate>

2)依據鼠標起點PART_DrawArrow設置LeftTop的位置,
接着設置轉換RenderTransformOrigin中心點爲new Point(0, .5) 鼠標移動的角度賦值給RotateTransform.Angle就可以讓箭頭部跟着鼠標旋轉


同時還需去修改controlArrow的寬度在修改寬度的時候這裏當你繪製的是斜線或者角度就需要求平方根給寬。


  void DrawArrowControl(Point current)
        {
            CheckPoint(current);
            if (screenCutMouseType != ScreenCutMouseType.DrawArrow)
                return;

            var drawArrow = new Rect(pointStart, current);

            if (controlArrow == null)
            {
                controlArrow = new Control();
                controlArrow.Background = _currentBrush == null ? Brushes.Red : _currentBrush;
                controlArrow.Template = controlTemplate;
                _canvas.Children.Add(controlArrow);
                Canvas.SetLeft(controlArrow, drawArrow.Left);
                Canvas.SetTop(controlArrow, drawArrow.Top - 7.5);
            }
            var rotate = new RotateTransform();
            var renderOrigin = new Point(0, .5);
            controlArrow.RenderTransformOrigin = renderOrigin;
            controlArrow.RenderTransform = rotate;
            rotate.Angle = ControlsHelper.CalculeAngle(pointStart, current);
            var x = current.X - pointStart.X;
            var y = current.Y - pointStart.Y;
    
            var width = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
          
            controlArrow.Width = width;
        }

3)根據兩個點獲取角度代碼

 private double CalculeAngle(Point start, Point arrival)
        {
            var radian = Math.Atan2((arrival.Y - start.Y), (arrival.X - start.X));
            var angle = (radian * (180 / Math.PI) + 360) % 360;
            return angle;
        }

完整代碼如下

項目地址

  • 框架名:WPFDevelopers
  • 作者:WPFDevelopers
  • 參與者:吳鋒、閆佳慧
  • GitHub
  • Gitee
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章