前言

接着上周写的截图控件继续更新 绘制箭头

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

WPF 截图控件之绘制箭头(五)「仿微信」的更多相关文章

  1. WPF 截图控件之绘制方框与椭圆(四) 「仿微信」

    前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...

  2. WPF 截图控件之文字(七)「仿微信」

    前言 接着上周写的截图控件继续更新添加 文字. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...

  3. WPF 截图控件之画笔(八)「仿微信」

    前言 接着上周写的截图控件继续更新添加 画笔. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...

  4. WPF 截图控件之移除控件(九)「仿微信」

    WPF 截图控件之移除控件(九)「仿微信」 WPF 截图控件之移除控件(九)「仿微信」 作者:WPFDevelopersOrg 原文链接: https://github.com/WPFDevelope ...

  5. WPF常用控件应用demo

    WPF常用控件应用demo 一.Demo 1.Demo截图如下: 2.demo实现过程 总体布局:因放大缩小窗体,控件很根据空间是否足够改变布局,故用WrapPanel布局. <ScrollVi ...

  6. WPF DataGrid 控件的运用

    WPF DataGrid 控件的运用 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-23 参考: King Cobra 博客 ...

  7. WPF第三方控件盘点

    WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评 ...

  8. C# WPF DataGrid控件实现三级联动

    利用DataGrid控件实现联动的功能,在数据库客户软件中是随处可见的,然而网上的资料却是少之又少,令人崩溃. 本篇博文将介绍利用DataGrid控件模板定义的三个ComboBox实现“省.市.区”的 ...

  9. VC控件自绘制三步曲

    http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...

随机推荐

  1. Event Loop 是什么?

    Event Loop 是什么? 本文写于 2020 年 12 月 6 日 广义上来说 Event Loop 并不是 JavaScript 独有的概念,他是一个计算机的通用概念. 狭义上来说,只有 No ...

  2. 评估海外pop点网络质量,批量探测到整个国家运营商ip地址段时延

    1 查询当地供应商所有AS号和IP地址段,如下 可以手动复制也可以爬下来,此次测试地址不多,手动复制下来再做下格式话 61.99.128.0/17 61.99.0.0/16 61.98.96.0/20 ...

  3. MPLS基础与工作原理

    MPLS Fundamental History of WAN Protocol 1970年代之前 第一个 WAN 用于将办公室与终端连接到大型机和小型计算机系统. 它是从办公室到数据中心的点对点连接 ...

  4. redis & redis sentinel

    Redis 命令参考 Redis Sentinel Cheat Sheet Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件) Redis哨兵模式(sentinel)学习总结及部署 ...

  5. 2.0 vue循环和方法调用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. AJAX——POST请求

    POST.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. 文件操作(Java)

    学习内容:文件操作        1.输入流:InputStream类是字节输入流的抽象类,常用的一些方法有: raed()方法:从输入流中读取数据的下一个字节 reset()方法:将输入指针返回到当 ...

  8. 08shell脚本

    shell脚本编程 1.1简介 什么是shell脚本 shell脚本: 就是一些命令的集合, 在脚本文件中可以有流程控制, 如顺序, 条件分支和循环等 脚本文件一般一.sh文件为扩展名, 但是不是必须 ...

  9. 可变数组Vector

    package com.demon.languang.business.rest; import java.util.Vector; public class DemonTest { @Suppres ...

  10. Nastran的应变方向

    问题 近日使用Nastran做一个算例,在计算频响时发现:位移场是连续的,而应变场不连续.以某一频率处应变场为例,其上表面X.Y方向应变场分布如下图.此处关闭了云图的插值,所显示的为单元的应变,因此云 ...