C#实现限制鼠标在一个矩形或者圆形区域内工作

目录

前言

一、界面设计

二、关键技术

1.设置矩形限制区域

2.设置圆形限制区域

3.解除限制

4.效果展示


前言

正常情况下,鼠标的移动范围是整个屏幕,但有时需要鼠标在某一区域内移动,这个区域可以是矩形也可以是圆形,圆形会复杂一点。


一、界面设计

窗体中需要添加三个按钮,分别是设置圆形限制区域,设置矩形限制区域,解除限制,如下图所示:

二、关键技术

1.设置矩形限制区域

需要先在窗体中画一个矩形,利用Cursor.Clip函数把该区域设置为矩形限制区域。

代码如下:

        /// <summary>
        /// 设置矩形限制区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            Graphics gra = this.CreateGraphics();
            gra.Clear(this.BackColor);
            gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            Pen pen = new Pen(Color.Red);//画笔颜色                                
            gra.DrawRectangle(pen, 10, 10, 500, 400);//画矩形的方法
            Point p = this.PointToScreen(new Point(10, 10));//转换为屏幕坐标

            this.Cursor = new Cursor(Cursor.Current.Handle);//创建Cursor对象
            Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y);//设置鼠标位置
            Cursor.Clip = new Rectangle(p.X,p.Y, 500, 400);//设置鼠标的活动区域
        }

2.设置圆形限制区域

限制圆形区域需要自己添加限制逻辑,逻辑如下:

在鼠标移动时,需要判断当前位置坐标与圆心坐标之间的距离是否大于半径,如大于半径,则把鼠标坐标设为之前的坐标,反之,则记录当前的坐标。需要添加Form1_MouseMove事件。

代码如下:

        /// <summary>
        /// 圆的中心点
        /// </summary>
        Point PCircleCenter;
        /// <summary>
        /// 圆的半径
        /// </summary>
        int r = 200;
        /// <summary>
        /// 是否限制鼠标
        /// </summary>
        bool flag = false;
        /// <summary>
        /// 设置圆形限制区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Graphics gra = this.CreateGraphics();
            gra.Clear(this.BackColor);
            gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            Pen pen = new Pen(Color.Red);//画笔颜色                                
            gra.DrawEllipse(pen, 10, 10, r*2, r*2);//画椭圆的方法

            flag = true;//限制鼠标的标志位
            PCircleCenter = this.PointToScreen(new Point(10 + r, 10 + r));//把圆心坐标转换为屏幕坐标
            Cursor.Position = PCircleCenter;
        }
        /// <summary>
        /// 旧的鼠标坐标
        /// </summary>
        Point OldMousePosition;
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (flag)
            {
                Point PX = Control.MousePosition;//获取当前鼠标坐标
                double S = Math.Sqrt(Math.Pow(PX.X - PCircleCenter.X, 2) + Math.Pow(PX.Y - PCircleCenter.Y, 2));//计算当前坐标与圆心坐标之间的距离
                if (S > r)
                    Cursor.Position = OldMousePosition;
                else
                    OldMousePosition = PX;
            }
            else
            {

            }
        }

3.解除限制

代码如下:

        /// <summary>
        /// 解除鼠标活动区域的限制
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            flag = false;//限制鼠标标志位复位
            Screen[] screens = Screen.AllScreens;//获取显示的数组
            this.Cursor = new Cursor(Cursor.Current.Handle);//创建Cursor对象
            Cursor.Clip = screens[0].Bounds;//解除鼠标活动区域的限制

        }

4.效果展示


 

成功把鼠标限制在圆形或者矩形区域内。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,MVVM框架是一种用于构建WPF应用程序的设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和视图模型(ViewModel)。模型是应用程序的数据和业务逻辑,视图是用户界面,而视图模型是连接模型和视图的中介。 接下来,我们来实现鼠标操作画圆和旋转矩形的功能。首先,在视图模型中创建两个命令,一个用于画圆,一个用于旋转矩形。在命令的Execute方法中,我们可以通过鼠标事件获取到鼠标的位置,然后根据这个位置绘制圆或者矩形。 下面是一个简单的示例代码: ```csharp public class MainViewModel : INotifyPropertyChanged { public ICommand DrawCircleCommand { get; set; } public ICommand RotateRectangleCommand { get; set; } private Point _lastPosition; private ObservableCollection<Shape> _shapes = new ObservableCollection<Shape>(); public ObservableCollection<Shape> Shapes { get { return _shapes; } set { _shapes = value; OnPropertyChanged(nameof(Shapes)); } } public MainViewModel() { DrawCircleCommand = new RelayCommand(DrawCircle); RotateRectangleCommand = new RelayCommand(RotateRectangle); } private void DrawCircle(object obj) { var args = obj as MouseEventArgs; if (args != null) { var position = args.GetPosition(null); var radius = 50; var circle = new Ellipse { Width = radius, Height = radius, Fill = Brushes.Red }; Canvas.SetLeft(circle, position.X - radius / 2); Canvas.SetTop(circle, position.Y - radius / 2); Shapes.Add(circle); } } private void RotateRectangle(object obj) { var args = obj as MouseEventArgs; if (args != null) { var position = args.GetPosition(null); var width = 100; var height = 50; var rectangle = new Rectangle { Width = width, Height = height, Fill = Brushes.Green, RenderTransformOrigin = new Point(0.5, 0.5) }; Canvas.SetLeft(rectangle, position.X - width / 2); Canvas.SetTop(rectangle, position.Y - height / 2); var transform = new RotateTransform { Angle = 0 }; rectangle.RenderTransform = transform; Shapes.Add(rectangle); var animation = new DoubleAnimation { From = 0, To = 360, Duration = new Duration(TimeSpan.FromSeconds(5)), RepeatBehavior = RepeatBehavior.Forever }; transform.BeginAnimation(RotateTransform.AngleProperty, animation); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class RelayCommand : ICommand { private Action<object> _execute; private Func<object, bool> _canExecute; public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null) { _execute = execute; _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute == null || _canExecute(parameter); } public void Execute(object parameter) { _execute(parameter); } public event EventHandler CanExecuteChanged; public void RaiseCanExecuteChanged() { CanExecuteChanged?.Invoke(this, EventArgs.Empty); } } ``` 在这个示例代码中,我们创建了一个MainViewModel类,其中包含了两个命令DrawCircleCommand和RotateRectangleCommand,分别用于绘制圆和旋转矩形。当用户在画布上单击鼠标时,会触发对应的命令,并通过鼠标事件获取到鼠标位置,然后创建相应的形状并添加到Shapes集合中。可以通过绑定Shapes集合到画布上,将绘制的形状显示在界面上。 以上是一个简单的实现,具体的实现方式可以根据自己的需求进行调整和优化。希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值