如何在单击其他控件时获取鼠标相对于窗体的X、Y位置?

6

目前,当我在表单上按下鼠标时,会在标签中显示x、y坐标。但是,当我在该标签上单击时,却无法接收到鼠标按下事件。但是,当我将代码放入标签的mousedown中时,它会根据标签的原点而不是整个表单给出坐标。

我的目标是能够在表单的任何位置检测到x、y坐标,即使它在标签或按钮上也可以。

提前感谢。


1
请为您的问题提供描述性标题。像“C# Winform Question”之类的标题没有提供任何意义。 - Anthony Pegram
5个回答

5
似乎有点取巧,但是……
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        foreach (Control c in this.Controls)
        {
            c.MouseDown += ShowMouseDown;    
        }

        this.MouseDown += (s, e) => { this.label1.Text = e.X + " " + e.Y; };

    }

    private void ShowMouseDown(object sender, MouseEventArgs e)
    {
        var x = e.X + ((Control)sender).Left;
        var y = e.Y + ((Control)sender).Top;

        this.label1.Text = x + " " + y;
    }
}

所以,这基本上是遍历每个控件,如复选框、标签和任何其他控件,然后 c.MouseDOwn += ShowMouseDown; 将 ShowMouseDown 方法放入 C.MouseDown 中。我不太理解这行代码的作用,this.MouseDown +=(s,e)=>{this.label1.Text = e.X +“ ”+ e.Y;} ; - RoR
我是C#的新手,抱歉。还有,什么是object sender?这是控件的名称吗?(Control)sender是什么意思?谢谢您的时间。 - RoR

3
protected override void OnMouseMove(MouseEventArgs mouseEv) 
{ 
    txtBoxX.Text = mouseEv.X.ToString(); 
    txtBoxY.Text = mouseEv.Y.ToString(); 
} 

这是用于onmousemove的内容。我需要点击鼠标按钮来捕获该特定x,y坐标。但还要能够在标签内单击并获取整个表单的x,y。 - RoR

3
您可以在窗体上的每个控件上使用this.PointToClient(Cursor.Position)获取位置。

2

我知道这是一段时间以前的事情,但我认为这可能会对某些人有所帮助。我认为解决这个问题的方法是递归:

public partial class Form1 : Form
{

public Form1()
{
    InitializeComponent();
    label1.MouseDown += MyMouseDown;
}

void MyMouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)//If it's left button that's the trigger
    {
        Control c = (Control)sender;
        if (c.Parent == null) return;//Has no more children, wrong condition?
        if(c.Parent != this)//We've reached top level
        {
            MyMouseDown(c.Parent, new MouseEventArgs(e.Button, 
                 e.Clicks, 
                 c.Parent.Location.X + e.X, 
                 c.Parent.Location.Y + e.Y, 
                 e.Delta));
            return;
         }
         //Do what shall be done here...
     }
}
}

2
您可以通过this.Location进行调整。
或者在窗体和每个控件上使用this.PointToClient(Cursor.Position)

不太确定您的意思,需要调整的是什么Location?我尝试使用Location e.Location.X.ToString(),但它给出的答案与e.X.ToString()完全相同。Location是什么? - RoR
抱歉,我的回答不够清晰。我想表达的是控件的位置(可以使用Left、Top)。在控件的MouseDown事件中,您可以使用this.Location.X + e.X获取相对于窗体的位置。第二种方法是,在窗体的MouseDown事件中使用this.PointToClient(Cursor.Position),并且对于每个控件,可以使用循环来附加事件处理程序,就像JP Alioto建议的那样。 - pinichi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接