zoukankan      html  css  js  c++  java
  • C# 实现鼠标框选效果

    实现步骤:

    1.实现整个鼠标框选的几个事件(down、move、up),当鼠标点下记录鼠标框选的起点,鼠标抬起结束操作。

    2.以鼠标框选过程中获取的鼠标坐标为基点计算框选的矩形的4点坐标,4点坐标以顺时针方向布点。

    3.通过Shape.Path类实现在类上画出此矩形。

    代码如下:

    namespace HostDemo {
     public class HostCanvas : Canvas {
      public HostCanvas() {
       InitializeComponent();
      }

      private void InitializeComponent() {
       this.Loaded += OnLoad;
       this.MouseDown += OnMouseDown;
       this.MouseMove += OnMouseMove;
       this.MouseUp += OnMouseUp;
       locus = new Path();
       locus.Fill = new SolidColorBrush(Color.FromArgb(1, 255, 255, 255));
       locus.Stroke = Brushes.Red;
       locus.StrokeThickness = 1;
       locus.IsManipulationEnabled = true;
      }

      void OnMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) {
       ispath = false;
      }

      void OnMouseMove(object sender, System.Windows.Input.MouseEventArgs e) {
       if(ispath){
        endpoint = e.GetPosition(this);
        locus.Data = DrawingRect(startpoint,endpoint);
       }
      }

      void OnMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
       if(!this.Children.Contains(locus)) this.Children.Add(locus);
       if (locus.Data != null) locus.Data = null;
       startpoint = e.GetPosition(this);
       ispath = true;
      }

      void OnLoad(object sender, System.Windows.RoutedEventArgs e) {
       this.Background = new SolidColorBrush(Color.FromArgb(35, 255, 255, 255));
      }

      private PathGeometry DrawingRect(Point beginpoint, Point closepoint) {
       PathGeometry result = new PathGeometry();  
       PathFigure figure = new PathFigure();
       figure.IsClosed = true;
       figure.StartPoint = beginpoint;
       PathSegmentCollection pathSegmentCollection = new PathSegmentCollection();
       PathFigureCollection pathFigureCollection = new PathFigureCollection();   
       LineSegment m1 = new LineSegment();
       m1.Point = new Point(closepoint.X, beginpoint.Y);
       LineSegment m2 = new LineSegment();
       m2.Point = closepoint;
       LineSegment m3 = new LineSegment();
       m3.Point = new Point(beginpoint.X, closepoint.Y);
       pathSegmentCollection.Add(m1);
       pathSegmentCollection.Add(m2);
       pathSegmentCollection.Add(m3);
       figure.Segments = pathSegmentCollection;
       pathFigureCollection.Add(figure);
       result.Figures = pathFigureCollection;

       return result();
      }

      private Path locus;
      private bool ispath = false;
      private Point startpoint;
      private Point endpoint;
     }
    }

        转载时,请注明本文来源:www.cnblogs.com/tmywu

      

      作者: 淘米部落

        mail:tommywu23@126.com

  • 相关阅读:
    网页中插入Flash动画(.swf)代码和常用参数设置
    关于UML中逻辑模型的工具的详细介绍
    简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera
    mysql sock找不到
    简述nginx日志管理切割日志(亲测可行)
    Linux下使用rm删除文件,并排除指定文件(亲测可行)
    常驻内存以及如何避免内存泄漏
    TASK异步进程处理场景
    TCP长连接数据传输(同步方式)
    在智联上投了一个月的简历,很多都有意向,但是却没有通知我去
  • 原文地址:https://www.cnblogs.com/tmywu/p/2635637.html
Copyright © 2011-2022 走看看