zoukankan      html  css  js  c++  java
  • WPF Canvas 画区域

    有时候需要实现类似于QQ截图那样的选择区域功能,这里的区域可以是一条线,圆,矩形等等

    实现原理就是一个Canvas做蒙板,然后canvas的三个事件,MouseLeftButtonDown,MouseMove,MouseLeftButtonUp。非常easy!

    首先,你要有个canvas

    <Canvas Name="videocanvas" Height="288" Width="352" Background="Transparent" MouseMove="image_MouseMove" MouseLeftButtonDown="Mask_MouseLeftButtonDown" MouseLeftButtonUp="Mask_MouseLeftButtonUp"/>

    然后实现他的事件,在之前我们先决定一下到底是什么形状的区域。

    1 public static Shape CreateShape()
    2 {
    3     //矩形区域
    4     return new System.Windows.Shapes.Rectangle() { Fill = null, Stroke = System.Windows.Media.Brushes.Red, StrokeThickness = 1 };
    5     //圆形区域
    6     //return new System.Windows.Shapes.Ellipse() { Fill = null, Stroke = System.Windows.Media.Brushes.Red, StrokeThickness = 1 };
    7 
    8 }

    然后实现三个事件

    bool drawFlag = false;
    Shape insertShape;
    System.Windows.Point startPosition;
    
    
    private void Mask_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        insertShape = CreateShape();
        if (insertShape != null)
        {
            drawFlag = true;
            Canvas board = sender as Canvas;
            board.Children.Clear();
            startPosition = e.GetPosition(board);
            insertShape.Opacity = 1;
            Canvas.SetLeft(insertShape, e.GetPosition(board).X);
            Canvas.SetTop(insertShape, e.GetPosition(board).Y);
            board.Children.Add(insertShape);
        }
    }
    
    private void image_MouseMove(object sender, MouseEventArgs e)
    {
        Canvas board = sender as Canvas;
        if (drawFlag && insertShape != null)
        {
            if (e.GetPosition(board).X > startPosition.X)
            {
                insertShape.Width = e.GetPosition(board).X - startPosition.X;
                
            }
            else
            {
                insertShape.Width = startPosition.X - e.GetPosition(board).X;
                Canvas.SetLeft(insertShape, e.GetPosition(board).X);
            }
            if (e.GetPosition(board).Y > startPosition.Y)
            {
                insertShape.Height = e.GetPosition(board).Y - startPosition.Y;
            }
            else
            {
                insertShape.Height = startPosition.Y - e.GetPosition(board).Y;
                Canvas.SetTop(insertShape, e.GetPosition(board).Y);
            }
        }
    }
    
    private void Mask_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        drawFlag = false;
        if (insertShape != null)
        {
            insertShape.Opacity = 1;
            System.Windows.Point p = e.GetPosition(sender as Canvas);
            Canvas.SetLeft(insertShape, e.GetPosition(board).X);
            Canvas.SetTop(insertShape, e.GetPosition(board).Y);
        }
    }

    本来还想做个多边形的例子,水平有限,没达到我想要的效果。研究研究再发。

  • 相关阅读:
    MyBatis 处理sql中的 大于,小于,大于等于,小于等于
    以当前日期为时间轴 计算15 天的日期 和15 天后的日期
    java 常用时间操作类,计算到期提醒,N年后,N月后的日期
    用户号已经存在是否覆盖解决办
    List<bean> 转换成List<Map>
    feig中调用其他微服务接口无反应
    从实体类中取值 ,获取修改记录信息,保存修改记录信息
    java遍历实体类的属性和值
    从数据库将数据导出到excel表格
    树同构模板
  • 原文地址:https://www.cnblogs.com/jixin/p/4730170.html
Copyright © 2011-2022 走看看