最近在学习wpf,简单的使用Button控件创建了一个绘制自由线条,直线,矩形和圆形的绘制,学习事件不多,所以只是使用控件完成的这些功能,没有使用类来进行编辑(如果使用类的话可以实现更多功能,像选中已经绘制的图形进行该图形参数的编辑来改变图形的大小,之后使用了类来完成绘制命令后再重写一篇吧)。

实现这些功能,在wpf中自然要先构建 .xaml界面。

 <Grid Margin="3" x:Name="grid"><Grid.ColumnDefinitions><ColumnDefinition Width="*"></ColumnDefinition><ColumnDefinition Width="3*"></ColumnDefinition>            </Grid.ColumnDefinitions><Grid x:Name="grid1" Grid.Column="0"><Grid.RowDefinitions><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition></Grid.RowDefinitions><Button Height="30" Margin="5" Grid.Row="0" Name="PathLine" Click="button0">随意画线</Button><Button Height="30" Margin="5" Grid.Row="1" Name="Line" Click="button1">画直线</Button><Button Height="30" Margin="5" Grid.Row="2" Name="Rect" Click="button2">画矩形</Button><Button Height="30" Margin="5" Grid.Row="3" Name="Elli" Click="button3">画圆形</Button><Button Height="30" Margin="5" Grid.Row="4" Click="Button_Clear" Content="清空"/></Grid><Canvas Grid.Column="1" Margin="3" x:Name="canvas1" Background="Gray" MouseLeftButtonDown="Canvas_MouseButtonDown" MouseLeftButtonUp="Canvas_MouseButtonUp" MouseMove="Canvas_MouseMove"/>        </Grid>

编辑完成的见面应该如下图所示:

这之后就是控件的响应事件的生成了,Button按钮事件的生成就不赘述了,直接上代码:

        private void button1(object sender, RoutedEventArgs e){this.Type = TypeEnum.画直线;}private void button2(object sender, RoutedEventArgs e){this.Type = TypeEnum.矩形;}private void button3(object sender, RoutedEventArgs e){this.Type = TypeEnum.圆形;}       private void button0(object sender, RoutedEventArgs e){this.Type = TypeEnum.任意;}private void Button_Clear(object sender, RoutedEventArgs e){canvas1.Children.Clear();}

这里在Button按钮事件中使用了枚举的方法,

public enum TypeEnum { Null = 0, 画直线, 任意, 矩形, 圆形 }

这里是为了对应鼠标按钮的事件来对应响应要绘制的图形。

对应鼠标事件我这里使用了MouseLeftButtonDown,MouseLeftButtonDown和MouseMove,

尝试过直接使用MouseButtonDown(Up),但是似乎默认使用鼠标右键,所有在代码里还是写详细一点吧。

在生成Mouse事件的响应命令之前,就是几个变量的定义了:

        private Path path = null;//初始化bool isMouseDowm = false;private TypeEnum Type = TypeEnum.Null;public Point startPoint;

Mouse事件对应的响应代码如下:

        private void Canvas_MouseButtonDown(object sender, MouseButtonEventArgs e){startPoint = e.GetPosition(canvas1);isMouseDowm = true;}private void Canvas_MouseButtonUp(object sender, MouseButtonEventArgs e){            isMouseDowm = false;this.path = new Path();}private void Canvas_MouseMove(object sender, MouseEventArgs e){if (isMouseDowm){if (Type == TypeEnum.任意){this.path = new Path();//实例化this.path.Stroke = Brushes.Black;this.path.StrokeThickness = 3;PathGeometry pg = new PathGeometry();//复杂图形PathFigure pf = new PathFigure();//复杂图形的一部分pf.StartPoint = startPoint;LineSegment ls = new LineSegment();//使用line连接两点ls.Point = e.GetPosition(canvas1);pf.Segments.Add(ls);pg.Figures.Add(pf);//给startPoint重新赋值startPoint = e.GetPosition(canvas1);//鼠标移动到的位置为新的起点this.path.Data = pg;canvas1.Children.Add(this.path);                    }else if (Type == TypeEnum.画直线){//方法1//canvas1.Children.Remove(this.path);//this.path = new Path();//this.canvas1.Children.Add(this.path);//this.path.Stroke = Brushes.Black;//this.path.StrokeThickness = 3;//LineGeometry lg = new LineGeometry(startPoint, e.GetPosition(canvas1));//this.path.Data = lg;//方法2          //这里进行两种判断,一是先点击画直线的情况,二是已经点击过其他按钮的情况if (this.path == null){this.path = new Path();//判断条件满足canvas1.Children.Add(this.path);}this.path.Stroke = Brushes.Green;this.path.StrokeThickness = 3;this.path.Data = new LineGeometry(startPoint, e.GetPosition(canvas1));if (this.path != null){canvas1.Children.Remove(this.path);this.path.Data = new LineGeometry(startPoint, e.GetPosition(canvas1));canvas1.Children.Add(this.path);}}else if (Type == TypeEnum.矩形){canvas1.Children.Remove(this.path);this.path = new Path();this.path.Stroke = Brushes.Red;this.path.StrokeThickness = 3;RectangleGeometry rg = new RectangleGeometry();double startX = startPoint.X;double startY = startPoint.Y;double height = Math.Abs(e.GetPosition(canvas1).X - startPoint.X);double width = Math.Abs(e.GetPosition(canvas1).Y - startPoint.Y);rg.Rect = new Rect(startX, startY, width, height);this.path.Data = rg;canvas1.Children.Add(this.path);                   }else if (Type == TypeEnum.圆形){canvas1.Children.Remove(this.path);this.path = new Path();this.path.Stroke = Brushes.Blue;this.path.StrokeThickness = 3;double startX = startPoint.X;double startY = startPoint.Y;double radiusX = Math.Abs(e.GetPosition(canvas1).X - startPoint.X);double radiusY = Math.Abs(e.GetPosition(canvas1).Y - startPoint.Y);EllipseGeometry eg = new EllipseGeometry(new Point(startX, startY), radiusX, radiusY);this.path.Data = eg;canvas1.Children.Add(this.path);}                }}

画直线的部分,使用了Remove命令来消除上一个path线条(因为我使用的是LineGeometry,如果不擦去上一个路径就会出现绘制出一个无数线条构成的扇形图,而不是动态的实现一条直线的出现),然后在矩形的绘制过程中wight和height的计算命令应该是wight=x2-x1,height=y2-y1,但是会出现绘制无法响应mousebuttonup导致绘制无法结束的情况,那位大佬知道的希望可以给我一点指导呀。

注释就没写太多了,主要是使用了Geometry的几个派生类:PathGeometry,LineGeometry,RectangleGeometry和EllipseGeometry,绘制方法也就是确定起始点和终点,根据不同的绘制要求进行响应的计算(就长宽和圆形的半径(椭圆就RadiusX和RadiusY))。

总的来说,面向对象的思维没有体现(因为没有类和类中的方法的封装,多态和继承),之后想要使用面向对象的思维重写该文,还是希望各位大佬能不吝赐教呀,感谢。

wpf 鼠标拖动绘制几何图形相关推荐

  1. Qt鼠标拖动绘制基本几何图形

    概述 用Qt鼠标事件实现基本几何图形的绘制,支持直线.矩形.圆形.椭圆.后期可以在此基础上进行扩展. 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独 ...

  2. JavaScript鼠标拖动绘制方框实现选区

    学习编程,与君共勉. 针对JavaScript拖动鼠标绘制方框实现选区的方法,在网上查了很多,但感觉不是写的很繁琐就是感觉很乱,没有一个详细的步骤,这对于我们这些菜鸟来说真的很难理解,所以我写了一份比 ...

  3. WPF之路——绘制几何图形

    一.Geometry和Share Geometry类(几何绘图)包括,LineGeometry(几何线条).RectangleGeometry(几何矩形).EllipesGeometry(几何椭圆图形 ...

  4. WPF 使用Path绘制几何图形

    Path类继承自Shape,可以绘制很多简单的,复合的图形.Path类通过提供的Data属性,Data属性接受一个Geometry对象(我的理解就是Data要装什么集合图形呀),Geometry一共有 ...

  5. python matplotlib.pyplot 如何实时绘制三维动态窗口?(可鼠标拖动角度)

    实时绘制三维图并更新窗口 # -*- coding: utf-8 -*- """ @File : test.py @Time : 2020/5/26 18:09 @Aut ...

  6. 【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布中绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

    文章目录 一.鼠标滚轮缩放的中心点设置为当前鼠标中心点 - 要点分析 1.保存当前鼠标指针指向的位置 2.根据鼠标指针指向的位置以及比例重新计算图片位置 二.绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩 ...

  7. WPF编程,实现鼠标拖动控件并带有中间动效

    一. 前提 要实现鼠标对控件的拖拽移动,首先必须知道下面几点: WPF中的鼠标左键按下.鼠标移动事件,有时候通过XAML界面添加的时候并有没有作用,我们要通过触发事件的元素和要监听的路由事件绑定来进行 ...

  8. WPF使用Canvas绘制可变矩形

    WPF使用Canvas绘制可变矩形 原文:WPF使用Canvas绘制可变矩形 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/WANGYAN9110/ ...

  9. 真・WPF 按钮拖动和调整大小

    真・WPF 按钮拖动和调整大小 独立观察员 2020 年 8 月 29 日 手头有个 Winform 程序,是使用动态生成按钮,然后拖动.调整大小,以此来记录一些坐标数据,最后保存坐标数据的. 在数据 ...

  10. Python+turtle交互式绘图:可以用鼠标拖动的小海龟

    功能描述:代码运行后,在窗口上显示3个小海龟,使用鼠标拖动小海龟时可以动态改变窗口颜色,如下图所示. 说明:本例代码主体部分来自turtle Demo,我稍微修改了一下,重点增加了注释,方便阅读和理解 ...

最新文章

  1. 时隔一个月,社区团购平台“邻邻壹”再获千万美金 Pre-A 轮融资
  2. Linux块设备IO子系统
  3. Sublime Text 3配置与vim模式(待完整)
  4. android 动态改变listview的内容
  5. ruby中数组的常用函数
  6. 【Java方法】从方法中返回多个值
  7. redis 验证消息队列也是写磁盘的
  8. 某项目的双代号网络图如下所示_系统集成项目管理工程师5天备考第3天第1-2学时...
  9. 数据库--Oracle
  10. php右下角弹窗代码,2019畅言最新去除隐藏右下角弹窗广告!代码添加彻底隐藏畅言右下角广告代码...
  11. 计算机开启远程桌面服务,远程桌面服务 教您开启远程桌面服务
  12. 【毕业设计】单片机 火灾智能报警系统 - 嵌入式 物联网
  13. 富爸爸系列:富爸爸穷爸爸实践
  14. 基于改进注意力机制的U-Net模型实现及应用(keras框架实现)
  15. 神经网络容易受到对抗攻击,网络攻防原理与技术
  16. GNU GRUB手册之安装(一)
  17. vue-cli3 跑项目时 ‘98%’ after emitting CopyPlugin
  18. 【渝粤教育】电大中专电子商务网站建设与维护 (28)作业 题库
  19. 织梦cms怎么上传html模板,织梦dedecms 本地模板安装图文方法
  20. EMPIRE: LUPINONE实战演练

热门文章

  1. matplotlib画图教程系列之-堆积柱状图
  2. Power bi 3.2 堆积柱形图
  3. KEILC51的下载和安装与工程建立
  4. uniapp-登录界面风格-001
  5. 谁会成为今年的Best CIO人选
  6. R数据框操作 fourth day
  7. 模块学习笔记-IR2110/IR2130(上)
  8. 将算术表达式转换成四元式的程序实现
  9. 服务器raid5数据恢复成功案例,磁盘阵列数据恢复方法
  10. 微信小程序全栈开发实践 第一章 重新认识微信小程序、及新功能介绍