C# 我想要一个在运行时使用.net通过拖动来选择区域的功能

C# 我想要一个在运行时使用.net通过拖动来选择区域的功能,c#,.net,vb.net,winforms,C#,.net,Vb.net,Winforms,我试图在.Net中编写代码以选择一个区域,该区域将位于表单中的任何位置,该区域不限于控件,通常在运行时使用鼠标在表单上拖动该区域,如果单击某个按钮进行保存,则该区域显示为方形,即。,保存所选区域,下次页面加载时,该特定区域应可单击。目前我不知道从何处开始,但如果给出一些想法,为该功能开发一些代码将对我更有帮助。是否有人对如何实现这一功能给出了一个小小的想法,以便我可以继续开发代码?无论您是使用WinForms还是WPF编程,您都可以捕获mouseup和mousedown事件,以及它们各自在屏幕上

我试图在.Net中编写代码以选择一个区域,该区域将位于表单中的任何位置,该区域不限于控件,通常在运行时使用鼠标在表单上拖动该区域,如果单击某个按钮进行保存,则该区域显示为方形,即。,保存所选区域,下次页面加载时,该特定区域应可单击。目前我不知道从何处开始,但如果给出一些想法,为该功能开发一些代码将对我更有帮助。是否有人对如何实现这一功能给出了一个小小的想法,以便我可以继续开发代码?

无论您是使用WinForms还是WPF编程,您都可以捕获mouseup和mousedown事件,以及它们各自在屏幕上的位置。 然后,您可以询问舞台上的每个元素是否有任何角位于鼠标上下点之间的矩形区域内。

这不是我的代码


您必须更加具体,但我可以猜,这将归结为在窗体上处理mousedown、mouseup和mousemove事件。是否要在拖动时显示一个框?它应该是什么样子?您想选择什么?只是一个区域,或一组控件、图形或网格单元等?不,没有其他。在绘画中,如果我们拖动某个区域,它将被选择为正方形,就像我在.net中的windows窗体中所做的一样,只是我正在尝试,但不知道从何处开始。WinForms?WPF?什么样的区域?它包含哪些您想要选择的内容?控制?你自己通过代码在表单上绘制的东西?这里没有足够的细节来回答这个问题。我曾经在CP讨论中遇到过一个选择区域作为矩形的代码,所以我想我可以与您分享。感谢您用代码@Karthik Ratnam回复,当然在尝试了这个之后,我会回复您。感谢dude,它非同寻常,代码运行良好。我已经测试过了。它对我来说会更有用。非常感谢。谢谢你的回复@Timothy Groote,让我试试你和@Karthik Ratnam的想法。很快,我会回复的。
  public partial class Form1 : Form
        {
            bool canResize;
            int mX, mY;
            Rectangle rect = new Rectangle();

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawRectangle(new Pen(Brushes.Purple, 2), rect);
            }

            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                canResize = true;
                mX = e.X; mY = e.Y;

                rect.Location = new Point(mX, mY);
            }

            private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                canResize = false;
            }

            private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                if (canResize)
                {
                    if (mX < e.X)
                    {
                        rect.X = mX;
                        rect.Width = e.X - mX;
                    }
                    else
                    {
                        rect.X = e.X;
                        rect.Width = mX - e.X;
                    }
                    if (mY < e.Y)
                    {
                        rect.Y = mY;
                        rect.Height = e.Y - mY;
                    }
                    else
                    {
                        rect.Y = e.Y;
                        rect.Height = mY - e.Y;
                    }
                    this.Invalidate();
                }
            }
        }