WPF中GDI+图形图像的绘制:(七)绘制图像——鼠标拖动改变位置和大小

实现效果:

实现步骤:

1、首先定义拖拽改变类型枚举:

    /// <summary>
    /// 拖动改变类型
    /// </summary>
    public enum ChangeType
    {
        Move = 0,// 移动
        ChangeLeftTop = 1,//左上
        ChangeRightTop = 2,//右上
        ChangeRightBottom = 3,//右下
        ChangeLeftBottom = 4,//左下
        Other = 5//其他
    }

2、修改MyImage自定义控件

(1)添加全局变量:

        public ChangeType changeType;//变换类型
        private bool isEnter = false;//是否鼠标进入
        private bool isCanDragSize = false;//是否可以改变大小
        private Rect LTrect, LBrect, RTrect, RBrect;//左上、左下、右上、右下四个方向的矩形

(2)重绘时在图片四个角绘制四个小矩形表示可拖拽改变大小的四个方向:

        /// <summary>
        /// 重绘
        /// </summary>
        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);
            if (IsSelect)
            {
                try
                {
                    //绘制边框
                    Rect rect = new Rect(0, 0, this.Width, this.Height);
                    Pen p = new Pen(new SolidColorBrush(Colors.Red), 2);
                    p.DashStyle = DashStyles.Solid;
                    p.StartLineCap = PenLineCap.Triangle;
                    dc.DrawRectangle(Brushes.Transparent, p, rect);

                    //在4个角画出对应的表示方向的小方块
                    dc.DrawRectangle(new SolidColorBrush(Colors.Red), p, new Rect(0, 0, 5, 5));
                    dc.DrawRectangle(new SolidColorBrush(Colors.Red), p, new Rect(this.Width - 5, 0, 5, 5));
                    dc.DrawRectangle(new SolidColorBrush(Colors.Red), p, new Rect(0, this.Height - 5, 5, 5));
                    dc.DrawRectangle(new SolidColorBrush(Colors.Red), p, new Rect(this.Width - 5, this.Height - 5, 5, 5));
                }
                catch { }
            }
        }

(3)注册相关鼠标事件:

        public MyImage()
        {
            this.Stretch = Stretch.Fill;//需要设置Stretch属性,避免拖拽改变宽高时出现异常
            this.MouseLeftButtonDown += MyImage_MouseLeftButtonDown;
            this.MouseLeftButtonUp += MyImage_MouseLeftButtonUp;
            this.MouseEnter += MyImage_MouseEnter;
            this.MouseLeave += MyImage_MouseLeave;
            this.MouseMove += MyImage_MouseMove;
        }
        
        /// <summary>
        /// 鼠标按下
        /// </summary>
        private void MyImage_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            //获取当前坐标
            Point p = e.GetPosition(this);
            //获取四个方向的矩形
            GetESWNRect();
            //获取位置
            int x = (int)Canvas.GetLeft(this);
            int y = (int)Canvas.GetTop(this);

            isCanDragSize = true;
            //左上
            if (IsInThis(p.X, p.Y, LTrect))
            {
                this.Cursor = Cursors.SizeNWSE;
                changeType = ChangeType.ChangeLeftTop;
            }
            //右上
            else if (IsInThis(p.X, p.Y, RTrect))
            {
                this.Cursor = Cursors.SizeNESW;
                changeType = ChangeType.ChangeRightTop;
            }
            //左下
            else if (IsInThis(p.X, p.Y, LBrect))
            {
                this.Cursor = Cursors.SizeNESW;
                changeType = ChangeType.ChangeLeftBottom;
            }
            //右下
            else if (IsInThis(p.X, p.Y, RBrect))
            {
                this.Cursor = Cursors.SizeNWSE;
                changeType = ChangeType.ChangeRightBottom;
            }
            //中心
            else if (p.X > 5 && p.X < this.Width - 5 && p.Y > 5 && p.Y < this.Height - 5)
            {
                this.Cursor = Cursors.SizeAll;
                changeType = ChangeType.Move;
            }
        
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RunnerDNA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值