使用WPF与C#实现鼠标画线

鼠标点的读取

  • 首先需要在WPF中的前端页面获取对鼠标的操作
  • 在一个布局里(Grid)新建关于鼠标的相关“事件”
//相关事件
          MouseEnter="grid_MouseEnter" //鼠标进入
          MouseLeave="grid_MouseLeave"//鼠标离开
          MouseLeftButtonDown="grid_MouseLeftButtonDown"//鼠标左键按下
          MouseLeftButtonUp="grid_MouseLeftButtonUp"//鼠标左键抬起
          MouseMove="grid_MouseMove"//鼠标离开

后台相关操作

  • 主要是要获取鼠标在进入后的“第一个点”与“第二个点”
        //声明Point指针类型的字段
        private Point point;
        //声明鼠标是否按下的Bool类型的字段并且初始值是“false”(按下isDown=true没按isDown=false)
        private bool isDown = false;
        //new一个能绘制(line)成线的类型的对象
        Line dot = new Line();
        //这个是关于鼠标移动的事件
        private void grid_MouseMove(object sender, MouseEventArgs e) {          
            if (isDown) {
            //按下并移动就相当于获取第二点
                Point point2 = e.GetPosition(grid);
                Console.WriteLine("鼠标移动" + point2);
                //连线
                dot.X1 = point.X;
                dot.Y1 = point.Y;
                dot.X2 = point2.X;
                dot.Y2 = point2.Y;
                point =point2;
            }
        }

具体的流程代码

        private void grid_MouseEnter(object sender, MouseEventArgs e) {
            Console.WriteLine("进入");
        }
        
        private void grid_MouseLeave(object sender, MouseEventArgs e) {
            Console.WriteLine("离开");
        }

        private void grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
            point = e.GetPosition(grid);
            //鼠标按下就是第一个点
            Console.WriteLine("鼠标按下"+point);
            isDown = true;
        }

        private void grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
            Console.WriteLine("鼠标松开" + e.GetPosition(grid));
            isDown = false;
        }

        private Point point;
        private bool isDown = false;
        Line dot = new Line();
        private void grid_MouseMove(object sender, MouseEventArgs e) {          
            if (isDown) {
                Point point2 = e.GetPosition(grid);
                Console.WriteLine("鼠标移动" + point2);
                //连线
                dot.X1 = point.X;
                dot.Y1 = point.Y;
                dot.X2 = point2.X;
                dot.Y2 = point2.Y;
                point =point2;
            }
        }

关于输出的结果
在这里插入图片描述

具体实例运用

将画笔封装成一个方法且带参数

//new一个对象后面加花括号的作用是为了赋值公有数据可写字段的。
//geometries 这个对象在画图中FillRule为填充规则的意思,它有两个属性值,EvenOdd,Nonzero
//EvenOdd是具有穿透效果,Nonzero没有穿透效果
private GeometryGroup geometries = new GeometryGroup() { FillRule = FillRule.Nonzero };

           //传进去的参数分别是"第一个点"和"最后一个点"
            private void Domousemove(Point start, Point end) {
            //path为滑动的各个点形成的集合
            //GetWidenedPathGeometry(Pen pen):是获取通过画笔形成的形状,里面的对象是"Pen"
            //将这个"Pen"笔的颜色设置成"Brushes.Red",大小是通过绑定"PenWidth"属性(PenWidth是可以根据实际情况设置的)
            //StartLineCap /EndLineCap 分别为画笔起点与笔画末端使用的形状类型
            var path = new LineGeometry(start, end).GetWidenedPathGeometry(new Pen(Brushes.Red, PenWidth) { StartLineCap = PenLineCap.Round, EndLineCap = PenLineCap.Round });
            geometries.Children.Add(path);
            //Geometry 是形成图形的属性;
            Geometry = geometries;
        }

总结:简单的Demo可以用具体的一个定值来做实验,但在具体的实例中或这个项目可能就要用到许多的对象引入,属性的传入以及相关的绑定等

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值